MyBatis系列:(8)多对多映射

0、准备SQL(mysql)

CREATE TABLE Teachers(
	tid INT(5) PRIMARY KEY,
	tname VARCHAR(10)
);

CREATE TABLE Courses(
	cid INT(5) PRIMARY KEY,
	cname VARCHAR(10)
);

CREATE TABLE R_Teacher_Course(
	tid INT(5),
	cid INT(5),
	PRIMARY KEY(tid,cid),
	CONSTRAINT r_teacher_fk FOREIGN KEY(tid) REFERENCES Teachers(tid),
	CONSTRAINT r_course_fk FOREIGN KEY(cid) REFERENCES Courses(cid)
);

INSERT INTO Teachers(tid,tname) VALUES(1,‘张老师‘);
INSERT INTO Teachers(tid,tname) VALUES(2,‘李老师‘);
INSERT INTO Teachers(tid,tname) VALUES(3,‘方老师‘);

INSERT INTO Courses(cid,cname) VALUES(1,‘语文‘);
INSERT INTO Courses(cid,cname) VALUES(2,‘数学‘);
INSERT INTO Courses(cid,cname) VALUES(3,‘英语‘);

INSERT INTO R_Teacher_Course(tid,cid) VALUES(1,1);
INSERT INTO R_Teacher_Course(tid,cid) VALUES(1,2);
INSERT INTO R_Teacher_Course(tid,cid) VALUES(2,2);
INSERT INTO R_Teacher_Course(tid,cid) VALUES(2,3);
INSERT INTO R_Teacher_Course(tid,cid) VALUES(3,3);
INSERT INTO R_Teacher_Course(tid,cid) VALUES(3,1);

SELECT * FROM Teachers;
SELECT * FROM Courses;
SELECT * FROM R_Teacher_Course;

SELECT t.tid,t.tname,c.cid,c.cname 
FROM teachers t 
	INNER JOIN r_teacher_course r ON t.tid=r.tid
	INNER JOIN courses c ON r.cid=c.cid

1、entity类

Teacher.java

package com.rk.entity;

import java.util.ArrayList;
import java.util.List;

public class Teacher {
    private Integer id;
    private String name;
    private List<Course> courses = new ArrayList<Course>();
    public Teacher(){}
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public List<Course> getCourses() {
        return courses;
    }
    public void setCourses(List<Course> courses) {
        this.courses = courses;
    }
    
}

Course.java

package com.rk.entity;

import java.util.ArrayList;
import java.util.List;

public class Course {
    private Integer id;
    private String name;
    private List<Teacher> teachers = new ArrayList<Teacher>();
    public Course(){}
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public List<Teacher> getTeachers() {
        return teachers;
    }
    public void setTeachers(List<Teacher> teachers) {
        this.teachers = teachers;
    }
    
}

2、mybatis的映射文件

TeacherMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="teacherNamespace">
    <resultMap type="com.rk.entity.Teacher" id="teacherMap">
        <id property="id" column="tid"/>
        <result property="name" column="tname"/>
    </resultMap>
    <select id="findTeacherByCourseName" parameterType="string" resultMap="teacherMap">
        select t.tid,t.tname,c.cid,c.cname 
        from teachers t 
                inner join r_teacher_course r on t.tid=r.tid
                inner join courses c on r.cid=c.cid
        where c.cname=#{courseName}
    </select>
</mapper>

CourseMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="courseNamespace">
    <resultMap type="com.rk.entity.Course" id="courseMap">
        <id property="id" column="cid"/>
        <result property="name" column="cname"/>
    </resultMap>
    <select id="findCourseByTeacherName" parameterType="string" resultMap="courseMap">
        select c.cid,c.cname 
        from teachers t 
                inner join r_teacher_course r on t.tid=r.tid
                inner join courses c on r.cid=c.cid
        where t.tname=#{teacherName}       
    </select>
</mapper>

3、mybatis的主配置文件

mybatis.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>
    <properties resource="db.properties"></properties>
    <typeAliases>
        <typeAlias type="com.rk.entity.Emp" alias="emp"/>
    </typeAliases>
    <environments default="mysql_developement">
        <environment id="mysql_developement">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="${mysql.driver}"/>
                <property name="url" value="${mysql.url}"/>
                <property name="username" value="${mysql.username}"/>
                <property name="password" value="${mysql.password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/rk/entity/TeacherMapper.xml"/>
        <mapper resource="com/rk/entity/CourseMapper.xml"/>
    </mappers>
