目录
一、前言
工作中常常会碰到联表查询,最近刚刚参加工作,在写查询时发现自己很不熟练,特此总结一下一对一和一对多的查询。
在Dao层写sql语句时,我们常用的标签诸如select、update、delete、insert、where、if等等,都需要非常熟悉,我认为这也是代码的基本功吧,关于一对一和一对多,这里使用到的关键标签就是association和collection。
二、准备工作
依赖:
1 | <dependency> |
application配置文件:
1 | server: |
数据库:
三张表:班级、老师、学生,数据若干。这里没有使用外键,在工作中其实不常使用外键,外键使用过多会造成数据库维护成本过高!
1 | -- ---------------------------- |
实体类:
班级
1 | @Data |
老师
1 | @Data |
学生
1 | @Data |
这里要说明一下,工作中,班级类的老师和学生这两个属性是不该这样写的,实体类是和数据库中的字段一一对应的,实际工作会按照需求自行创建DTO或者VO类,这里为了省事就这就样直接写了。
三、一对一查询
目标:查出班级的同时要把老师的信息查出来
法一:嵌套 Select 查询
1 | <resultMap id="classResultMap" type="com.example.mybatisplus.entity.Classes"> |
说明:
- 需要将查询结果结果进行映射到实体类
- property属性表示一对一中被包含的对象,例如例子中的:班级中的老师对象
- column属性表示数据库的“外键”,例如班主任老师id
- javaType属性表示子查询的结果所映射的全限定类名(非必填,MyBatis会自动检测找到相应的类,但是还是建议填上)
- select表示子查询语句的id,例如:这里表示调用id为queryTeacherById的查询语句,其中column作为参数传入
法二:嵌套结果映射
1 | <resultMap id="classResultMap" type="com.example.mybatisplus.entity.Classes"> |
说明:
- 在结果映射中将结果一一映射,在sql语句中使用联表查询
- association中的column属性就可以省略不写了
- property要和column对应,如果column取了别名要写别名
结果展示:
四、一对多查询
目标:查出班级的同时要把所有学生的信息查出来
法一:嵌套 Select 查询
1 | <resultMap id="classResultMap" type="com.example.mybatisplus.entity.Classes"> |
说明:
- 与一对一的查询几乎一样
- 映射的结果是一个集合,javaType则为集合的类型,这里是list
- ofType是集合中的对象类型,这里是学生
法二:嵌套结果映射
1 | <resultMap id="classResultMap" type="com.example.mybatisplus.entity.Classes"> |
说明:
- 注意这里要给查出来的字段取别名
- 映射结果和查出的别名要一一对应
结果展示:
五、总结
关于MyBatis和MyBatis-Plus的使用本人并不是很熟悉,以上写法只是我在工作中容易碰到的,所以进行一个总结,怕自己容易忘。