java中sql语句怎么把开始和结束时间作为参数写sql查询_【框架】118:mybatis之多表高级查询...

08bc63d27c46c32790a868963de9e899.png

今天是刘小爱自学Java的第118天。

感谢你的观看,谢谢你。

d911d691956a2b05b9a7469c0c11096c.png

学习内容安排如下:

  • 补充说明知识点:resultMap,sql片段。
  • mybatis中的高级查询,即多表关联查询。
  • 主要分为:一对一查询,一对多查询,多对多查询,本来打算全学完的,奈何计划赶不上变化。

一、知识点补充

1resultMap

又要提到前面那个说了好几遍的起别名问题了,使用resultMap标签也能解决这个问题。

当然该标签最主要的应用还是在于多表关联查询,先对其有个初步了解:

dbd5961efe3419d5ecddcfb4870c486a.png

select标签中resultMap的值为userMap,根据这个值找到对应id的resultMap标签。

这样的一个好处在于独立出来了一个标签,我们在该标签里面可以做很多事情。

上述中就可以在resultMap标签中使用type属性说明,其对应的实体类为User。

使用result子标签也可以将数据表中的字段和实体类属性关联起来:

  • column对应的也就是数据库中的列名。
  • property对应的也就是实体类的属性。

当然取别名的方法还是使用settings开启驼峰匹配方便,不过resultMap也有其它的应用。

2sql片段

我们先看两条sql语句:

cf7e069c6444c86ed6fd2d69e5e1dcf0.png

在sql语句中,*号是大忌,它的出现也就意味着性能低下,一般都不会直接用它。

在这里使用将所有列名都书写的查询方式,这两条sql语句本质上其实就是一回事。

当然具体如何优化sql语句,应该没这么简单,我只是以此引出sql片段这个知识点。

如果每次都要书写这么长的sql语句,显然是一件很麻烦的事情。

所以为了解决这个问题,使用sql片段:

eef9a5c45e98adb58dd022084f489064.png

将sql语句经常被使用的部分抽取成一个sql片段,在sql语句中使用<include>标签引用该片段即可。

当然关于sql片段我们专门创建一个xml文件存放,再引用对应的片段也是可以的。

不过要注意:在核心配置文件中别忘了引入该映射文件,我这边就不说详述了。

3高级查询引入

表与表之间的关系,无外乎就是三种:

  • 一对一关系:比如用户和订单关系。
  • 一对多关系:比如订单和订单详情关系。
  • 多对多关系:比如订单和商品的关系。

二、一对一查询

案例:根据订单号,查询出订单信息,以及下单人信息。

1案例分析

37b3fe7817fd79f1610f3575ec2de911.png

①需求分析

因为涉及到订单信息表,和下单人信息表两张表的信息,所以需要使用到多表关联查询。

②查询结果

其结果有两张表的数据,那么如何在Java中接受查询到的数据呢?

我们知道数据表可以对应一个Java实体类,现在有多张表数据如何对应一个Java实体类?

就可以使用③这种方式,将User实体类对象作为Order实体类的成员变量。

2代码编写

40075a4c06c7f50d2a93677ccf770202.png

①mapper层接口方法

根据订单号查询订单和用户,参数为订单号,结果为一个order对象。

②映射文件sql语句编写

这不用多说,上述就已经分析了。

③测试代码

我们会发现其查询结果中,order实体类中的user属性为null

为什么会这样呢?

因为mybatis并不能自动映射user实体类,所以需要自行配置resultMap。

3代码优化

ad4118b6920d8f9a0cb52c7093d2baf5.png

①结果集类型为order

指定结果集id,编写对应的resultMap标签。

②association标签

其翻译过来本身就是联合的意思。

  • property:也就是order中需要关联的属性,这里也就是user。
  • javaType:关联属性对应的Java类型,这里也就是User实体类。

③关联属性id

User的id在order中对应的也就是user_id。

再次测试查询时,就能发现查询结果中user类中的数据也能获取了。

三、一对多查询

案例:查询订单,查询出下单人信息并且查询出订单详情。

8fd9aef8e6e8b54c4bff7e5341e83bc5.png

①sql语句编写

查询结果与三张表相关联,那么一共有两次表关联查询。

②数据库查询结果

通过结果我们可以发现一个订单号查询出了2个订单详情。

③Order实体类拓展

订单和订单详情是一对多关系,那么同理,将订单详情的集合封装成订单的一个属性。

分析完毕,代码编写,同样的方式使用resultMap标签,一次性将代码写完整。

a8f9d2cc2af3f9cc0123b38c07adf039.png

①mapper层接口方法说明

②映射文件中sql语句编写

③一对多查询,collection标签,其本身翻译过来也就是集合的意思:

  • property:属性名,这里也就是封装到Order类中的orderdetails属性。
  • javaType:集合类型,我们封装的是List。
  • ofType:集合中的元素类型,即泛型。
  • autoMapping:开启自动映射

id子标签:要指定在查询结果中orderdetail表中的id,其id我们使用了起别名的方式加以说明,也就是detail_id。

最后

谢谢你的观看。

如果可以的话,麻烦帮忙点个赞,谢谢你。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值