mybatis整合spring 之 基于接口映射的多对一关系

时间:2021-05-25 06:23:11

转载自:http://my.oschina.net/huangcongmin12/blog/83731

mybatis整合spring 之  基于接口映射的多对一关系。

项目用到俩个表,即student表和school表。表结构如下:

school表:

mybatis整合spring 之 基于接口映射的多对一关系

student表:

mybatis整合spring 之 基于接口映射的多对一关系

项目结构如下:

mybatis整合spring 之 基于接口映射的多对一关系

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:女