MyBatis04:SpringBoot整合MyBatis——多表关联|延迟加载|MyBatisX插件|SQL注解

目录

一、多表关联

1、数据库表结构

2、javaBean类

3、mapper接口

4、sqlMapper文件

5、测试

二、延迟加载

1、解决什么问题

2、嵌套查询

3、延迟加载

三、逆向工程MybatisX插件

1、下载插件

1. 通过 JetBrains 插件市场下载(推荐)

2. 手动下载(备用)

四、SQL注解(这个方法是MybatisX的方法,不使用sqlmapper文件映射,直接通过注解在java文件里面写sql语句,没有实现sql语句与java分离的初衷)


一、多表关联

1、数据库表结构

create table king(
     id int primary key auto_increment,
     name char(32)
);
​
create table queen(
    id int primary key auto_increment,
    name char(32),
    k_id int 
);
​
create table consort(
    id int primary key auto_increment,
    name char(32),
    k_id int 
);
​
insert into king(name) values ('拉玛十世'),('乾隆');
insert into queen(name,k_id) values ('苏提达',1),('富察氏',2);
insert into consort(name,k_id) values 
            ('诗妮娜1号',1),('诗妮娜2号',1),('令妃',2),('香妃',2);
            
select * from queen;        
select * from consort;      

2、javaBean类

@Data
public class King {
    private Integer id;
    private String name;
    //一对一映射
    private Queen queen;//王后对象
    //一对多映射
    private List<Consort> list;//妃子集合
}

3、mapper接口

@Mapper
public interface KingMapper {
    public List<King> getKings();
}

4、sqlMapper文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hl.mybatis03.mapper.KingMapper">
    <!--     public List<King> getKings();-->
    <select id="getKings" resultMap="map1">
        select king.*,
               queen.id as qid,queen.name as qname,queen.k_id,
               c.id as cid,c.name as cname,c.k_id as ck_id
        from king
        join queen on king.id = queen.k_id
        join consort c on king.id = c.k_id
    </select>
    <!--type="预期的最终返回值类型"  autoMapping="true"开启结果集自动映射-->
    <resultMap id="map1" type="King" autoMapping="true">
        <id property="id" column="id"></id>
        <!--手动结果集映射-->
<!--        <result property="name" column="name"></result>-->
        <!--一对一映射-->
        <association property="queen" javaType="Queen">
            <!--给Queen类的属性赋值-->
            <id property="id" column="qid"></id>
            <result property="name" column="qname"></result>
            <result property="kId" column="k_id"></result>
        </association>
        <!--一对多映射 autoMapping="true"自动映射  columnPrefix="c" 针对列名添加前缀-->
        <collection property="list" ofType="Consort" autoMapping="true" columnPrefix="c">
            <id property="id" column="id"></id>
<!--            <id property="id" column="cid"></id>-->
<!--            <result property="name" column="cname"></result>-->
<!--            <result property="kId" column="ck_id"></result>-->
        </collection>
    </resultMap>
</mapper>

5、测试

二、延迟加载

多张表相关联情况下

1、解决什么问题

延迟加载主要用于解决嵌套查询的效率问题。

只针对嵌套查询。

2、嵌套查询

一个查询调用另一个查询。通过王后查国王,再通过国王查妃子

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hl.mybatis03.mapper.QueenMapper">
        <!--public List<Queen> getQueens();-->
    <!--查询王后信息-->
    <select id="getQueens" resultMap="map1">
        select * from queen
    </select>
    <!--  fetchType="eager" 数据的抓取策略:立即加载 延迟加载
    -->
    <resultMap id="map1" type="Queen" autoMapping="true">
        <id property="id" column="id"></id>
        <association property="king" javaType="King"
                     fetchType="lazy"
                     select="findKing" column="k_id"></association>
        <collection property="list" ofType="Consort"
                    fetchType="lazy"
                    select="selectConsort" column="k_id"></collection>
    </resultMap>
    <!--根据王后表中的国王id,找到国王信息-->
    <select id="findKing" resultType="King">
        select * from king where id = #{id}
    </select>

    <!--根据国王id,找到妃子集合-->
    <select id="selectConsort" resultType="Consort">
        select * from consort where k_id = #{kId}
    </select>
</mapper>

3、延迟加载

当我们不需要另一个查询时,该查询先不执行。

当我们需要另一个查询的数据时,再执行该查询。

需要??:当我们访问这个关联属性时,进行查询;不访问关联属性时,不执行查询。

select="sql语句唯一标识" 嵌套查询

fetchType="eager" 立即加载

