Mybatis 系列8-结合源码解析select、resultMap的用法

【Mybatis 系列10-结合源码解析mybatis 执行流程】

【Mybatis 系列9-强大的动态sql 语句】

【Mybatis 系列8-结合源码解析select、resultMap的用法】 

【Mybatis 系列7-结合源码解析核心CRUD配置及用法】

【Mybatis 系列6-结合源码解析节点配置objectFactory、databaseIdProvider、plugins、mappers】

【Mybatis 系列5-结合源码解析TypeHandler】 

【Mybatis 系列4-结合源码解析节点typeAliases】

【Mybatis 系列3-结合源码解析properties节点和environments节点】

【Mybatis 系列2-配置文件】

【Mybatis 系列1-环境搭建】

 

 

 

上篇系列7 介绍了insert、update、delete的用法,

本篇将介绍select、resultMap的用法。

select无疑是我们最常用,也是最复杂的,mybatis通过resultMap能帮助我们很好地进行高级映射。

下面就开始看看select 以及 resultMap的用法:

 

先看select的配置:

 1 <select
 2         
 6      
 7      id="selectPerson"
 8      
 9      
12      parameterType="int"
13      
14      
16      resultType="hashmap"
17      
18      
20      resultMap="personResultMap"
21      
22      
24      flushCache="false"
25      
26      
28      useCache="true"
29      
30      
32      timeout="10000"
33      
34      
36      fetchSize="256"
37      
38      
40      statementType="PREPARED"
41      
42      
44      resultSetType="FORWARD_ONLY">

 

配置看起来总是这么多,不过实际常用的配置也就那么几个, 根据自己的需要吧,上面都已注明是否必须配置。

下面还是针对select 及时练练手吧:

 

------------------------------------------------------------------------下面是针对select 的练手demo---------------------------------------------------------------------------------------

数据库:

新增两张表(t_course, t_student)

t_course:

Mybatis 系列8-结合源码解析select、resultMap的用法_第1张图片

t_student:

 Mybatis 系列8-结合源码解析select、resultMap的用法_第2张图片

其中,1个student可选择多个course进行学习。 我们拿上篇文章的demo, 继续增加后,项目目录如下所示:

 Mybatis 系列8-结合源码解析select、resultMap的用法_第3张图片

 

Course.java:

 1 package com.dy.entity;
 2 
 3 public class Course {
 4 
 5     private int id;
 6     private String name; 
 7     private int deleteFlag;
 8     
 9     public int getId() {
10         return id;
11     }
12     public void setId(int id) {
13         this.id = id;
14     }
15     public String getName() {
16         return name;
17     }
18     public void setName(String name) {
19         this.name = name;
20     }
21     public int getDeleteFlag() {
22         return deleteFlag;
23     }
24     public void setDeleteFlag(int deleteFlag) {
25         this.deleteFlag = deleteFlag;
26     }
27     
28 }

 

Student.java:

 1 package com.dy.entity;
 2 
 3 import java.util.List;
 4 
 5 public class Student {
 6 
 7     private int id;
 8     private String idCard;
 9     private String name;
10     private List courseList;
11     private int deleteFlag;
12     
13     public Student(int id, String idCard, String name, List courseList, int deleteFlag) {
14         this.id = id;
15         this.idCard = idCard;
16         this.name = name;
17         this.courseList = courseList;
18         this.deleteFlag = deleteFlag;
19     }
20     
21     public int getId() {
22         return id;
23     }
24     public void setId(int id) {
25         this.id = id;
26     }
27     public String getIdCard() {
28         return idCard;
29     }
30     public void setIdCard(String idCard) {
31         this.idCard = idCard;
32     }
33     public String getName() {
34         return name;
35     }
36     public void setName(String name) {
37         this.name = name;
38     }
39     public List getCourseList() {
40         return courseList;
41     }
42     public void setCourseList(List courseList) {
43         this.courseList = courseList;
44     }
45     public int getDeleteFlag() {
46         return deleteFlag;
47     }
48     public void setDeleteFlag(int deleteFlag) {
49         this.deleteFlag = deleteFlag;
50     }
51 }

 

CourseDao.java:

 1 package com.dy.dao;
 2 
 3 import com.dy.entity.Course;
 4 
 5 public interface CourseDao {
 6 
 7     public Course findCourseById(int courseId);
 8     
 9 }
10 
11 
12 StudentDao.java:
13 package com.dy.dao;
14 
15 
16 import com.dy.entity.Student;
17 
18 public interface StudentDao {
19 
20     public Student findStudentById(String idCard);
21 }

 

