MyBatis多對多保存示例——MyBatis學習筆記之十七

前幾天有網友問到MyBatis多對多的問題,不過愧對網友厚愛的是,最近一直忙,直到如今纔有時間處理此事。今天就先寫一個多對多保存的示例,算是對這位網友的初步迴應,之後會有更多相關的博文發表。 html

爲演示多對多,咱們能夠模擬學生選課的情形。一個學生能夠選修多門課程,一門課程能夠被多個學生選修。顯然,這是一種多對多的關係。先建立課程表以下(本文示例完整×××:http://down.51cto.com/data/907686): java

SET FOREIGN_KEY_CHECKS=0;
DROP TABLE IF EXISTS `course`;
CREATE TABLE `course` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`course_code` varchar(20) NOT NULL COMMENT '課程編號',
`course_name` varchar(50) NOT NULL COMMENT '課程名稱',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of course
-- ----------------------------
INSERT INTO `course` VALUES ('1', 'zj01', '數據結構');

接着建立學生選修表,用來保存學生的選課信息,以下: spring

SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for `student_course`
-- ----------------------------
DROP TABLE IF EXISTS `student_course`;
CREATE TABLE `student_course` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`student_id` int(11) NOT NULL COMMENT '選課學生id',
`course_id` int(11) NOT NULL COMMENT '所選課程的id',
PRIMARY KEY (`id`),
KEY `student_id` (`student_id`),
KEY `course_id` (`course_id`),
CONSTRAINT `student_course_ibfk_1` FOREIGN KEY (`student_id`) REFERENCES `student` (`id`),
CONSTRAINT `student_course_ibfk_2` FOREIGN KEY (`course_id`) REFERENCES `course` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;

由以上可看出,表中的student_id字段和course_id字段分別做爲外鍵關聯到了sutdent表和course表的主鍵。 sql

建立對應的課程實體類。 數據結構

package com.abc.domain;
import java.util.List;
public class Course{
private int id;
private String courseCode;  //課程編號
private String courseName;//課程名稱
private List<Student> students;//選課學生
public int getId()
{
return this.id;
}
public void setId(int id)
{
this.id = id;
}
public String getCourseCode()
{
return this.courseCode;
}
public void setCourseCode(String courseCode)
{
this.courseCode = courseCode;
}
public String getCourseName()
{
return this.courseName;
}
public void setCourseName(String courseName)
{
this.courseName = courseName;
}
}

爲學生實體類添加所選課程屬性以下: mybatis

private List<Course> courses;//所選的課程
//getter和setter
public List<Course> getCourses()
{
return this.courses;
}
public void setCourses(List courses)
{
this.courses = courses;
}

接下來爲Course實體編寫映射器接口和文件、DAO類,這與之前同樣。詳見如下代碼,再也不贅述。 app

CourseMapper.java dom

package com.abc.mapper;
import com.abc.domain.Course;
public interface CourseMapper {
public Course getById(int id);
}

CourseMapper.xml ide

<?xml version="1.0" encoding="utf8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.abc.mapper.CourseMapper">
<!--根據id查詢課程-->
<select id="getById" parameterType="int"
resultMap="courseResultMap">
select id,course_code,course_name
from course where id=#{id}
</select>
<!--課程實體映射-->
<resultMap id="courseResultMap" type="Course">
<id property="id" column="id"/>
<result property="courseCode" column="course_code"/>
<result property="courseName" column="course_name"/>
</resultMap>
</mapper>

CourseDao.java 學習

package com.abc.dao;
import com.abc.mapper.CourseMapper;
import com.abc.domain.Course;
public class CourseDao {
private CourseMapper courseMapper;
//studentMapper的setter和getter方法
public void setCourseMapper(CourseMapper courseMapper)
{
this.courseMapper = courseMapper;
}
public CourseMapper getCourseMapper()
{
return this.courseMapper;
}
public Course getById(int id)
{
return this.courseMapper.getById(id);
}
}

CourseMapperCourseDaospring中的配置以下:

<bean id="courseMapper" parent="parentMapper">
<property name="mapperInterface" value="com.abc.mapper.CourseMapper" />
</bean>
<!--爲courseDao注入courseMapper-->
<bean id="courseDao" class="com.abc.dao.CourseDao">
<property name="courseMapper" ref="courseMapper" />
</bean>

要保存學生選課信息,先在StudentMapper接口中添加一個方法,以下:

public void saveElecCourse(Student student, Course course);

映射文件StudentMapper.xml中添加相應的insert語句以下:

<!--這裏param1,param2用到了MyBatis多參數傳遞的默認命名方式,
詳見做者博客:http://legend2011.blog.51cto.com/3018495/1024869-->
<insert id="saveElecCourse"
useGeneratedKeys="true" keyColumn="GENERATED_KEY">
insert into student_course(student_id,course_id)
values(#{param1.id},#{param2.id})
</insert>

在StudentDao類中添加相關方法以下:

//保存學生選課信息
public void saveElecCourse(Student student, Course course)
{
this.studentMapper.saveElecCourse(student, course);
}

接下來是運行類(ManyToManyDemo.java)。在這個類中,咱們讓id8的學生(劉曉)選修id1的課程(數據結構)。代碼以下:

package com.demo;
import org.springframework.context.ApplicationContext;
import com.abc.domain.Student;
import com.abc.domain.Teacher;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.abc.dao.StudentDao;
import com.abc.dao.CourseDao;
import com.abc.domain.Course;
public class ManyToManyDemo
{
private static ApplicationContext ctx;
static
{
//在類路徑下尋找resources/beans.xml文件
ctx = new ClassPathXmlApplicationContext("resources/beans.xml");
}
public static void main(String[] args)
{
//從Spring容器中請求Dao對象
StudentDao studentDao =
(StudentDao)ctx.getBean("studentDao");
CourseDao courseDao =
(CourseDao)ctx.getBean("courseDao");
Student student = studentDao.getById(8);
Course course = courseDao.getById(1);
studentDao.saveElecCourse(student, course);
}
}

運行結束後,選修表中已插入了這名學生的選課信息,以下圖所示。

222243875.png

       猛戳這裏全面系統地學習MyBatis 3

       MyBatis技術交流羣:188972810,或掃描二維碼:

wKioL1SaztmBchKiAADsv4YAWBY259.jpg


【MyBatis學習筆記】系列之預備篇一:ant的下載與安裝

【MyBatis學習筆記】系列之預備篇二:ant入門示例

【MyBatis學習筆記】系列之一:MyBatis入門示例

【MyBatis學習筆記】系列之二:MyBatis增刪改示例

【MyBatis學習筆記】系列之三:MyBatis的association示例

【MyBatis學習筆記】系列之四:MyBatis association的兩種形式

【MyBatis學習筆記】系列之五:MyBatis與Spring集成示例

【MyBatis學習筆記】系列之六:MyBatis與Spring集成示例續

【MyBatis學習筆記】系列之七:MyBatis一對多雙向關聯

【MyBatis學習筆記】系列之八:MyBatis MapperScannerConfigurer配置

【MyBatis學習筆記】系列之九:MyBatis collection的兩種形式

【MyBatis學習筆記】系列之十:MyBatis日誌之Log4j示例

【MyBatis學習筆記】系列之十一:MyBatis多參數傳遞之註解方式示例

【MyBatis學習筆記】系列之十二:MyBatis多參數傳遞之默認命名方式示例

【MyBatis學習筆記】系列之十三:MyBatis多參數傳遞之Map方式示例

【MyBatis學習筆記】系列之十四:MyBatis中的N+1問題

【MyBatis學習筆記】系列之十五:MyBatis多參數傳遞之混合方式

【MyBatis學習筆記】系列之十六:Spring聲明式事務管理示例

【MyBatis學習筆記】系列之十七:MyBatis多對多保存示例

【MyBatis學習筆記】系列之十八:MyBatis多對多關聯查詢示例

【MyBatis學習筆記】系列之十九:如何在MyBatis-3.2.7中使用Log4j2 rc2

MyBatis中如何經過繼承SqlSessionDaoSupport來編寫DAO(一)

MyBatis中如何經過繼承SqlSessionDaoSupport來編寫DAO(二)

相關文章
相關標籤/搜索