Mybatis-结果集映射&&关联查询&&分步查询&&懒加载

一、结果集映射
(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后,当使用对象中的任一方法,都会执行对应的分步查询。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值