10 KiB
第七章:MyBatis核心配置
7.1 核心对象
1.复制第6章的代码
(1)导包 mybatis mysql
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
(2)准备数据
沿用上一章节数据
(3)复制实体类
package com.gzh.po;
public class Customer {
private int id;
private String username;
private String jobs;
private String phone;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getJobs() {
return jobs;
}
public void setJobs(String jobs) {
this.jobs = jobs;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
@Override
public String toString() {
return "Customer{" +
"id=" + id +
", username='" + username + '\'' +
", jobs='" + jobs + '\'' +
", phone='" + phone + '\'' +
'}';
}
}
(4)复制两个xml文件
mybatis-config.xml:
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd" >
<configuration>
<!--1.连接数据库-->
<environments default="mysql">
<environment id="mysql">
<transactionManager type="JDBC"></transactionManager>
<!--
transactionManager:设置事务管理方式
属性:
type:设置事务管理方式,type="JDBC|MANAGED"
type="JDBC":设置当前环境的事务管理都必须手动处理
type="MANAGED":设置事务被管理,例如spring中的AOP
-->
<dataSource type="POOLED">
<!--
dataSource:设置数据源
属性:
type:设置数据源的类型,type="POOLED|UNPOOLED|JNDI"
type="POOLED":使用数据库连接池,即会将创建的连接进行缓存,下次使用可以从缓存中直接获取,不需要重新创建
type="UNPOOLED":不使用数据库连接池,即每次使用连接都需要重新创建
type="JNDI":调用上下文中的数据源
-->
<!--四个成员变量不能错-->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="8520"/>
</dataSource>
</environment>
</environments>
<!--2.加载Mapper文件-->
<mappers>
<!--
以包为单位,将包下所有的映射文件引入核心配置文件
注意:
1. 此方式必须保证mapper接口和mapper映射文件必须在相同的包下
2. mapper接口要和mapper映射文件的名字一致
-->
<!--resource 从 copy path(复制路径/引用)中 file name(文件名)-->
<mapper resource="CustomerMapper.xml"/>
</mappers>
</configuration>
CustomerMapper.xml:
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<!-- namespace属性的值:copy path 中 file name(复制引用中的文件名),去掉.xml-->
<mapper namespace="CustomerMapper">
<!-- 1.根据id查询客户信息-->
<select id="findCustomerById" parameterType="int" resultType="com.gzh.po.Customer">
select * from t_customer where id=#{id}
</select>
<!-- 2.根据客户名进项模糊搜索-->
<select id="findCustomerByName" parameterType="String" resultType="com.gzh.po.Customer">
select * from t_customer where username like '%${value}%'
</select>
<!-- 3.添加客户-->
<insert id="addCustomer" parameterType="com.gzh.po.Customer">
insert into t_customer values (#{id},#{username},#{jobs},#{phone})
</insert>
<!-- 4.更新客户-->
<update id="updateCustomer" parameterType="com.gzh.po.Customer">
update t_customer set username = #{username},jobs = #{jobs},phone = #{phone} where id = #{id}
</update>
<!-- 5.删除客户-->
<delete id="deleteCustomer" parameterType="int">
delete from t_customer where id = #{id}
</delete>
</mapper>
(5)测试类
package com.gzh.po;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class MybatisTest {
InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
public MybatisTest() throws IOException {
}
@Test
public void findCustomerById() {
Customer o = sqlSession.selectOne("CustomerMapper.findCustomerById", 2);
System.out.println(o);
}
运行结果如下:
2.创建工具类,对外提供SqlSession对象
在 main 下创建一个新的包 com.gzh.utils (通常为工具包),并创建类 MyBatisUtil
package com.gzh;
import com.gzh.po.Customer;
import com.gzh.utils.MyBatisUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
public class MyBatisTest {
SqlSession sqlSession=MyBatisUtil.getSession();
@Test
public void findCustomerByIdTest(){
Customer o = sqlSession.selectOne("CustomerMapper.findCustomerById", 2);
System.out.println(o);
}
}
将 Test 测试类转移到 com.gzh 包下,代码如下:
public class MyBatisTest {
SqlSession sqlSession=MyBatisUtil.getSession();
@Test
public void findCustomerByIdTest(){
Customer o = sqlSession.selectOne("CustomerMapper.findCustomerById", 2);
System.out.println(o);
}
}
运行截图:
7.2 配置文件
1.properties 元素
连接数据库,通过该元素进行内部配置外在化。
(1) 在resources下创建db.properties
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.username=root
jdbc.password=8520
(2) 修改配置文件 2处
1.在文件下添加
<properties resource="db.properties"/>
2.在标签中的 value 属性修改如下:
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
(3)测试运行截图
2.typeAliases元素 给实体类起别名
(1)修改CustomerMapper.xml中的:(修改resultType属性)
<select id="findCustomerById" parameterType="int" resultType="customer">
select * from t_customer where id=#{id}
</select>
(2)在mybatis-config.xml文件中起别名(添加)
<properties resource="db.properties"/>
<typeAliases>
<typeAlias type="com.wqx.po.Customer" alias="customer"/>
</typeAliases>
(3)测试截图如下:
7.3 映射文件
1.resultMap元素:将表中字段和实体类成员变量进行对应
(1)修改实体类 username->name
重写getter and setter 以及 toString()
(2)测试结果:当实体类中的成员变量名和表中字段名字不一致时,导致字段值不能被赋值给成员变量
Customer{id=2, name='null', jobs='teacher', phone='13521210112'}
(3)如何解决当实体类中的成员变量名和表中字段名字不一致时,还可以将字段值赋值给成员变量?
resultMap
(4)修改CustomerMapper.xml
添加 resultMap 和 修改 select 中主键的 resultType 属性改为 resultMap
<resultMap id="a" type="customer">
<id property="id" column="id"/>
<result property="name" column="username"/>
<result property="jobs" column="jobs"/>
<result property="phone" column="phone"/>
</resultMap>
<select id="findCustomerById" parameterType="int" resultMap="a">
select * from t_customer where id=#{id}
</select>
---如何将sql语句显示到控制台?
(1)log4j.properties
#Global logging configuration
log4j.rootLogger=ERROR,stdout
#MyBatis logging configuration...
log4j.logger.com=DEBUG
#Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t]-%m%n
(2)导包
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
(3)resources 下 创建com,把CustomerMapper.xml文件移动到com下
(4)修改两个xml文件
CustomerMapper.xml
namespace="com.CustomerMapper"
mybatis-config.xml
resource="com/CustomerMapper.xml"
(5)修改测试方法
Customer o = sqlSession.selectOne("com.CustomerMapper.findCustomerById", 2);
(6)运行截图