Mybatis快速入门--映射文件(五)(优化版)

简介: Mybatis快速入门--映射文件(五)(优化版)

collection


==collection定义关联集合类型的属性的封装规则==

ofType:指定集合里面元素的类型

collection一般用于封装一个实体类中有个属性是一个的值的集合这种类型

一、实体类

@Data
@ToString
public class Dept {
    private Integer id;
    private String departName;
    private List<Account> accounts;
}
@Data
@ToString
public class Account {
    private Integer id;
    private String name;
    private String money;
    private Integer dId;
}

二、Mapper接口

public interface DepartMapper {
    Dept getDeptList(Integer id);
}

三、映射文件

<?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.caq.study.mapper.DepartMapper">
    <resultMap id="getDeptListResultMap" type="com.caq.study.entity.Dept">
        <id column="id" property="id"></id>
        <result column="dept_name" property="departName"></result>
        <collection property="accounts" ofType="com.caq.study.entity.Account">
            <id column="id" property="id"/>
            <result column="name" property="name"/>
            <result column="money" property="money"/>
            <result column="d_id" property="dId"/>
        </collection>
    </resultMap>
    <select id="getDeptList" resultMap="getDeptListResultMap">
        SELECT
            depart.`id`,
            depart.`dept_name`,
            account.`id`,
            account.`name`,
            account.`money`,
            account.`d_id`
        FROM
            `depart`
                LEFT JOIN `account` ON account.d_id = depart.id
        WHERE
            depart.id = #{id}
    </select>
</mapper>


分步查询


分步查询的思路很简单,如下:

SELECT * FROM depart where id = 1
SELECT * FROM account WHERE d_id=1

先根据id查询depart表信息,再根据第一步查询查出来的id

当做第二个的限制条件查询account表

一、mapper接口

第一个要查的接口

Dept stepCollection(Integer id);

第二个要查的接口

Account selectById(Integer id);

二、映射文件

第一个要查的接口映射文件

select标签指定分步查询的mapper接口

column标签指定第一步查询出来的列的值作为限制条件

<?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.caq.study.mapper.DepartMapper">
    <resultMap id="stepCollectionResultMap" type="com.caq.study.entity.Dept">
        <id column="id" property="id"></id>
        <result column="dept_name" property="departName"></result>
        <collection property="accounts"
                    select="com.caq.study.mapper.AccountMapper.selectById"
                    column="id">
        </collection>
    </resultMap>
    <select id="stepCollection" resultMap="stepCollectionResultMap">
        SELECT * FROM depart where id = #{id}
    </select>
</mapper>

第二个要查的接口映射文件

<select id="selectById" resultType="com.caq.study.entity.Account">
    SELECT * FROM account WHERE d_id=#{id}
</select>


多列值传递


将多列的值封装map传递 column="{key1=column1,key2=column2}"

==这里的key1是第二步需要的参数,column1是第二步查询需要的参数对应的列==

image.png

image.png


延迟加载


==fetchType="lazy“:表示使用延迟加载==

直接用fetchType指定即可,lazy开启,eager为关闭,默认是开启

image.png

image.png


discriminator鉴别器


有时候,一个数据库查询可能会返回多个不同的结果集(但总体上还是有一定的联系的)。 鉴别器(discriminator)元素就是被设计来应对这种情况的,另外也能处理其它情况,例如类的继承层次结构。 鉴别器的概念很好理解——它很像 Java 语言中的 switch 语句。

column指定判定的列名,javaType列值对应的java类型

男生,如果是男生,把last_name这一列的值赋给email,女生则查询出所在部门信息

javaType列值对应的java类型


<resultMap id="MyEmpDis" type="com.caq.mybatis.bean.Employee">
    <id column="id" property="id"/>
    <result column="last_name" property="lastName"/>
    <result column="email" property="email"/>
    <result column="gender" property="gender"/>
    <!--        column指定判定的列名,javaType列值对应的java类型-->
    <discriminator javaType="string" column="gender">
        <!--            女生-->
        <case value="0" resultType="com.caq.mybatis.bean.Employee">
            <association property="dept"
                         select="com.caq.mybatis.dao.DepartmentMapper.getDeptById"
                         column="d_id">
            </association>
        </case>
        <!--            男生,如果是男生,把last_name这一列的值赋给email-->
        <case value="1" resultType="com.caq.mybatis.bean.Employee">
            <id column="id" property="id"/>
            <result column="last_name" property="lastName"/>
            <result column="last_name" property="email"/>
            <result column="gender" property="gender"/>
        </case>
    </discriminator>
