当前位置:   article > 正文

复杂查询和事务操作_sqlsession开启事务

sqlsession开启事务

一对多的查询

需要使用`resultMap`来自定义映射规则

  1. <select id="getTeacherByTid" resultMap="asTeacher">
  2. select *, teacher.name as tname from student inner join teach on student.sid = teach.sid
  3. inner join teacher on teach.tid = teacher.tid where teach.tid = #{tid}
  4. </select>
  5. <resultMap id="asTeacher" type="Teacher">
  6. <id column="tid" property="tid"/>
  7. <result column="tname" property="name"/>
  8. <collection property="studentList" ofType="Student">
  9. <id property="sid" column="sid"/>
  10. <result column="name" property="name"/>
  11. <result column="sex" property="sex"/>
  12. </collection>
  13. </resultMap>

实体类

  1. @Data
  2. public class Teacher {
  3. int tid;
  4. String name;
  5. List<Student> studentList;
  6. }

`id`标签用于在多条记录中辨别是否为同一个对象的数据,比如上面的查询语句得到的结果中,`tid`这一行始终为`1`,因此所有的记录都应该是`tid=1`的教师的数据,而不应该变为多个教师的数据,如果不加id进行约束,那么会被识别成多个教师的数据

通过使用collection来表示将得到的所有结果合并为一个集合,比如上面的数据中每个学生都有单独的一条记录,因此tid相同的全部学生的记录就可以最后合并为一个List

多对一的查询

每个学生都有一个对应的老师,多个学生对应一个老师

实体类

  1. @Data
  2. @Accessors(chain = true)
  3. public class Student {
  4. private int sid;
  5. private String name;
  6. private String sex;
  7. private Teacher teacher;
  8. }
  9. @Data
  10. public class Teacher {
  11. int tid;
  12. String name;
  13. }

需要使用`resultMap`来自定义映射规则

  1. <resultMap id="test2" type="Student">
  2. <id column="sid" property="sid"/>
  3. <result column="name" property="name"/>
  4. <result column="sex" property="sex"/>
  5. <association property="teacher" javaType="Teacher">
  6. <id column="tid" property="tid"/>
  7. <result column="tname" property="name"/>
  8. </association>
  9. </resultMap>
  10. <select id="selectStudent" resultMap="test2">
  11. select *, teacher.name as tname from student left join teach on student.sid = teach.sid
  12. left join teacher on teach.tid = teacher.tid
  13. </select>

事务操作

在获取`SqlSession`关闭自动提交来开启事务模式,和JDBC其实都差不多

SqlSession sqlSession = MybatisUtil.getSession(false)

在关闭自动提交后,我们的内容是没有进入到数据库的,在事务提交后,我们的内容才会被写入到数据库中。

sqlSession.commit();

例子:

  1. try (SqlSession sqlSession = MybatisUtil.getSession(false)){
  2. TestMapper testMapper = sqlSession.getMapper(TestMapper.class);
  3. testMapper.addStudent(new Student().setSex("男").setName("小王"));
  4. testMapper.selectStudent().forEach(System.out::println);
  5. sqlSession.rollback();
  6. sqlSession.commit();
  7. }

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号