写一篇博客致我死去的时间
最近在写一个项目,信息管理方面的,对教师和班级的操作是通过关联表,一开始查询班级和查询班级对应的教师是两个接口,被人指点,发现应该就是一个接口,整体思路出现问题,大改!
目录
多表连查
首先从实体类开始,数据库中没有的字段,但是我又要用到,应该这样做
这就表示数据库中没有这个字段,但是你要用。
在配置文件中用collection来进行分表查询
findById()这个方法是查询一个班级,而下面selectTeachersByClassId()是查询教师信息,在调用findById这个方法时,selectTeachersByClassId会自动执行,因为findById的resultMap是BaseMap,通过id进行关联,达到分表查询的目的,另外,要注意,标签的顺序也是有要求的
下面是代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.qcby.mis.demo.mapper.ClassesMapper">
<resultMap id="baseMap" type="com.qcby.mis.demo.entity.DicClasses">
<id column="id" jdbcType="INTEGER" property="id"/>
<result column="name" jdbcType="VARCHAR" property="name"/>
<result column="major_id" jdbcType="INTEGER" property="majorId"/>
<result column="major_name" jdbcType="VARCHAR" property="majorName"/>
<result column="create_time" jdbcType="DATE" property="createTime"/>
<result column="update_time" jdbcType="DATE" property="updateTime"/>
<collection property="teacherList" select="selectTeachersByClassId" column="id" javaType="ArrayList">
</collection>
</resultMap>
<select id="findById" resultMap="baseMap">
select c.*,m.name as major_name from dic_classes c ,dic_major m where m.id = c.major_id and c.id = #{id};
</select>
<select id="selectTeachersByClassId" resultType="com.qcby.mis.demo.entity.User">
select id,name from user where id in (select user_id from ref_user_classes where class_id = #{id});
</select>
</mapper>
Mapper层
其实 selectTeachersByClassId这个方法写不写到Mapper层都无所谓,有强迫症的就写一下吧
Service层
ServiceImpl层
Controller层
查询的难点就在于配置文件中的collection,剩下的都比较中规中矩
看一下postman的测试结果
多表删除
不仅要删除dic_classes表中的,也要删除关联表中的,不需要自己写什么方法,用mybatis plus 自带的方法加上条件构造器就够了,因为关联表中是没有主键的,所以要用到条件构造器
多表修改
多表修改,涉及到关联表的,一般是先删除再增加
关联表的数据库
tip:先删除再增加就是,比如classId = 12时,teacherList里面原来有id为14,15,16的,现在我要修改成只有14,15的,那么先把关联表中classId = 12 的全都删掉,再把userId(教师id)为14,15的加进去,并且新加进去的14, 15的classId仍为12
那么代码就是这样的
修改时传过来一个实体,可以根据dicClasses的get方法得到我们需要的id,再用set方法给redUserClasses进行赋值
删除还是和上面的一样,增加需要传一个实体类,因为一个班级可以对应多个老师,所以我们for循环一个一个的给userId赋值,且插入到数据库中
postman测试,其中teacherList的传参是要这样传的
在查资料的时候发现有一个批量插入saveBatch,我不太会用那个,可能是因为这种情况不适合用那个方法,也会继续思考的,有什么新想法可以互相分享