mybatis一对一的三种实现方式 数据准备: 使用mysql数据库作为测试。建表语句及测试数据: CREATE TABLE `classes` ( `class_id` int(11) NOT

mybatis一对一的三种实现方式

数据准备:

使用mysql数据库作为测试。建表语句及测试数据:

CREATE TABLE `classes` (
  `class_id` int(11) NOT NULL AUTO_INCREMENT,
  `class_name` varchar(255) DEFAULT NULL,
  KEY `class_id` (`class_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1003 DEFAULT CHARSET=utf8;

insert  into `classes`(`class_id`,`class_name`) values (1001,'一班'),(1002,'二班');

CREATE TABLE `student` (
  `student_id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `class_id` int(11) DEFAULT NULL,
  KEY `student_id` (`student_id`)
) ENGINE=InnoDB AUTO_INCREMENT=10004 DEFAULT CHARSET=utf8;

insert  into `student`(`student_id`,`name`,`age`,`class_id`) values (10001,'张三',20,1001),(10002,'李四',21,1001),(10003,'王五',22,1002);

model类:

Student.java

[java]  view plain  copy
  1. package com.example.model;  
  2.   
  3. /** 
  4.  * @author wrp 
  5.  * @Description com.example.model.Student 
  6.  * @Date 2017/1/4 
  7.  */  
  8. public class Student {  
  9.   
  10.     private Integer studentId;  
  11.   
  12.     private String name;  
  13.   
  14.     private Integer age;  
  15.   
  16.     private Integer classId;  
  17.   
  18.     private Classes classes;  
  19.   
  20.     public Integer getStudentId() {  
  21.         return studentId;  
  22.     }  
  23.   
  24.     public void setStudentId(Integer studentId) {  
  25.         this.studentId = studentId;  
  26.     }  
  27.   
  28.     public String getName() {  
  29.         return name;  
  30.     }  
  31.   
  32.     public void setName(String name) {  
  33.         this.name = name;  
  34.     }  
  35.   
  36.     public Integer getAge() {  
  37.         return age;  
  38.     }  
  39.   
  40.     public void setAge(Integer age) {  
  41.         this.age = age;  
  42.     }  
  43.   
  44.     public Integer getClassId() {  
  45.         return classId;  
  46.     }  
  47.   
  48.     public void setClassId(Integer classId) {  
  49.         this.classId = classId;  
  50.     }  
  51.   
  52.     public Classes getClasses() {  
  53.         return classes;  
  54.     }  
  55.   
  56.     public void setClasses(Classes classes) {  
  57.         this.classes = classes;  
  58.     }  
  59. }  

Classes.java

[java]  view plain  copy
  1. package com.example.model;  
  2.   
  3. /** 
  4.  * @author wrp 
  5.  * @Description com.example.model.Class 
  6.  * @Date 2016/12/30 
  7.  */  
  8. public class Class {  
  9.   
  10.     private Integer classId;  
  11.   
  12.     private String className;  
  13.   
  14.     public Integer getClassId() {  
  15.         return classId;  
  16.     }  
  17.   
  18.     public void setClassId(Integer classId) {  
  19.         this.classId = classId;  
  20.     }  
  21.   
  22.     public String getClassName() {  
  23.         return className;  
  24.     }  
  25.   
  26.     public void setClassName(String className) {  
  27.         this.className = className;  
  28.     }  
  29. }  

mybatis xml:

Classes.xml

[html]  view plain  copy
  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >  
  3. <mapper namespace="com.example.dao.ClassesDao">  
  4.   
  5.     <resultMap id="ClassesMap" type="com.example.model.Classes">  
  6.         <id property="classId" column="class_id" />  
  7.         <result property="className" column="class_name" />  
  8.     </resultMap>  
  9.   
  10.     <select id="getClasses" parameterType="java.lang.Integer" resultMap="ClassesMap">  
  11.         SELECT  
  12.         t.class_id,  
  13.         t.class_name  
  14.         FROM classes t  
  15.         WHERE t.class_id = #{classId}  
  16.     </select>  
  17.   
  18. </mapper>  

Student.xml

[html]  view plain  copy
  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >  
  3. <mapper namespace="com.example.dao.StudentDao">  
  4.   
  5.     <!-- 一对一关联 方式一 begin -->  
  6.     <select id="selectAllStudent1" resultType="com.example.model.Student">  
  7.         SELECT  
  8.         t.student_id as studentId,  
  9.         t.name as name,  
  10.         t.age as age,  
  11.         t.class_id as classId,  
  12.         t2.class_id "classes.classId",  
  13.         t2.class_name "classes.className"  
  14.         FROM student t  
  15.         LEFT JOIN classes t2 ON t.class_id=t2.class_id  
  16.     </select>  
  17.     <!-- 一对一关联 方式一 end -->  
  18.   
  19.     <!-- 一对一关联 方式二 begin -->  
  20.     <resultMap id="StudentMap2" type="com.example.model.Student">  
  21.         <id property="studentId" column="student_id" />  
  22.         <result property="name" column="name" />  
  23.         <result property="age" column="age" />  
  24.         <result property="classId" column="class_id" />  
  25.         <association property="classes" resultMap="com.example.dao.ClassesDao.ClassesMap" />  
  26.     </resultMap>  
  27.     <!--<resultMap id="StudentMap2" type="com.example.model.Student">  
  28.         <id property="studentId" column="student_id" />  
  29.         <result property="name" column="name" />  
  30.         <result property="age" column="age" />  
  31.         <result property="classId" column="class_id" />  
  32.         <association property="classes" javaType="com.example.model.Classes">  
  33.             <id property="classId" column="class_id" />  
  34.             <result property="className" column="class_name" />  
  35.         </association>  
  36.     </resultMap>-->  
  37.     <select id="selectAllStudent2" resultMap="StudentMap2">  
  38.         SELECT  
  39.         t.student_id,  
  40.         t.name,  
  41.         t.age,  
  42.         t.class_id,  
  43.         t2.class_name  
  44.         FROM student t  
  45.         LEFT JOIN classes t2 ON t.class_id=t2.class_id  
  46.     </select>  
  47.     <!-- 一对一关联 方式二 end -->  
  48.   
  49.     <!-- 一对一关联 方式三 begin -->  
  50.     <resultMap id="StudentMap3" type="com.example.model.Student">  
  51.         <id property="studentId" column="student_id" />  
  52.         <result property="name" column="name" />  
  53.         <result property="age" column="age" />  
  54.         <result property="classId" column="class_id" />  
  55.         <association property="classes" column="class_id" select="com.example.dao.ClassesDao.getClasses" />  
  56.     </resultMap>  
  57.     <select id="selectAllStudent3" resultMap="StudentMap3">  
  58.         SELECT  
  59.         t.student_id,  
  60.         t.name,  
  61.         t.age,  
  62.         t.class_id  
  63.         FROM student t  
  64.     </select>  
  65.     <!-- 一对一关联 方式三 end -->  
  66.   
  67. </mapper>  

dao类:

ClassesDao.java

[html]  view plain  copy
  1. package com.example.dao;  
  2.   
  3. import com.example.model.Classes;  
  4.   
  5. /**  
  6.  * @author wrp  
  7.  * @Description com.example.dao.Classes  
  8.  * @Date 2017/1/4  
  9.  */  
  10. public interface ClassesDao {  
  11.   
  12.     Classes getClasses(Integer classId);  
  13.   
  14. }  

StudentDao.java

[java]  view plain  copy
  1. <span style="font-size:14px;">package com.example.dao;  
  2.   
  3. import com.example.model.Student;  
  4.   
  5. import java.util.List;  
  6.   
  7. /** 
  8.  * @author wrp 
  9.  * @Description com.example.dao.StudentDao 
  10.  * @Date 2017/1/4 
  11.  */  
  12. public interface StudentDao {  
  13.   
  14.     List<Student> selectAllStudent1();  
  15.   
  16.     List<Student> selectAllStudent2();  
  17.   
  18.     List<Student> selectAllStudent3();  
  19.   
  20. }</span><span style="font-size:24px;">  
  21. </span>  

测试用例:

StudentDaoTest.java

[java]  view plain  copy
  1. package com.example.dao;  
  2.   
  3. import com.alibaba.fastjson.JSON;  
  4. import com.alibaba.fastjson.serializer.SerializerFeature;  
  5. import com.example.model.Student;  
  6. import org.junit.Test;  
  7. import org.junit.runner.RunWith;  
  8. import org.springframework.beans.factory.annotation.Autowired;  
  9. import org.springframework.boot.test.context.SpringBootTest;  
  10. import org.springframework.test.context.junit4.SpringRunner;  
  11.   
  12. import java.util.List;  
  13.   
  14. /** 
  15.  * @author wrp 
  16.  * @Description com.example.dao.StudentDaoTest 
  17.  * @Date 2017/1/4 
  18.  */  
  19. @RunWith(SpringRunner.class)  
  20. @SpringBootTest  
  21. public class StudentDaoTest {  
  22.   
  23.     @Autowired  
  24.     private StudentDao studentDao;  
  25.   
  26.     @Test  
  27.     public void selectAllStudent1() {  
  28.         List<Student> students = studentDao.selectAllStudent1();  
  29.         System.out.println(JSON.toJSONString(students));  
  30.         //[{"age":20,"classId":1001,"classes":{"classId":1001,"className":"一班"},"name":"张三","studentId":10001},{"age":21,"classId":1001,"classes":{"classId":1001,"className":"一班"},"name":"李四","studentId":10002},{"age":22,"classId":1002,"classes":{"classId":1002,"className":"二班"},"name":"王五","studentId":10003}]  
  31.     }  
  32.   
  33.     @Test  
  34.     public void selectAllStudent2() {  
  35.         List<Student> students = studentDao.selectAllStudent2();  
  36.         System.out.println(JSON.toJSONString(students));  
  37.     }  
  38.   
  39.     @Test  
  40.     public void selectAllStudent3() {  
  41.         List<Student> students = studentDao.selectAllStudent3();  
  42.         // 禁用FastJson的“循环引用检测”特性。  
  43.         System.out.println(JSON.toJSONString(students, SerializerFeature.DisableCircularReferenceDetect));  
  44.     }  
  45.   
  46. }  

注意:

1:本文三种方式排序按照个人建议,第三种可能会带来N+1的查询次数。

2:FastJson转换json,会有循环引用检测的特性,需要加SerializerFeature.DisableCircularReferenceDetect参数禁用。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值