您的位置:首页 > 编程语言 > Java开发

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

2012-10-18 00:00 567 查看
mybatis整合spring 之 基于接口映射的多对一关系。

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

school表:



student表:



项目结构如下:



1)applicationContext.xml

<?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

<?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

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

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

<?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

<?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

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

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

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

package com.springbatis.service;

import com.springbatis.domain.Student;

public interface StudentService {

public Student loadStudentWithSchool(int student_id);

}


11)SchoolService Implement

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

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

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()

输出:

==》schoolId: 1   schoolNumber:100001  schoolName:清华大学
=====》studentId:1   studentNumber:1007300220  studentName:露西   sex:女
=====》studentId:2   studentNumber:1007300222  studentName:杰克   sex:男
=====》studentId:4   studentNumber:1007300225  studentName:露露   sex:女
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息