</resultMap>
<select id="getEmpByIdStep" resultMap="MyEmpDis">
    SELECT * FROM tbl_employee WHERE id = #{id};
</select>

这个很好理解的,我还是把测试结果写出来

//    根据id分布查员工信息
@Test
public void test03() throws IOException {
    SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
    SqlSession openSession = sqlSessionFactory.openSession();  
    try {
        EmployeeMapperPlus mapper = openSession.getMapper(EmployeeMapperPlus.class);  
        Employee empByIdStep = mapper.getEmpByIdStep(4);      
        System.out.println(empByIdStep);
        System.out.println(empByIdStep.getDept());
    } finally {
        openSession.close();
    }
}

我们查询id为4的员工,根据我们前面写的sql映射文件,如果它的性别是男则他的邮件地址就是它的姓名,如果他的性别是女那么就能打印出她的部门信息(查部门信息又是一个新的对象我们用的association分步查询)

image.png

显示结果分别如下:

Employee{id=4, lastName='jerry2', email='jerry2', gender='1'} null

Employee{id=1, lastName='tom', email='tom@caq.com', gender='0'} Department{id=1, departmentName='开发'}



相关文章
|
4天前
|
SQL 缓存 Java
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
本文详细介绍了MyBatis的各种常见用法MyBatis多级缓存、逆向工程、分页插件 包括获取参数值和结果的各种情况、自定义映射resultMap、动态SQL
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
|
10天前
|
SQL Java 数据库连接
MyBatis-Plus快速入门:从安装到第一个Demo
本文将带你从零开始,快速入门 MyBatis-Plus。我们将首先介绍如何安装和配置 MyBatis-Plus,然后通过一个简单的示例演示如何使用它进行数据操作。无论你是 MyBatis 的新手还是希望提升开发效率的老手,本文都将为你提供清晰的指导和实用的技巧。
68 0
MyBatis-Plus快速入门:从安装到第一个Demo
|
2月前
|
SQL XML Java
mybatis复习04高级查询 一对多,多对一的映射处理,collection和association标签的使用
文章介绍了MyBatis中高级查询的一对多和多对一映射处理,包括创建数据库表、抽象对应的实体类、使用resultMap中的association和collection标签进行映射处理,以及如何实现级联查询和分步查询。此外,还补充了延迟加载的设置和用法。
mybatis复习04高级查询 一对多,多对一的映射处理,collection和association标签的使用
|
2月前
|
SQL XML Java
mybatis :sqlmapconfig.xml配置 ++++Mapper XML 文件(sql/insert/delete/update/select)(增删改查)用法
当然,这些仅是MyBatis功能的初步介绍。MyBatis还提供了高级特性,如动态SQL、类型处理器、插件等,可以进一步提供对数据库交互的强大支持和灵活性。希望上述内容对您理解MyBatis的基本操作有所帮助。在实际使用中,您可能还需要根据具体的业务要求调整和优化SQL语句和配置。
44 1
|
4月前
|
SQL Java 数据库连接
idea中配置mybatis 映射文件模版及 mybatis plus 自定义sql
idea中配置mybatis 映射文件模版及 mybatis plus 自定义sql
87 3
|
4月前
|
SQL 缓存 Java
使用MyBatis优化Java持久层操作
使用MyBatis优化Java持久层操作
|
5月前
|
SQL XML Java
后端数据库开发JDBC编程Mybatis之用基于XML文件的方式映射SQL语句实操
后端数据库开发JDBC编程Mybatis之用基于XML文件的方式映射SQL语句实操
70 3
|
4月前
|
SQL 缓存 Java
使用MyBatis优化Java持久层操作
使用MyBatis优化Java持久层操作
若依修改,集成mybatisplus报错,若依集成mybatisplus,总是找不到映射是怎么回事只要是用mp的方法就找报,改成mybatisPlus配置一定要改
若依修改,集成mybatisplus报错,若依集成mybatisplus,总是找不到映射是怎么回事只要是用mp的方法就找报,改成mybatisPlus配置一定要改
|
4月前
|
XML Java 数据格式
支付系统----微信支付20---创建案例项目--集成Mybatis-plus的补充,target下只有接口的编译文件,xml文件了,添加日志的写法
支付系统----微信支付20---创建案例项目--集成Mybatis-plus的补充,target下只有接口的编译文件,xml文件了,添加日志的写法