MyBatis---多表查询,动态sql的详细介绍

目录

1.命名规则

1.resultMap(对应类属性名称与数据库字段名称)

2.多表查询(ResultMap)

1.创建articleInfo类

2.创建ArticleMapper.xml配置文件和ArticleMapper接口

①:不建议使用 (文件之间耦合严重)

②常用的写法(将文件之间尽可能的解耦)

3.动态sql

1.<if>标签

2.<trim>标签 

3.<where>标签

①在where后面加1=1

②使用标签

4.<set> 标签 

5.<foreach>标签


1.命名规则

还有一个问题,在上面代码中我们数据库字段的命名和Java类中的命名是一一对应并且相等的

但是在我们实际开发中,数据库字段和Java的命名规则并不相同

  • 数据库命名:字母小写,用下划线分割,比如user_name
  • Java属性命名:小驼峰,比如:userName

那么我们应该如何将他们对应起来呢?

1.resultMap(对应类属性名称与数据库字段名称)

我们设置Java类中的userName,和passWord字段与数据库中的名称不一样,

此时我们使用resultMap来将他们一一映射起来(只需要映射字段名称不相同的即可)

测试查询方法:

结果如下:

可以看到虽然数据库字段名称与Java类中的属性名称不一样,但是我们通过resultMap查询到了数据

2.多表查询(ResultMap)

一般项目中很少用,因为写法复杂,并且运行效率不高,交给数据库去实现,时间不可控

对性能要求高的项目几乎不会用,尤其是面向用户的项目

比如:根据文章id获取文章相关信息,然后根据作者id获取作者信息

1.创建articleInfo类

@Data
public class ArticleInfo {
    private Integer id;
    private String title;
    private String content;
    private Date createtime;
    private Date updatetime;
    private Integer rcount;
    // 作者相关信息
    private User user;
}

2.创建ArticleMapper.xml配置文件和ArticleMapper接口

在ArticleMapper接口写方法

根据文章id获取文章相关信息,然后根据作者id获取作者信息

①:不建议使用 (文件之间耦合严重)

xml中代码 

查询到了结果

②常用的写法(将文件之间尽可能的解耦)

在文章类中只把我们需要的字段传入进来

在xml文件中传属性即可

可以看到同样是查询到了结果,但是这个方法比起刚才的方法,不需要去调用另一个xml文件里的代码,将两个xml文件解耦,我们在写项目的时候一定要尽量避免文件之间耦合

3.动态sql

动态 sql 是Mybatis的强⼤特性之⼀,能够完成不同条件下不同的 sql 拼接, 根据输入情况的不同,拼接生成不同的sql语句,不至于sql语句因此运行失败
有些字段是有默认值的,所以不能统一赋值为null
我们先来看一下正常情况下:
所有字段全部传入数据:(使用了三个字段来测试)  
可以看到运行成功,数据库也添加成功

那么如果我们只传一部分数据呢? 

比如我们之传入题目和用户id,来测试一下:

 

我们发现同样是运行成功了,但是他的值却为空,但这是在我们没有默认值的情况下,如果我们有默认值,那么为空可能会带来意想不到的后果

 那么我们应该如何解决呢?

1.<if>标签

我们使用if标签如果用户传入数据,就设置成用户传入的数据,如果没有传入数据,就设置为默认值或者null

如果所有字段都可以不传数据呢?那我们把全部字段使用<if>包起来就可以了吗?

显而易见,如果有用户第一个数据不传或者最后一个数据不传,那么逗号的位置我们没办法放置,有可能会多一个逗号,此时我们就可以使用另外一个标签

2.<trim>标签 

这样就可以解决逗号放置的问题了,

注意如果什么都不填写,还是会报错的,但是这个场景不太符合实际,因为什么都不填,那也不需要插入数据了,这种情况在前端就直接pass了,也不会传到后端来

3.<where>标签

 我们在购物的时候,经常会去筛选一些条件,这样的动态sql语句应该如何拼接呢?

此时我们传入两个参数

发现查询到了结果 

那如果我们之传入第二个参数呢?

 

 报错了,where后面直接跟的是and,第一个数据不传,结果where和and中间的数据没有了,造成sql语句报错,那么该如何解决呢?

①在where后面加1=1

这样1=1在第一条语句,就不用担心第一条语句为空的情况了

②使用<where>标签

他会自动的为我们添加合理的and,并且如果后面没有数据传入,它会将where关键字也去掉

 此时我们不传第一条数据,也运行成功了

 一条数据也不传,也运行成功了

4. <set>标签 

<set>标签作用 

当我们更新多个字段的时候,也会发生与where同样的情况

所以我们直接使用<set>标签,并且如果后面没有数据传入,它会将set关键字也去掉,但是后面没有数据,也没有更新的必要了不是(在前端就会被拦截)

5.<foreach>标签

批量操作的时候  ,比如批量插入,删除以及更新数据

 例如:批量删除id2-4的数据

 测试:

查看运行结果:

 成功删除了id为2,3,的文字,因为id为4的文章不存在,所以只删除了两条数据

同理,添加,更新等批量操作都是如此,小伙伴们可以下来自己去试试,操作一下

到这里,我们mybatis的学习就告一段落啦~~我们下篇博客见~

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值