courseDao.xml:

 1 
 2     
 3     
12     
15     
16 

 

CourseDaoTest.java:

 1 package com.dy.dao;
 2 
 3 import java.io.IOException;
 4 
 5 import org.apache.ibatis.io.Resources;
 6 import org.apache.ibatis.session.SqlSession;
 7 import org.apache.ibatis.session.SqlSessionFactory;
 8 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
 9 import org.junit.Test;
10 
11 import com.dy.entity.Course;
12 
13 public class CourseDaoTest {
14 
15     @Test
16     public void findCourseById() {
17         SqlSessionFactory sqlSessionFactory = getSessionFactory();
18         SqlSession sqlSession = sqlSessionFactory.openSession(); 
19         CourseDao courseDao = sqlSession.getMapper(CourseDao.class);
20         Course course = courseDao.findCourseById(1);
21     }
22     
23     
24     //Mybatis 通过SqlSessionFactory获取SqlSession, 然后才能通过SqlSession与数据库进行交互
25     private static SqlSessionFactory getSessionFactory() {  
26         SqlSessionFactory sessionFactory = null;  
27         String resource = "mybatis-conf.xml";  
28         try {  
29             sessionFactory = new SqlSessionFactoryBuilder().build(Resources  
30                     .getResourceAsReader(resource));
31         } catch (IOException e) {  
32             e.printStackTrace();  
33         }  
34         return sessionFactory;  
35     }  
36 }

上面的示例,我们针对course, 简单演示了 select的用法, 不过有个问题值得思考: 一个student可以对应多个course,

那么,在mybatis中如何处理这种一对多, 甚至于多对多,一对一的关系呢?

 

这儿,就不得不提到 resultMap 这个东西, mybatis的resultMap功能可谓十分强大,能够处理复杂的关系映射,

那么resultMap 该怎么配置呢?

 

resultMap的配置:

 1 
 5     
 6     
 7         
11         
12         
13             
14         
15         
16         
19         
20             
21             
22             
23             
24         
25         
26         
32         
33         
34         
40         
41     

好啦,知道resutMap怎么配置后,咱们立即接着上面的demo来练习一下吧:

------------------------------------------------------------------下面是用resultMap处理一对多关系的映射的示例-------------------------------------------------------------

一个student对应多个course, 典型的一对多,

 

咱们就来看看mybatis怎么配置这种映射吧: studentDao.xml:

 1 
 2 
 3     
 4     
 5     
 6         
11         
12         
13         
14         
15         
16         
21         
22             
23             
24             
25         
26     
27     
28     
29     
32     
33 

 

StudentDaoTest.java:

 1 package com.dy.dao;
 2 
 3 import java.io.IOException;
 4 import java.util.List;
 5 
 6 import org.apache.ibatis.io.Resources;
 7 import org.apache.ibatis.session.SqlSession;
 8 import org.apache.ibatis.session.SqlSessionFactory;
 9 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
10 import org.junit.Test;
11 
12 import com.dy.entity.Course;
13 import com.dy.entity.Student;
14 
15 public class StudentDaoTest {
16 
17     @Test
18     public void findCourseById() {
19         SqlSessionFactory sqlSessionFactory = getSessionFactory();
20         SqlSession sqlSession = sqlSessionFactory.openSession(); 
21         StudentDao studentDao = sqlSession.getMapper(StudentDao.class);
22         Student student = studentDao.findStudentById("20140101");
23         List courseList = student.getCourseList();
24         for (Course course: courseList) {
25             System.out.println(course.getId() + "   " + course.getName());
26         }
27     }
28     
29     
30     //Mybatis 通过SqlSessionFactory获取SqlSession, 然后才能通过SqlSession与数据库进行交互
31     private static SqlSessionFactory getSessionFactory() {  
32         SqlSessionFactory sessionFactory = null;  
33         String resource = "mybatis-conf.xml";  
34         try {  
35             sessionFactory = new SqlSessionFactoryBuilder().build(Resources  
36                     .getResourceAsReader(resource));
37         } catch (IOException e) {  
38             e.printStackTrace();  
39         }  
40         return sessionFactory;  
41     }  
42 }

 

相信通过以上demo, 大家也能够使用mybatis的select 和 resultMap的用法了。

 

上面demo只演示了一对多的映射,其实多对一、多对多也与它类似,有兴趣的可以自己动手再做做。

 

你可能感兴趣的:(Mybatis 系列8-结合源码解析select、resultMap的用法)