Mybatis的多对多映射

一、Mybatis的多对多映射

  本例讲述使用mybatis开发过程中常见的多对多映射查询案例。只抽取关键代码和mapper文件中的关键sql和配置,详细的工程搭建和Mybatis详细的流程代码可参见《Mybatis入门和简单Demo》和《Mybatis的CRUD案例

  完整的工程代码已上传至https://files.cnblogs.com/files/jiyukai/MyBatis.zip

  案例:查询xx同学所选择的多个不同选修课,查询xx选修课被多少同学选修

  步骤1.建表脚本,分别创建学生表,课程表,以及学生课程表,作为学生关系到课程的中间关联表。

create table students(
    sid int(5) primary key,
    sname varchar(10)
);
create table courses(
    cid int(5) primary key,
    cname varchar(10)
);
create table course_stu(
    sid int(5),
    cid int(5),
    primary key(sid,cid)
);
insert into students(sid,sname) values(1,‘cat‘);
insert into students(sid,sname) values(2,‘dog‘);
insert into courses(cid,cname) values(1,‘java‘);
insert into courses(cid,cname) values(2,‘net‘);
insert into course_stu(sid,cid) values(1,1);
insert into course_stu(sid,cid) values(1,2);
insert into course_stu(sid,cid) values(2,1);
insert into course_stu(sid,cid) values(2,2);

  步骤2.编写课程和学生实体类,学生可选择多门课程,课程中有多个学生,因此在各自的实体类中都以集合的形式引入对方

package com.jyk.mybatis.moreTomore;

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

public class Course {
    private Integer id;                        //课程id
    private String name;                    //课程名称
    private List<Student> studentList = new ArrayList<Student>();    //对应的学生名称
    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<Student> getStudentList() {
        return studentList;
    }
    public void setStudentList(List<Student> studentList) {
        this.studentList = studentList;
    }
}
package com.jyk.mybatis.moreTomore;

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

