转载自: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; @Repository public 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; @Repository public 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; @Repository public 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 @Transactional public 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 @Transactional public 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:女 |