Mapper 就是“映射”的意思,Mapper 文件时 Mybatis 中的 SQL 语句的配置文件,其会在运行时加载 SQL 语句并映射相应参数。在 Mybatis 的全局配置文件中,其中最后一项就是 mapper 文件的资源路径的配置,因为创建 SqlSessionFactory 时会加载全局配置文件,这说明 Mapper 映射文件会在创建伊始就会被加载了。
一、映射文件标签
Mapper 映射文件,主要就是用来配置 SQL 映射语句的,根据不同的 SQL 语句性质,要使用不同的标签来包裹。
标签名称 | 标签作用 |
---|---|
insert | 用来映射插入语句 |
update | 用来映射更新语句 |
delete | 用来映射删除语句 |
select | 用来映射查询语句 |
resultMap | 自定义结果集映射 |
sql | 配置可以被其他语句引用的SQL语句块 |
cache | 命名空间的二级缓存设置 |
cache-ref | 其他命名空间缓存配置的引用 |
1.1 insert 标签
EmployeeMapper.xml
<insert id="addEmp">
insert into tbl_employee (id, last_name, email, gender)
values (#{id}, #{lastName}, #{email}, #{gender})
</insert>
接口 EmployeeMapper.java
package com.example.mapper;
import com.example.pojo.Employee;
import java.util.List;
public interface EmployeeMapper {
public boolean addEmp(Employee employee);
}
测试方法:
@Test
public void test04() throws IOException {
SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
SqlSession sqlSession = sqlSessionFactory.openSession();
try{
EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
Employee employee = new Employee();
employee.setLastName("zhangsan");
employee.setEmail("zhangsan@123.com");
employee.setGender("0");
boolean addEmp = mapper.addEmp(employee);
System.out.println(addEmp);
// 需手动提交
sqlSession.commit();
} finally {
sqlSession.close();
}
}
控制台结果:
[main] [com.example.mapper.EmployeeMapper.addEmp]-[DEBUG] ==> Preparing: insert into tbl_employee (id, last_name, email, gender) values (?, ?, ?, ?);
[main] [com.example.mapper.EmployeeMapper.addEmp]-[DEBUG] ==> Parameters: null, zhangsan(String), zhangsan@123.com(String), 0(String)
[main] [com.example.mapper.EmployeeMapper.addEmp]-[DEBUG] <== Updates: 1
true
1.2 update 标签
EmployeeMapper.xml
<update id="updateEmp">
update tbl_employee set
last_name=#{lastName},email=#{email},gender=#{gender}
where id=#{id}
</update>
接口 EmployeeMapper.java
package com.example.mapper;
import com.example.pojo.Employee;
import java.util.List;
public interface EmployeeMapper {
public Integer updateEmp(Employee employee);
}
测试方法:
@Test
public void test05() throws IOException {
SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
SqlSession sqlSession = sqlSessionFactory.openSession();
try{
EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
Employee employee = mapper.getEmpById(8);
employee.setLastName("lisi");
employee.setEmail("lisi@123.com");
employee.setGender("0");
Integer updateEmp = mapper.updateEmp(employee);
System.out.println(updateEmp);
sqlSession.commit();
} finally {
sqlSession.close();
}
}
控制台结果:
[main] [com.example.mapper.EmployeeMapper.getEmpById]-[DEBUG] ==> Preparing: select * from tbl_employee where id = ?
[main] [com.example.mapper.EmployeeMapper.getEmpById]-[DEBUG] ==> Parameters: 8(Integer)
[main] [com.example.mapper.EmployeeMapper.getEmpById]-[DEBUG] <== Total: 1
[main] [com.example.mapper.EmployeeMapper.updateEmp]-[DEBUG] ==> Preparing: update tbl_employee set last_name=?,email=?,gender=? where id=?
[main] [com.example.mapper.EmployeeMapper.updateEmp]-[DEBUG] ==> Parameters: lisi(String), lisi@123.com(String), 0(String), 8(Integer)
[main] [com.example.mapper.EmployeeMapper.updateEmp]-[DEBUG] <== Updates: 1
1
1.3 delete 标签
EmployeeMapper.xml
<delete id="deleteEmpById">
delete from tbl_employee where id = #{id}
</delete>
接口 EmployeeMapper.java
package com.example.mapper;
import com.example.pojo.Employee;
import java.util.List;
public interface EmployeeMapper {
public void deleteEmpById(Integer id);
}
测试方法:
@Test
public void test06() throws IOException {
SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
SqlSession sqlSession = sqlSessionFactory.openSession();
try{
EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
mapper.deleteEmpById(7);
sqlSession.commit();
} finally {
sqlSession.close();
}
}
控制台结果:
[main] [com.example.mapper.EmployeeMapper.deleteEmpById]-[DEBUG] ==> Preparing: delete from tbl_employee where id = ?
[main] [com.example.mapper.EmployeeMapper.deleteEmpById]-[DEBUG] ==> Parameters: 7(Integer)
[main] [com.example.mapper.EmployeeMapper.deleteEmpById]-[DEBUG] <== Updates: 1
1.4 select 标签
EmployeeMapper.xml
<select id="getEmpById" resultType="employee">
select * from tbl_employee where id = #{id}
</select>
接口 EmployeeMapper.java
package com.example.mapper;
import com.example.pojo.Employee;
import java.util.List;
public interface EmployeeMapper {
public Employee getEmpById(Integer id);
}
测试方法:
@Test
public void test03() throws IOException {
SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
SqlSession sqlSession = sqlSessionFactory.openSession();
try{
EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
Employee emp = mapper.getEmpById(1);
System.out.println(emp);
} finally {
sqlSession.close();
}
}
控制台结果:
[main] [com.example.mapper.EmployeeMapper.getEmpById]-[DEBUG] ==> Preparing: select * from tbl_employee where id = ?
[main] [com.example.mapper.EmployeeMapper.getEmpById]-[DEBUG] ==> Parameters: 1(Integer)
[main] [com.example.mapper.EmployeeMapper.getEmpById]-[DEBUG] <== Total: 1
Employee{id=1, lastName='tom', email='tom@123.com', gender='0'}
总结:
关于增删改:
- Mybatis 允许增删改直接定义以下类型返回值:Integer、Long、Boolean、void
- 需要手动提交数据 sqlSession.commit()。
sqlSessionFactory.open() 为手动提交
sqlSessionFactory.open(true) 为自动提交
二、标签属性含义
在insert、update、delete 及 select 配置标签中可以配置很多属性,具体可以配置的属性如下:
<select
id="selectEmployee"
parameterType="int"
resultType="hashmap"
resultMap="employeeResultMap"
flushCache="false"
useCache="true"
timeout="10000"
fetchSize="256"
statementType="PREPARED"
resultSetType="FORWARD_ONLY">
</select>
<insert id="insertEmployee"
parameterType="com.example.pojo.Employee"
flushCache="true"
statementType="PREPARED"
keyProperty=""
keyColumn=""
useGeneratedKeys="true"
timeout="20">
</insert>
<update id="updateEmployee"
parameterType="com.example.pojo.Employee"
flushCache="true"
statementType="PREPARED"
timeout="20">
</update>
<delete id="updateEmployee"
parameterType="com.example.pojo.Employee"
flushCache="true"
statementType="PREPARED"
timeout="20">
</delete>
每一个属性所代表的含义如下所示:
属性名 | 含义 | 所属标签 |
---|---|---|
id | SQL 映射配置的唯一标识,可以代表 SQL 配置 | select¦insert¦update¦delete |
parameterType | 可选属性,用来传入 SQL 配置中需要的参数类型的类名或别名 | select¦insert¦update¦delete |
resultType | 可选属性,用来配置 SQL 语句执行后期望得到的结果数据类型,配置的是结果类型的类名或别名。此属性不能与 resultMap 同时使用 | select |
resultMap | 用来引入外部结果集配置,该结果集配置对应 SQL 结果中的每个字段名称,即将映射到 Java 对象中的哪个属性。此属性不能与 resultType 同时使用 | select |
flushCache | 设置语句调用时,是否清空本地缓存和二级缓存,默认为false | select¦insert¦update¦delete |
useCache | 设置语句调用时,执行结果是否保存二级缓存,对 select 元素默认为 false | select |
timeout | 在抛出异常前,驱动程序等待数据库回应的最大秒数 | select¦insert¦update¦delete |
fetchSize | 设置驱动程序每次批量返回结果的行数 | select |
statementType | 设置 Mybatis 的 Statement 类型。可以配置为 STATEMENT、PREPARED 或 CALLABLE 中的一个,表示使用 Statement、PreparedStatement 或 CallableStatement 类型。默认配置为 PREPARED | select¦insert¦update¦delete |
resultSetType | 设置 Mybatis 的结果集类型。可以配置为 FORWARD_ONLY 、SCROLL_SENSITIVE 或 SCROLL_INSENSITIVE 中的一个。默认无配置 | select |
databaseId | 在配置 databaseIDProvider 的情况下,Mybatis 会加载所有不带 databaseId 或者匹配当前 databaseId 的语句 | select¦insert¦update¦delete |
resultSets | 当有多个结果集的时候使用,会为 SQL 执行后返回的每个结果集设定一个名称,以逗号分隔 | select |
useGeneratedKeys | 设置 Mybatis 使用 JDBC 的 getGeneratedKeys 方法来获取有数据库内部生成的主键(自增主键)。默认值为 false | insert¦update |
keyProperty | 代表主键。Mybatis 会将生成的主键赋给这个列。联合主键使用逗号隔开 | insert¦update |
keyColumn | 仅对特定数据库生效,当主键列不是表中的第一列时需要设置该属性。如果希望得到多个生成的列,也可以是以逗号分隔的属性名称列表 | insert¦update |