public class Student {
    private Integer id;                //学生id
    private String name;            //学生姓名
    private List<Course> courseList = new ArrayList<Course>();   //选修的课程
    public Student(){}
    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> getCourseList() {
        return courseList;
    }
    public void setCourseList(List<Course> courseList) {
        this.courseList = courseList;
    }
}

  步骤3.编写mapper文件,在CourseMapper.xml中编写课程信息表字段与实体属性的映射关系,在StudentMapper.xml中编写学生实体和表字段的映射关系,并编写好根据学生姓名查询所有选修课程,以及根据选修课名称查询有多少学生的SQL,并将mapper文件和对应实体类的别名加入mybatis.xml(mybatis.xml的描述见Mybatis系列第一篇博客,此处由于配置type时指定了类的全路径,故无需将别名加入至mybatis.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="studentNamespace">
    <resultMap type="com.jyk.mybatis.moreTomore.Student" id="studentMap">
        <id property="id" column="sid" />
        <result property="name" column="sname"/>
    </resultMap>

    <!-- 查询java课程有哪些学生 -->
    <select id="findStudentByName" parameterType="string" resultMap="studentMap">
        select s.sid,s.sname
        from students s,course_stu m,courses c
        where s.sid = m.sid
        and m.cid = c.cid
        and c.cname = #{name}
    </select>
</mapper>
<?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.jyk.mybatis.moreTomore.Course" id="courseMap">
        <id property="id" column="cid" />
        <result property="name" column="cname"/>
    </resultMap>

    <!-- 查询cat选学的课程 -->
    <select id="findCourseByName" parameterType="string" resultMap="courseMap">
        select c.cid,c.cname
        from students s,course_stu m,courses c
        where s.sid = m.sid
        and m.cid = c.cid
        and s.sname = #{name}
    </select>
</mapper>
<?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>

    </typeAliases>

    <!-- 设置一个默认的连接环境信息 -->
    <environments default="mysql_env">
        <!-- 连接环境信息,取一个唯一的编号 -->
        <environment id="mysql_env">
            <!-- mybatis使用的jdbc事务管理方式 -->
            <transactionManager type="jdbc">
            </transactionManager>

            <!-- mybatis使用连接池方式来获取链接 -->
            <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/jyk/mybatis/moreTomore/CourseMapper.xml"/>
        <mapper resource="com/jyk/mybatis/moreTomore/StudentMapper.xml"/>
    </mappers>

</configuration>

  步骤4.编写Java代码实现该多对多查询,需要注意的是,区分于一对一查询,此处由于查询的结果有多个,是集合的形式返回,故查询的API应使用SqlSession提供的selectList接口而不再是selectOne。

package com.jyk.mybatis.moreTomore;

import java.util.List;
import org.apache.ibatis.session.SqlSession;

import com.jyk.mybatis.util.MyBatisUtil;

public class StudentCourseDao {
    /**
     * 查询cat选学的课程
     */
    public List<Course> findCourseByName(String name) throws Exception{
        SqlSession sqlSession = null;
        try{
            sqlSession = MyBatisUtil.getSqlSession();
            return sqlSession.selectList("courseNamespace.findCourseByName",name);
        }catch(Exception e){
            e.printStackTrace();
            throw e;
        }finally{
            MyBatisUtil.closeSqlSession();
        }
    }
    /**
     * 查询java课程有哪些学生
     */
    public List<Student> findStudentByName(String name) throws Exception{
        SqlSession sqlSession = null;
        try{
            sqlSession = MyBatisUtil.getSqlSession();
            return sqlSession.selectList("studentNamespace.findStudentByName",name);
        }catch(Exception e){
            e.printStackTrace();
            throw e;
        }finally{
            MyBatisUtil.closeSqlSession();
        }
    }
    public static void main(String[] args) throws Exception{
        StudentCourseDao dao = new StudentCourseDao();
        List<Course> courseList = dao.findCourseByName("cat");
        for(Course c : courseList){
            System.out.println(c.getId()+":"+c.getName());
        }
        /*List<Student> studentList = dao.findStudentByName("java");
        for(Student s : studentList){
            System.out.println(s.getId()+":"+s.getName());
        }*/
    }
}

原文地址:https://www.cnblogs.com/jiyukai/p/9459535.html

时间: 2024-10-28 15:55:49

Mybatis的多对多映射的相关文章

MyBatis Review——多对多映射

示例: 查询用户及用户购买商品信息. sql语句: SELECT orders.*, USER .username ,USER .sex, USER .address, orderdetail.id as orderdetail_id, orderdetail.items_id, orderdetail.items_num, orderdetail.orders_id, items.`name` items_name, items.detail items_detail, items.price

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

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

mybatis懒加载特性详解,以及多对多映射详解

注意讲解都在代码中 准备数据库,测试数据,各位自己添加,因为是多对多,所以使用中间表: 用到的实体: 学生类: public class Student { private Integer sid; private String name; private Integer age; //一个学生有多个老师,一个老师有多个学生 private List<Teacher> teachers=new ArrayList<Teacher>(); setter.. getter.... to

(6)MyBatis之多对多关联

引言 MyBatis之多对多 1 创建我们的数据库 2 创建Student持久化类 3 创建Course持久化类 4 创建CS持久化类用于查询某学生某课程的成绩 5 根据需求编写映射文件 51 Student的映射文件 52 Course映射文件 53 CS映射文件 6 编写SQL相应的语句 61 查询选修某课程的所有学生一个Course对象里面有Student数组 62 查询某学生查询的课程信息一个Student对象里面有Course数组 63 查询某学生某课程的成绩信息 7 编写测试类 71

MyBatis的对象关系映射---一对多N+1策略★★★★★

在实际开发中,一个业务可能涉及到多个数据表的查询,那么多表查询就涉及连接查询(等值连接), 等值连接 表与表之间有一个外键关键,但是程序中最终获取的表封装的对象, 对象与对象之间是没有外键关系的,对象和对象之间只有依赖关系: 对象之间关系主要是四种: 一对一 关系一个人对应身份证id,一个QQ号对应一个QQ空间 一对多 关系 一个部门对应多个员工 多对一 关系 多个员工对应一个部门 多对多 关系 多个学生对应多个老师,多个学生对应多个课程 什么关系应该从哪个对象作为中心点来看 一对多, 以one

MyBatis的一对一关联关系映射

原文链接:http://www.yiidian.com/mybatis/one-to-one.html 1 什么是一对一.一对多映射? 以用户和订单举例, 一对一 : 一个订单只属于一个用户 ==> 订单对用户是一对一关系 一对多 : 一个用户可以拥有多个订单 ==> 用户对订单是一对多关系 注意:在MyBatis中,如果要完成多对多关系,其实就是两个一对多映射! 接下来先讲解MyBatis的一对一映射如何实现. 2 建立表结构 2.1 创建用户表 CREATE TABLE `t_user`

MyBatis之多对一关系

MyBatis之多对一和一对多 多对一理解 多对一理解起来就是多张表中的数据对应一个数据,比如Student表中多个学生对应Teacher表中的一位老师.(这里指的是学校里上课的老师)通俗理解就是一个老师可以教多个学生 MyBatis中在处理多对一的sql语句方式有两种,一种是以子查询的方式,另一种是联表查询 子查询sql语句简单,但是映射关系相对复杂 下面是在MyBatis中StudentMapper.xml用子查询方式进行多对一查询 <mapper namespace="com.wcz

MyBatis框架中Mapper映射配置的使用及原理解析(七) MapperProxy,MapperProxyFactory

从上文<MyBatis框架中Mapper映射配置的使用及原理解析(六) MapperRegistry> 中我们知道DefaultSqlSession的getMapper方法,最后是通过MapperRegistry对象获得Mapper实例: public <T> T getMapper(Class<T> type, SqlSession sqlSession) { final MapperProxyFactory<T> mapperProxyFactory =

MyBatis框架中Mapper映射配置的使用及原理解析(三) 配置篇 Configuration

从上文<MyBatis框架中Mapper映射配置的使用及原理解析(二) 配置篇 SqlSessionFactoryBuilder,XMLConfigBuilder> 我们知道XMLConfigBuilder调用parse()方法解析Mybatis配置文件,生成Configuration对象. Configuration类主要是用来存储对Mybatis的配置文件及mapper文件解析后的数据,Configuration对象会贯穿整个Mybatis的执行流程,为Mybatis的执行过程提供必要的配