MyBatis的三层级联和二层缓存
MyBatis的三层级联和二层缓存
<?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.learn.chapter4.mapper.StudentSelfcardMapper"> <resultMap type = "com.learn.chapter4.po.StudentSelfcardBean"> <id property = "id" column = "id"/> <id property = "studentId" column = "student_id"/> <id property = "native_" column = "native"/> <id property = "issueDate" column = "issue_date"/> <id property = "endDate" column = "end_date"/> <id property = "note" column = "note"/> </resultMap> <select id = "findStudentSelfcardByStudentId" parameterType = "int" resultMap = "studentSelfcardMap"> select id,student_id,native,issue_date,end_date,note from t_student_selfcard where student_id = #{studentId} </select> </mapper>
这个呢,就是我们的学生证查询resultMap定义了,接下来是我们的学生表查询;
<?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.learn.chapter4.mapper.StudentMapper"> <resultMap id = "studentMap" type = "com.learn.chpater4.po.StudentBean"> <id property = "id" column = "id"/> <result property = "cnname" column = "cnname"/> <result property = "sex" column = "sex" jdbcType = "INTEGER" javaType = "com.learn.chapter4.enums.SexEnum" typeHandler = "com.learn.chapter4.typehandler.SexTypeHandler"/> <result property = "note" column = "note"/> <association property = "studentSelfcard" column = "id" select = "com.learn.chapter4.mapper.StudentSelfcardMapper.findStudentSelfcardByStudentId"/> </resultMap> <select id = "getStudent" parameterType = "int" resultMap = "studentMap"> select id, cnname, sex, note from t_student where id = #{id} </select> </mapper>
最后,做一下测试就可以了;
SqlSession sqlSession = null; try{ sqlSession = SqlSessionFactoryUtil.openSqlSession(); StduentMapper stuMapper = sqlSession.getMapper(StudentMapper.class); StudentBean stu = stuMapper.getStudent(1); }finally{ if(sqlSession != null){ sqlSession.close(); } }
public class LectureBean{ private Integer id; private String lectureName; private String note; ...setter and getter... } public class StudentLectureBean{ private int id; private Integer studentId; private LectureBean lecture; private BigDecimal grade; private String nte; }
接下来我们做一对多的级联;
<?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.learn.chpater4.mapper.StudentMapper"> <resultMap id = "studentMap" type = "com.learn.chpater4.po.StudentBean"> <id property = "id" column = "id"/> <result property = "cnname" column = "cnname"/> <result property = "sex" column = "sex" jdbcType = "INTEGER" javaType = "com.learn.chapter4.enums.SexEnum" jdbcType = "com.learn.chapter4.typehandler.SexTypeHandler"/> <result property = "note" column = "note"/> <association property = "studentSelfcard" column = "id" select = "com.learn.chapter4.mapper.StudentSelfcardMapper.findStudentSelfcardByStudentId"/> <collection property = "studentLectureList" column = "id" select = "com.learn.chapter4.mapper.StudentLectureMapper.findStudentLectureByStudentId"/> </resultMap> <select id = "getStudent" parameterType = "int" resultMap = "studentMap"> select id, cnname, sex, note from t_student where id = #{id} </select> </mapper>
StudentLectureMapper.xml
<?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.learn.chapter4.mapper.StudentLectureMapper"> <resultMap id = "studentLectureMap" type = "com.learn.chpater4.po.StudentLectureBena"> <id property = "id" column = "id"/> <id property = "studentId" column = "student_id"/> <id property = "grade" column = "grade"/> <id property = "note" column = "note"/> <association property = "lecture" column = "lecture_id" select = "com.learn.chpater4.mapper.LectureMapper.getLecture"/> </resultMap> <select id = "findStudentLectureByStuId" parameterType = "int" resultMap = "studetntLectureMap"> select id, student_id,lecture_id,grade,note from t_student_lecture where student_id = #{id} </select> </mapper>
LectureMapper.xml
<?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.learn.chapter4.mapper.LectureMapper"> <select id = "getLecture" parameterType = "int" resultTYpe = "com.learn.chapter4.po.LectureBean"> select id,lecture_name as lectureName,note from t_lecture where id = #{id} </select> </mapper>
下面是一对多的测试类;
Logger logger = Logger.getLogger(Chpater4Main.class); SqlSession sqlSession = null; try{ sqlSession = SqlSessionFactoryUtil.openSqlSession(); StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class); StudentBean student = studentMapper/getStudent(1); logger.info(student.getStudentSelfcard().getNative_()); StudentLectureBean studentLecture = student.getStudentLectureList().get(0); LectureBean lecture = studentLecture.getLecture(); logger.info(student.getCnname() + "\t" + lecture.getLectureName()) }finally{ if(sqlSession != null){ sqlSession.close(); } }
public class MaleStudentBean extends StudentBean{ privaate List<StudentHealthMaleBean> studentHealthMaleList = null; } public class FemaleStudentBean extends StudentBean{ private List<StudentHealthFemaleBean> studentHealthFemaleList = null; }
下面是鉴别器的内容;
<?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.learn.chpater4.mapper.StudentMapper"> <resultMap id = "studentMap" type = "com.learn.chapter4.po.StudentBean"> <id property = "id" column = "id"/> <result property = "cnname" column = "cnname"/> <result property = "sex" column = "sex" jdbcType = "INTEGER" typeHandler = "com.learn.chpater4.typeHandler.SexTypeHandler"/> <result property = "note" column = "note"/> <association property = "studentSelfcard" column = "id" select = "com.learn.chapter4.mapper.StudentSelfcardMapper.findStudentSelfcardByStudentId"/> <collection property = "studentLectureList" column = "id" select = "com.learn.chpater4.mapper.StudentLectureMapper.findStudentLectureByStuId"/> <discriminator javaType = "int" column = "sex"> <case value = "1" resultMap = "maleStudentMap"/> <case value = "2" resultMap = "femaleStudentMap"/> </discriminator> </resultMap> <select id = "getStudent" parameterType = "int" resultMap = "studentMap"> select id,cnname,sex,note form t_student where id = #{id} </select> <resultMap id = "maleStudentMap" type = "com.learn.chpater4.po.MaleStudentBean" extends = "studentMap"> <collection property = "studentHealthMaleList" select = "com.learn.chapter4.mapper.StudentHealthMaleMapper.findStudentHealthMaleByStuId" column = "id"/> </resultMap> <resultMap id = "femaleStudentMap" type = "com.learn.chapter4.po.FemaleStudentBean" extends = "studentMap"> <collection property = "studentHealthFemaleList" select = "com.learn.chapter4.mapper.StudentHealthFemaleMapper.findStudentHealthFemaleByStuId" column = "id"/> </resultMap> </mapper>
<settings> <setting naem = "lazyLoadingEnabled" value = "true"/> </settings>
这是开启延迟加载的;
<setting name = "aggressiveLazyLoading" value = "false"/>
<association property = "studentSelfcard" column = "id" fetchType = "lazy" select = "com.learn.chapter4.mapper.StudentSelfcardMapper.findStudentSelfcardByStudentId"/> <collection property = "studentLectureList" column = "id" fetchType = "eager" select = "com.learn.chapter4.mapper.StudentLectureMapper.findStudentLectureByStuId"/>
<cache/>