</configuration>

db.properties

mysql.driver=com.mysql.jdbc.Driver
mysql.url=jdbc:mysql://127.0.0.1:3306/testdb
mysql.username=root
mysql.password=root

4、MyBatisUtils.java

package com.rk.utils;

import java.io.IOException;
import java.io.Reader;
import java.sql.Connection;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class MyBatisUtils {
    private static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<SqlSession>();
    private static SqlSessionFactory sqlSessionFactory;
    static{
        try {
            Reader reader = Resources.getResourceAsReader("mybatis.xml");
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }
    
    private MyBatisUtils(){}
    public static SqlSession getSqlSession(){
        SqlSession sqlSession = threadLocal.get();
        if(sqlSession == null){
            sqlSession = sqlSessionFactory.openSession();
            threadLocal.set(sqlSession);
        }
        return sqlSession;
    }
    
    public static void closeSqlSession(){
        SqlSession sqlSession = threadLocal.get();
        if(sqlSession != null){
            sqlSession.close();
            threadLocal.remove();
        }
    }
    
    public static void main(String[] args) {
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        Connection conn = sqlSession.getConnection();
        System.out.println(conn);
    }
}

5、TeacherCourseDao.java

package com.rk.dao;

import java.util.List;

import org.apache.ibatis.session.SqlSession;

import com.rk.entity.Course;
import com.rk.entity.Teacher;
import com.rk.utils.MyBatisUtils;

public class TeacherCourseDao {
    public List<Teacher> findTeacherByCourseName(String courseName){
        SqlSession sqlSession = null;
        try{
            sqlSession = MyBatisUtils.getSqlSession();
            List<Teacher> list = sqlSession.selectList("teacherNamespace.findTeacherByCourseName", courseName);
            sqlSession.commit();
            return list;
        }
        catch(Exception e){
            e.printStackTrace();
            sqlSession.rollback();
            throw new RuntimeException(e);
        }
        finally{
            MyBatisUtils.closeSqlSession();
        }
    }
    
    public List<Course> findCourseByTeacherName(String teacherName){
        SqlSession sqlSession = null;
        try{
            sqlSession = MyBatisUtils.getSqlSession();
            List<Course> list = sqlSession.selectList("courseNamespace.findCourseByTeacherName", teacherName);
            sqlSession.commit();
            return list;
        }
        catch(Exception e){
            e.printStackTrace();
            sqlSession.rollback();
            throw new RuntimeException(e);
        }
        finally{
            MyBatisUtils.closeSqlSession();
        }
    }
    
    public static void main(String[] args) {
        TeacherCourseDao dao = new TeacherCourseDao();
        List<Teacher> teacherList = dao.findTeacherByCourseName("数学");
        for(Teacher teacher : teacherList){
            System.out.println(teacher.getName());
        }
        
        List<Course> courseList = dao.findCourseByTeacherName("李老师");
        for(Course course : courseList){
            System.out.println(course.getName());
        }
    }
}
时间: 2024-10-04 18:01:47

MyBatis系列:(8)多对多映射的相关文章

MyBatis 系列五 之 关联映射

MyBatis 系列五 之 关联映射 一对多的关联映射 一对多关联查询多表数据 1.1在MyBatis映射文件中做如下配置 <!--一对多单向的连接两表的查询--> <resultMap type="Dept" id="deptMapper"> <id property="deptNo" column="deptNo"/> <result property="deptName

mybatis系列笔记(4)---输入输出映射

输入输出映射 通过parameterType制定输入参数类型 类型可以是简单类型(int String)也可以是POJO本身 或者包装类 1输入映射 关于输入简单类型和pojo本身的我就不写了,因为比较简单,下面我主要举一个包装类的例子: 使用包装类POJO 将复杂的查询条件封装到POJO中 1 //当你继承user属性后,你就可以在user的基础上添加自己的属性了 2 public class UserCustomer extends User { 3 4 //用户的基本信息 5 //可以扩展

【MyBatis学习10】高级映射之多对多查询

本文来总结一下mybatis中的多对多映射,从第8节的文章中可以看出,用户表和商品表示多对多关系,它们两的多对多是通过订单项和订单明细这两张表所关联起来的,那么这一节主要来总结一下用户表和商品表之间的多对多映射. 首先在上一节的基础上继续写sql, SELECT orders.*, user.`username`, user.`sex`, user.`address`, orderdetail.`id` orderdetail_id, orderdetail.`items_id`, orderd

深入浅出Mybatis系列(八)---mapper映射文件配置之select、resultMap[转]

上篇<深入浅出Mybatis系列(七)---mapper映射文件配置之insert.update.delete>介绍了insert.update.delete的用法,本篇将介绍select.resultMap的用法.select无疑是我们最常用,也是最复杂的,mybatis通过resultMap能帮助我们很好地进行高级映射.下面就开始看看select 以及 resultMap的用法: 先看select的配置吧: <select <!-- 1. id (必须配置) id是命名空间中的

深入浅出Mybatis系列(八)---mapper映射文件配置之select、resultMap good

上篇<深入浅出Mybatis系列(七)---mapper映射文件配置之insert.update.delete>介绍了insert.update.delete的用法,本篇将介绍select.resultMap的用法.select无疑是我们最常用,也是最复杂的,mybatis通过resultMap能帮助我们很好地进行高级映射.下面就开始看看select 以及 resultMap的用法: 先看select的配置吧: <select <!-- 1. id (必须配置) id是命名空间中的

深入浅出Mybatis系列(八)---mapper映射文件配置之select、resultMap

上篇<深入浅出Mybatis系列(七)---mapper映射文件配置之insert.update.delete>介绍了insert.update.delete的用法,本篇将介绍select.resultMap的用法.select无疑是我们最常用,也是最复杂的,mybatis通过resultMap能帮助我们很好地进行高级映射.下面就开始看看select 以及 resultMap的用法: 先看select的配置吧: <select <!-- 1. id (必须配置) id是命名空间中的

Mybatis的多对多映射

一.Mybatis的多对多映射 本例讲述使用mybatis开发过程中常见的多对多映射查询案例.只抽取关键代码和mapper文件中的关键sql和配置,详细的工程搭建和Mybatis详细的流程代码可参见<Mybatis入门和简单Demo>和<Mybatis的CRUD案例> 完整的工程代码已上传至https://files.cnblogs.com/files/jiyukai/MyBatis.zip 案例:查询xx同学所选择的多个不同选修课,查询xx选修课被多少同学选修 步骤1.建表脚本,

深入浅出Mybatis系列(七)---mapper映射文件配置之insert、update、delete[转]

上篇文章<深入浅出Mybatis系列(六)---objectFactory.plugins.mappers简介与配置>简单地给mybatis的配置画上了一个句号.那么从本篇文章开始,将会介绍mapper映射文件的配置, 这是mybatis的核心之一,一定要学好.在mapper文件中,以mapper作为根节点,其下面可以配置的元素节点有: select, insert, update, delete, cache, cache-ref, resultMap, sql . 本篇文章将简单介绍 in

三、MyBatis系列:Mapper 映射 之 通过mapper映射文件来读取数据库记录

在使用Mybatis从数据库中获取记录时,仅编写一个映射xml文件即可.这便是mybatis的强大之处,据说可以比普通jdbc要节省95%的代码.先来看看如何获取记录,工程配置请参考<一.MyBatis系列:第一个MyBatis工程>: 1.Mapper配置文件内容 1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE mapper PUBLIC "-//mybatis.o

Mybatis(四) 高级映射,一对一,一对多,多对多映射

天气甚好,怎能不学习? 一.单向和双向 包括一对一,一对多,多对多这三种情况,但是每一种又分为单向和双向,在hibernate中我们就详细解析过这单向和双向是啥意思,在这里,在重复一遍,就拿一对多这种关系来讲,比如有员工和部门,一个部门中有多个员工,从部门方看,是一对多关系,而多名员工属于一个部门,是多对一关系,那么如果我们的业务需求只需要通过部门查找到所有的员工,那么我们就只需要进行单向一对多的映射,如果我们需要通过员工来查询出对应的部门,那么我们就需要进行单向多对一的映射,而如果我们这两个业