目录
四、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 中直接安装:
-
打开 IDEA,进入
File
→Settings
→Plugins
。 -
搜索
MybatisX
,点击Install
安装。 -
重启 IDEA 生效。
-
-
JetBrains 插件市场地址: MybatisX on JetBrains Marketplace
2. 手动下载(备用)
-
如果无法通过 IDEA 直接安装,可以从 JetBrains 插件市场下载
.jar
文件:-
访问上述链接,点击
Download
获取最新版本的.jar
。 -
在 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注解)