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) 为自动提交