转载自:http://my.oschina.net/huangcongmin12/blog/83731
mybatis整合spring 之 基于接口映射的多对一关系。
项目用到俩个表,即student表和school表。表结构如下:
school表:
student表:
项目结构如下:
1)applicationContext.xml
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
|
<?xml version="1.0" encoding="UTF-8" ?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"> <!-- 加载JDBC配置文件 --> <context:property-placeholder location="classpath:jdbc.properties" /> <!-- 扫描类包,将标注Spring注解的类自动转化Bean,同时完成Bean的注入 --> <context:component-scan base-package="com.springbatis.dao" /> <context:component-scan base-package="com.springbatis.service" /> <!-- 配置数据源 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass"> <value>${jdbc.driverClassName}</value> </property> <property name="jdbcUrl"> <value>${jdbc.url}</value> </property> <property name="user"> <value>${jdbc.username}</value> </property> <property name="password"> <value>${jdbc.password}</value> </property> <property name="minPoolSize"> <value>8</value> </property> <property name="maxPoolSize"> <value>200</value> </property> <property name="initialPoolSize"> <value>10</value> </property> <property name="maxIdleTime"> <value>60</value> </property> <property name="acquireIncrement"> <value>5</value> </property> <property name="maxStatements"> <value>10</value> </property> <property name="idleConnectionTestPeriod"> <value>60</value> </property> <property name="acquireRetryAttempts"> <value>30</value> </property> <property name="breakAfterAcquireFailure"> <value>true</value> </property> <property name="testConnectionOnCheckout"> <value>false</value> </property> </bean> <!-- 创建SqlSessionFactory,同时指定数据源 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 指定sqlMapConfig总配置文件 --> <property name="configLocation" value="classpath:mybatis-configuration.xml"/> <property name="dataSource" ref="dataSource" /> </bean> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.springbatis.dao" /> </bean> <!-- 事务管理 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <!-- 使用注解控制事务 --> <tx:annotation-driven /> </beans> |
2)mybatis-configuration.xml
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration> <!-- 别名 --> <typeAliases> <typeAlias alias="School" type="com.springbatis.domain.School"/> <typeAlias alias="Student" type="com.springbatis.domain.Student"/> </typeAliases> <!-- ORM映射文件 --> <mappers> <mapper resource="com/springbatis/domain/SchoolMapper.xml" /> <mapper resource="com/springbatis/domain/StudentMapper.xml" /> </mappers> </configuration> |
3)School Entity
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
package com.springbatis.domain;import java.io.Serializable;import java.util.ArrayList;import java.util.List;@SuppressWarnings("serial")public class School implements Serializable { private int id; private String schoolNumber; private String schoolName; private List<Student> students = new ArrayList<Student>(); public School(){ } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getSchoolNumber() { return schoolNumber; } public void setSchoolNumber(String schoolNumber) { this.schoolNumber = schoolNumber; } public String getSchoolName() { return schoolName; } public void setSchoolName(String schoolName) { this.schoolName = schoolName; } public List<Student> getStudents() { return students; } public void setStudents(List<Student> students) { this.students = students; } } |
4)Student Entity
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
package com.springbatis.domain;import java.io.Serializable;@SuppressWarnings("serial")public class Student implements Serializable { private int id; private String studentNumber; private String studentName; private String sex; private School school; public Student(){ } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getStudentNumber() { return studentNumber; } public void setStudentNumber(String studentNumber) { this.studentNumber = studentNumber; } public String getStudentName() { return studentName; } public void setStudentName(String studentName) { this.studentName = studentName; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public School getSchool() { return school; } public void setSchool(School school) { this.school = school; } } |
5)SchoolMapper.xml
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN" "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd"> <mapper namespace="com.springbatis.dao.SchoolMybatisDao"> <!-- 一对多映射 --> <resultMap id="schoolResult" type="School"> <id property="id" column="school_id" /> <result property="schoolNumber" column="school_number"/> <result property="schoolName" column="school_name"/> <collection property="students" ofType="Student"> <id property="id" column="student_id"/> <result property="studentNumber" column="student_number"/> <result property="studentName" column="student_name"/> <result property="sex" column="student_sex"/> </collection> </resultMap> <select id="loadSchoolWithStudent" parameterType="int" resultMap="schoolResult"> select sch.id as school_id, sch.schoolNumber as school_number, sch.schoolName as school_name, stu.id as student_id, stu.studentNumber as student_number, stu.studentName as student_name, stu.sex as student_sex from school sch left outer join student stu on sch.id=stu.school_id where sch.id=#{school_id} </select> </mapper> |
6)StudentMapper.xml
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN" "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd"> <mapper namespace="com.springbatis.dao.StudentMybatisDao"> <!-- 多对一映射 --> <resultMap id="studentResult" type="Student" > <id property="id" column="student_id"/> <result property="studentNumber" column="student_number"/> <result property="studentName" column="student_name"/> <result property="sex" column="student_sex"/> <association property="school" javaType="School"> <id property="id" column="school_id"/> <result property="schoolNumber" column="school_number"/> <result property="schoolName" column="school_name"/> </association> </resultMap> <select id="loadStudentWithSchool" parameterType="int" resultMap="studentResult"> select stu.id as student_id, stu.studentNumber as student_number, stu.studentName as student_name, stu.sex as student_sex, sch.id as school_id, sch.schoolNumber as school_number, sch.schoolName as school_name from student stu left outer join school sch on sch.id=stu.school_id where stu.id=#{student_id} </select> </mapper> |
7)SchoolMybatisDao Interface
|
1
2
3
4
5
6
7
8
9
10
11
12
|
package com.springbatis.dao;import org.springframework.stereotype.Repository;import com.springbatis.domain.School;@Repositorypublic interface SchoolMybatisDao { School loadSchoolWithStudent(int school_id); } |
8)StudentMybatisDao Interface
|
1
2
3
4
5
6
7
8
9
10
11
12
|
package com.springbatis.dao;import org.springframework.stereotype.Repository;import com.springbatis.domain.Student;@Repositorypublic interface StudentMybatisDao { Student loadStudentWithSchool(int student_id); } |
9)SchoolService Interface
|
1
2
3
4
5
6
7
8
9
10
11
12
|
package com.springbatis.service;import org.springframework.stereotype.Repository;import com.springbatis.domain.School;@Repositorypublic interface SchoolService { public School loadSchoolWithStudent(int school_id); } |
10)StudentServiec Interface
|
1
2
3
4
5
6
7
8
9
|
package com.springbatis.service;import com.springbatis.domain.Student;public interface StudentService { public Student loadStudentWithSchool(int student_id); } |
11)SchoolService Implement
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
package com.springbatis.service.implement;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import org.springframework.transaction.annotation.Transactional;import com.springbatis.dao.SchoolMybatisDao;import com.springbatis.domain.School;import com.springbatis.service.SchoolService;@Service@Transactionalpublic class SchoolServiceImpl implements SchoolService { @Autowired private SchoolMybatisDao schoolDao; @Override public School loadSchoolWithStudent(int school_id) { return schoolDao.loadSchoolWithStudent(school_id); }} |
12)StudentService Implement
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
package com.springbatis.service.implement;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import org.springframework.transaction.annotation.Transactional;import com.springbatis.dao.StudentMybatisDao;import com.springbatis.domain.Student;import com.springbatis.service.StudentService;@Service@Transactionalpublic class StudentServiceImpl implements StudentService { @Autowired private StudentMybatisDao studentDao; @Override public Student loadStudentWithSchool(int student_id) { return studentDao.loadStudentWithSchool(student_id); }} |
13)test/StudentServiceTest
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
package com.springbatis.service;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.test.context.ContextConfiguration;import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import com.springbatis.domain.Student;@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(locations="/applicationContext.xml")public class StudentServiceTest { @Autowired private StudentService studentService; @Test public void testLoadStudentWithSchool(){ Student stu = studentService.loadStudentWithSchool(2); if(stu!=null){ System.out.println("=====》studentId:"+stu.getId()+" studentNumber:"+stu.getStudentNumber()+" studentName:"+stu.getStudentName()+" sex:"+stu.getSex()); System.out.println("=====》schoolId:"+stu.getSchool().getId()+" schoolNumber:"+stu.getSchool().getSchoolNumber()+" schoolName:"+stu.getSchool().getSchoolName()); } else{ System.out.println("id不存在!!"); } }} |
14)test/SchoolServiceTest
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
package com.springbatis.service;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.test.context.ContextConfiguration;import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import com.springbatis.domain.School;import com.springbatis.domain.Student;@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(locations="/applicationContext.xml")public class SchoolServiceTest { @Autowired private SchoolService schoolService; @Test public void testLoadSchoolWithStudent(){ School school = schoolService.loadSchoolWithStudent(1); if(school!=null){ System.out.println("=====》schoolId:"+school.getId()+" schoolNumber:"+school.getSchoolNumber()+" schoolName:"+school.getSchoolName()); if(school.getStudents().size()>0){ for(Student stu : school.getStudents()){ System.out.println("=====》studentId:"+stu.getId()+" studentNumber:"+stu.getStudentNumber()+" studentName:"+stu.getStudentName()+" sex:"+stu.getSex()); } }else{ System.out.println("无学生!"); } } else{ System.out.println("id不存在!!"); } } } |
15) 执行testLoadSchoolWithStudent()
输出:
|
1
2
3
4
|
==》schoolId: 1 schoolNumber:100001 schoolName:清华大学=====》studentId:1 studentNumber:1007300220 studentName:露西 sex:女=====》studentId:2 studentNumber:1007300222 studentName:杰克 sex:男=====》studentId:4 studentNumber:1007300225 studentName:露露 sex:女 |


