前幾天有網友問到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); } }
CourseMapper和CourseDao在spring中的配置以下:
<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)。在這個類中,咱們讓id爲8的學生(劉曉)選修id爲1的課程(數據結構)。代碼以下:
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); } }
運行結束後,選修表中已插入了這名學生的選課信息,以下圖所示。
MyBatis技術交流羣:188972810,或掃描二維碼:
【MyBatis學習筆記】系列之預備篇一:ant的下載與安裝
【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