一、结果集映射
(1)Mapper文件
<?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">
<mapper namespace="com.wsh.mapper.UserMapper">
<resultMap id="UserResult" type="User">
<id property="id" column="id"/>
<result property="lastName" column="last_name"/>
<result property="password" column="password"/>
</resultMap>
<select id="selectUserList" resultMap="UserResult">
select * from user
</select>
</mapper>
(2)接口文件
public interface UserMapper {
public List<User> selectUserList();
}
(3)JAVA程序
public void test() throws IOException {
//读取配置文件创建SqlSession工厂
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//利用SqlSession工厂创建SqlSession实例
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
//利用SqlSession创建代理对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> users = mapper.selectUserList();
for (User user : users) {
System.out.println(user.toString());
/*
User{id=1, lastName='a', password='123'}
User{id=2, lastName='b', password='123'}
User{id=3, lastName='c', password='123'}
*/
}
}finally {
sqlSession.close();
}
}
二、关联查询
(1)数据表准备
department
create table department(
id bigint AUTO_INCREMENT,
name varchar(20),
primary key(id)
)engine = innodb default charset = utf8
insert into department (name) values ('研发部');
insert into department (name) values ('产品部');
insert into department (name) values ('运维部');
employee
create table employee(
id bigint AUTO_INCREMENT,
name varchar(20),
dept_id int,
primary key(id)
)engine = innodb default charset = utf8
insert into employee (name, dept_id) values ('张三', 1);
insert into employee (name, dept_id) values ('李四', 1);
insert into employee (name, dept_id) values ('王五', 1);
insert into employee (name, dept_id) values ('赵六', 2);
insert into employee (name, dept_id) values ('威爷', 3);
(2)Maven添加依赖Lombok
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
</dependency>
(3)实体类
Department
@Data
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class Department {
private Long id;
private String name;
private List<Employee> employees;
}
Employee
@Data
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class Employee {
private Long id;
private String name;
private Long deptId;
private Department department;
}
(4)Mapper文件
<?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">
<mapper namespace="com.wsh.mapper.UserMapper">
<resultMap id="EmployeeResult" type="Employee">
<id property="id" column="e_id"/>
<result property="name" column="e_name"/>
<result property="deptId" column="dept_id"/>
<association property="department" javaType="Department">
<id property="id" column="d_id"/>
<result property="name" column="d_name"/>
</association>
</resultMap>
<resultMap id="DepartmentResult" type="Department">
<id property="id" column="d_id"/>
<result property="name" column="d_name"/>
<collection property="employees" ofType="Employee">
<id property="id" column="e_id"/>
<result property="name" column="e_name"/>
<result property="deptId" column="dept_id"/>
</collection>
</resultMap>
<select id="selectEmployeeList" resultMap="EmployeeResult">
select
e.id e_id, e.name e_name, e.dept_id, d.id d_id, d.name d_name
from employee e
left join department d on e.dept_id = d.id
</select>
<select id="selectDepartmentList" resultMap="DepartmentResult">
select
e.id e_id, e.name e_name, e.dept_id, d.id d_id, d.name d_name
from department d
left join employee e on d.id = e.dept_id
</select>
</mapper>
(5)接口文件
public interface UserMapper {
public List<Employee> selectEmployeeList();
public List<Department> selectDepartmentList();
}
(6)JAVA程序
public void test() throws IOException {
//读取配置文件创建SqlSession工厂
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//利用SqlSession工厂创建SqlSession实例
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
//利用SqlSession创建代理对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<Employee> employees = mapper.selectEmployeeList();
for (Employee employee : employees) {
System.out.println(employee.toString());
/*
Employee(id=1, name=张三, deptId=1, department=Department(id=1, name=研发部, employees=null))
Employee(id=2, name=李四, deptId=1, department=Department(id=1, name=研发部, employees=null))
Employee(id=3, name=王五, deptId=1, department=Department(id=1, name=研发部, employees=null))
Employee(id=4, name=赵六, deptId=2, department=Department(id=2, name=产品部, employees=null))
Employee(id=5, name=威爷, deptId=3, department=Department(id=3, name=运维部, employees=null))
*/
}
List<Department> departments = mapper.selectDepartmentList();
for (Department department : departments) {
System.out.println(department);
/*
Department(id=1, name=研发部, employees=[Employee(id=1, name=张三, deptId=1, department=null), Employee(id=2, name=李四, deptId=1, department=null), Employee(id=3, name=王五, deptId=1, department=null)])
Department(id=2, name=产品部, employees=[Employee(id=4, name=赵六, deptId=2, department=null)])
Department(id=3, name=运维部, employees=[Employee(id=5, name=威爷, deptId=3, department=null)])
*/
}
}finally {
sqlSession.close();
}
}
二、分步查询association
(1)Mapper文件
<?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">
<mapper namespace="com.wsh.mapper.UserMapper">
<resultMap id="EmployeeResult" type="Employee">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="deptId" column="dept_id"/>
<association property="department" select="selectDepartmentById" column="dept_id">
</association>
</resultMap>
<resultMap id="DepartmentResult" type="Department">
<id property="id" column="id"/>
<result property="name" column="name"/>
</resultMap>
<select id="selectEmployeeList" resultMap="EmployeeResult">
select * from employee
</select>
<select id="selectDepartmentById" parameterType="Long" resultMap="DepartmentResult">
select * from department where id = #{id}
</select>
</mapper>
(2)接口文件
public interface UserMapper {
public List<Employee> selectEmployeeList();
public Department selectDepartmentById(Long id);
}
(3)JAVA文件
public void test() throws IOException {
//读取配置文件创建SqlSession工厂
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//利用SqlSession工厂创建SqlSession实例
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
//利用SqlSession创建代理对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<Employee> employees = mapper.selectEmployeeList();
for (Employee employee : employees) {
System.out.println(employee.toString());
/*
Employee(id=1, name=张三, deptId=1, department=Department(id=1, name=研发部, employees=null))
Employee(id=2, name=李四, deptId=1, department=Department(id=1, name=研发部, employees=null))
Employee(id=3, name=王五, deptId=1, department=Department(id=1, name=研发部, employees=null))
Employee(id=4, name=赵六, deptId=2, department=Department(id=2, name=产品部, employees=null))
Employee(id=5, name=威爷, deptId=3, department=Department(id=3, name=运维部, employees=null))
*/
}
}finally {
sqlSession.close();
}
}
注:分步查询中的association仅是说明用哪个查询(select)及给查询传递哪个参数(column),最后将查询到的结果放在该属性(property)
三、分步查询collection
(1)Mapper文件
<?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">
<mapper namespace="com.wsh.mapper.UserMapper">
<resultMap id="DepartmentResult" type="Department">
<id property="id" column="id"/>
<result property="name" column="name"/>
<collection property="employees" select="selectEmployeeByDeptId" column="id">
</collection>
</resultMap>
<resultMap id="EmployeeResult" type="Employee">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="deptId" column="dept_id"/>
</resultMap>
<select id="selectDepartmentList" resultMap="DepartmentResult">
select * from department
</select>
<select id="selectEmployeeByDeptId" parameterType="Long" resultMap="EmployeeResult">
select * from employee where dept_id = #{id}
</select>
</mapper>
(2)接口文件
public interface UserMapper {
public List<Department> selectDepartmentList();
public List<Employee> selectEmployeeByDeptId(Long id);
}
(3)JAVA文件
public void test() throws IOException {
//读取配置文件创建SqlSession工厂
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//利用SqlSession工厂创建SqlSession实例
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
//利用SqlSession创建代理对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<Department> departments = mapper.selectDepartmentList();
for (Department department : departments) {
System.out.println(department.toString());
/*
Department(id=1, name=研发部, employees=[Employee(id=1, name=张三, deptId=1, department=null), Employee(id=2, name=李四, deptId=1, department=null), Employee(id=3, name=王五, deptId=1, department=null)])
Department(id=2, name=产品部, employees=[Employee(id=4, name=赵六, deptId=2, department=null)])
Department(id=3, name=运维部, employees=[Employee(id=5, name=威爷, deptId=3, department=null)])
*/
}
}finally {
sqlSession.close();
}
}
注:分步查询中的collection仅是说明用哪个查询(select)及给查询传递哪个参数(column),最后将查询到的结果放在该属性(property)
四、懒加载
(1)Maven添加log4j依赖
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
(2)创建log4j.properties
log4j.rootLogger=DEBUG,Console
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
log4j.logger.org.apache=INFO
(3)Mybatis配置文件添加设置
<settings>
<setting name="logImpl" value="LOG4J"/>
<setting name="lazyLoadingEnabled" value="true"/>
</settings>
(4)JAVA程序
@Test
public void test() throws IOException {
//读取配置文件创建SqlSession工厂
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//利用SqlSession工厂创建SqlSession实例
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
//利用SqlSession创建代理对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<Department> departments = mapper.selectDepartmentList();
boolean flag = false;
for (Department department : departments) {
System.out.println(department.getId() + " " + department.getName());
if (!flag){
System.out.println(department.getEmployees());
flag = true;
}
}
}finally {
sqlSession.close();
}
}
输出
2022-04-05 03:53:57,278 [main] DEBUG [com.wsh.mapper.UserMapper.selectDepartmentList] - ==> Preparing: select * from department
2022-04-05 03:53:57,302 [main] DEBUG [com.wsh.mapper.UserMapper.selectDepartmentList] - ==> Parameters:
2022-04-05 03:53:57,357 [main] DEBUG [com.wsh.mapper.UserMapper.selectDepartmentList] - <== Total: 3
1 研发部
2022-04-05 03:53:57,358 [main] DEBUG [com.wsh.mapper.UserMapper.selectEmployeeByDeptId] - ==> Preparing: select * from employee where dept_id = ?
2022-04-05 03:53:57,358 [main] DEBUG [com.wsh.mapper.UserMapper.selectEmployeeByDeptId] - ==> Parameters: 1(Long)
2022-04-05 03:53:57,360 [main] DEBUG [com.wsh.mapper.UserMapper.selectEmployeeByDeptId] - <== Total: 3
[Employee(id=1, name=张三, deptId=1, department=null), Employee(id=2, name=李四, deptId=1, department=null), Employee(id=3, name=王五, deptId=1, department=null)]
2 产品部
3 运维部
分析:开启懒加载后,当使用要执行分步查询后才能得到的数据,才执行发布查询获取该数据。
(5)当开启aggressiveLazyLoading
给Department实体类增加方法
@Data
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class Department {
private Long id;
private String name;
private List<Employee> employees;
public void die(){
System.out.println("die");
}
}
<settings>
<setting name="logImpl" value="LOG4J"/>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="true"/>
</settings>
public void test() throws IOException {
//读取配置文件创建SqlSession工厂
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//利用SqlSession工厂创建SqlSession实例
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
//利用SqlSession创建代理对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<Department> departments = mapper.selectDepartmentList();
departments.get(0).die();
}finally {
sqlSession.close();
}
}
输出
2022-04-05 04:14:14,765 [main] DEBUG [com.wsh.mapper.UserMapper.selectDepartmentList] - ==> Preparing: select * from department
2022-04-05 04:14:14,792 [main] DEBUG [com.wsh.mapper.UserMapper.selectDepartmentList] - ==> Parameters:
2022-04-05 04:14:14,841 [main] DEBUG [com.wsh.mapper.UserMapper.selectDepartmentList] - <== Total: 3
2022-04-05 04:14:14,841 [main] DEBUG [com.wsh.mapper.UserMapper.selectEmployeeByDeptId] - ==> Preparing: select * from employee where dept_id = ?
2022-04-05 04:14:14,841 [main] DEBUG [com.wsh.mapper.UserMapper.selectEmployeeByDeptId] - ==> Parameters: 1(Long)
2022-04-05 04:14:14,843 [main] DEBUG [com.wsh.mapper.UserMapper.selectEmployeeByDeptId] - <== Total: 3
die
分析:开启aggressiveLazyLoading后,当使用对象中的任一方法,都会执行对应的分步查询。