fetchType="lazy" 延迟加载,懒(延迟)加载要求所对应的类(javabean)以及相关类实现序列化接口Serializable 

@Data
@JsonIgnoreProperties({"handler", "hibernateLazyInitializer"})
public class Queen implements Serializable {
    private Integer id;
    private String name;
    private Integer kId;//国王id
​
    //一对一
    private King king;
    //间接  一对多
    private List<Consort> list;
}
@Mapper
public interface QueenMapper {
    public List<Queen> getQueens();
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hl.mybatis03.mapper.QueenMapper">
        <!--public List<Queen> getQueens();-->
    <!--查询王后信息-->
    <select id="getQueens" resultMap="map1">
        select * from queen
    </select>
    <!--  fetchType="eager" 数据的抓取策略:
                eager立即加载 
                lazy延迟加载 : 使用数据时查询(比如return返回时json序列化,或者debug模式看数据内容)
    -->
    <resultMap id="map1" type="Queen" autoMapping="true">
        <id property="id" column="id"></id>
        <association property="king" javaType="King"
                     fetchType="lazy"
                     select="findKing" column="k_id"></association>
        <collection property="list" ofType="Consort"
                    fetchType="lazy"
                    select="selectConsort" column="k_id"></collection>
    </resultMap>
    <!--根据王后表中的国王id,找到国王信息-->
    <select id="findKing" resultType="King">
        select * from king where id = #{id}
    </select>
​
    <!--根据国王id,找到妃子集合-->
    <select id="selectConsort" resultType="Consort">
        select * from consort where k_id = #{kId}
    </select>
</mapper>

三、逆向工程MybatisX插件

1、下载插件

下载和安装 MybatisX 的地址和方法:

1. 通过 JetBrains 插件市场下载(推荐)

  • 在 IntelliJ IDEA 中直接安装

    1. 打开 IDEA,进入 FileSettingsPlugins

    2. 搜索 MybatisX,点击 Install 安装。

    3. 重启 IDEA 生效。

  • JetBrains 插件市场地址MybatisX on JetBrains Marketplace

2. 手动下载(备用)

  • 如果无法通过 IDEA 直接安装,可以从 JetBrains 插件市场下载 .jar 文件:

    1. 访问上述链接,点击 Download 获取最新版本的 .jar

    2. 在 IDEA 的 Plugins 界面选择 Install Plugin from Disk,上传下载的 .jar 文件。

四、SQL注解(这个方法是MybatisX的方法,不使用sqlmapper文件映射,直接通过注解在java文件里面写sql语句,没有实现sql语句与java分离的初衷)

@Insert
@Options

@Update
@Delete
@Select

@Results
@Result
@One
@Many

package com.hl.mybatis03.mapper;

import com.hl.mybatis03.pojo.Consort;
import com.hl.mybatis03.pojo.King;
import org.apache.ibatis.annotations.*;

import java.util.List;
@Mapper
public interface ConsortMapper {
    @Select("select * from consort")
    public List<Consort> listAll();

    @Insert("insert into consort(name,k_id) values (#{name},#{kId})")
    //返回自增主键
    @Options(useGeneratedKeys = true,keyProperty = "id",keyColumn = "id")
    public int save(Consort consort);

    @Update("update consort set name=#{name},k_id=#{kId} where id=#{id}")
    public int update(@Param("id") Integer id, @Param("name") String name, @Param("kId") Integer kId);

    @Delete("delete from consort where id=#{id}")
    public int delete(Integer id);

    //关联妃子和王国
    @Select("select * from consort")
    @Results(value = {
            @Result(id = true,property = "id",column = "id"),
            @Result(property = "name",column = "name"),
            @Result(property = "king",javaType = King.class, column = "k_id",
                    one=@One(select = "com.hl.mybatis03.mapper.ConsortMapper.getKingById"))
    })
    public List<Consort> list();

    @Select("select * from king where id=#{id}")
    public King getKingById(Integer id);

}

作业

创建 用户类、角色类

用户表(id,username,phone,role_id)

zhangsan

lisi

角色表(id,name)

超级管理员

普通管理员

财务人员

市场人员

1)通过用户,查询当前用户信息和相关的角色信息

一对一

方式一:两张表join连接查询,相关数据(xml)

方式二:嵌套查询(xml、sql注解)

方式三:嵌套查询(sql注解)

2)通过角色,查询角色名和想的所有用户列表

一对多

方式一:两张表join连接查询,相关数据(xml)

方式二:嵌套查询(xml、sql注解)

方式三:嵌套查询(sql注解)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值