MyBatis【多表查询与动态SQL使用】
- 🍎一.MyBatis多表查询
- 🍒1.1 一对一查询
- 🍒1.2 一对多查询
- 🍎二.动态SQL使用
- 🍒2.1 if 标签使用
- 🍒2.2 trim 标签使用
- 🍒2.3 where 标签使用
- 🍒2.4 set 标签使用(增添)
- 🍒2.5 foreach 标签使用(集合进行遍历)
🍎一.MyBatis多表查询
我们在进行多表查询的时候,我们需要在数据库创建两个表(作者表,文章表)
<作者表 userinfo>:
<文章表 articleinfo>:
在项目中创建的对象:
在userinfo配置文件mybatis.xml配置信息
property&#61;"artlist"
resultMap&#61;"com.example.demo.mapper.ArticleMapper.BaseMap"
columnPrefix&#61;"a_">
在aricleinfo配置文件mybatis.xml配置信息
resultMap&#61;"com.example.demo.mapper.UserMapper.BaseMap"
columnPrefix&#61;"u_">
&#x1f352;1.1 一对一查询
创建一个ArticleMapper接口方法:
创建一个ArticleMapper接口对应 aricleinfo 和 userinfo 在maybatis.xml配置文件
ArticleMapper.xml 配置信息:
UserMapper.xml 配置信息:
配置文件多表查询语句
这是我们在MySQL进行多表一对一查询执行语句
我们发现这两个表都有一个相同的id名称属性,这会使在查询时前面id的值会将后面id的值进行覆盖,
所有我们需要将对被联合查询表进行重命名
在进行单元测试代码:
测试结果:
&#x1f352;1.2 一对多查询
UserMapper接口代码:
//查询用户及用户发表的所有文章,根据用户uid
public UserInfo getUserAndArticleByUid(&#64;Param("uid") Integer uid);
UserMapper.xml代码:
单元测试代码:
&#64;Test
void getUserAndArticleByUid() {
UserInfo userInfo &#61; userMapper.getUserAndArticleByUid(1);
log.info("用户文章详细"&#43;userInfo);
}
单元测试结果:
&#x1f34e;二.动态SQL使用
动态 sql 是Mybatis的强⼤特性之⼀&#xff0c;能够完成不同条件下不同的 sql 拼接
可以参考官⽅⽂档&#xff1a;官⽅⽂档
&#x1f352;2.1 if 标签使用
在注册⽤户的时候&#xff0c;可能会有这样⼀个问题&#xff0c;就是有必选和非必选是,当我们使用传统的SQL语句就会很繁琐,需要大量代码来实现,这时我们就可以使用动态SQL来进行筛选用户所填的非必选信息
insert into userinfo(username,password
,photo
) values(#{username},#{password}
,#{photo}
)
我们在单元测试中假设我们没有填写photo属性信息:
结果:
我们看到并没有实现photo属性信息填写,解决了非必要填写信息的选择语句繁琐的难题
当我们填写photo信息时:
&#x1f352;2.2 trim 标签使用
标签结合
标签&#xff0c;对多个字段都采取动态⽣成的⽅式
标签中有如下属性&#xff1a;
● prefix&#xff1a;表示整个语句块&#xff0c;以prefix的值作为前缀
● suffix&#xff1a;表示整个语句块&#xff0c;以suffix的值作为后缀
● prefixOverrides&#xff1a;表示整个语句块要去除掉的前缀
● suffixOverrides&#xff1a;表示整个语句块要去除掉的后缀
insert into userinfo
username,
password,
photo
values
#{username},
#{password},
#{photo}
&#x1f352;2.3 where 标签使用
where属性没有输入就默认时全局查找了
传⼊的⽤户对象&#xff0c;根据属性做 where 条件查询&#xff0c;⽤户对象中属性不为 null 的&#xff0c;都为查询条件
如user.username 为 “a”&#xff0c;则查询条件为 where username&#61;“a”&#xff1a;
以上
标签也可以使⽤
替换
&#x1f352;2.4 set 标签使用(增添)
根据传⼊的⽤户对象属性来更新⽤户数据&#xff0c;可以使⽤
标签来指定动态内容
update userinfo
username&#61;#{username},
password&#61;#{password},
photo&#61;#{photo},
where id&#61;#{id}
以上
标签也可以使⽤
替换
&#x1f352;2.5 foreach 标签使用(集合进行遍历)
// 删除方法{根据id删除这一条数据
public int del2(&#64;Param("ids") List ids);
delete from userinfo where id in
#{id}
测试单元代码:
测试单元结果: