MyBatis框架——多表查询
MyBatis多表查询,
从表中映射主表,使用 association 标签,通过设置 javaType 属性关联实体类;
主表映射从表,使用 collection 标签,通过 ofType 属性关联实体类。
示例:
1、创建数据库
/* Navicat MySQL Data Transfer Source Server : localhost Source Server Version : 50620 Source Host : 127.0.0.1:3306 Source Database : mybatis Target Server Type : MYSQL Target Server Version : 50620 File Encoding : 65001 Date: 2020-03-22 16:50:26 */ ; -- ---------------------------- -- Table structure for classes -- ---------------------------- DROP TABLE IF EXISTS `classes`; CREATE TABLE `classes` ( `id` ) NOT NULL, `name` ) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of classes -- ---------------------------- ', '1班'); ', '2班'); ', '3班'); ', '4班'); -- ---------------------------- -- Table structure for course -- ---------------------------- DROP TABLE IF EXISTS `course`; CREATE TABLE `course` ( `id` ) NOT NULL AUTO_INCREMENT, `name` ) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of course -- ---------------------------- ', 'java'); ', 'python'); -- ---------------------------- -- Table structure for course_student -- ---------------------------- DROP TABLE IF EXISTS `course_student`; CREATE TABLE `course_student` ( `id` ) NOT NULL AUTO_INCREMENT, `sid` ) NOT NULL, `cid` ) NOT NULL, PRIMARY KEY (`id`), KEY `sid` (`sid`), KEY `cid` (`cid`), CONSTRAINT `course_student_ibfk_1` FOREIGN KEY (`sid`) REFERENCES `student` (`id`), CONSTRAINT `course_student_ibfk_3` FOREIGN KEY (`cid`) REFERENCES `course` (`id`) ) ENGINE DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of course_student -- ---------------------------- '); -- ---------------------------- -- Table structure for student -- ---------------------------- DROP TABLE IF EXISTS `student`; CREATE TABLE `student` ( `id` ) NOT NULL AUTO_INCREMENT, `name` ) NOT NULL, `cid` ) NOT NULL, `score` ) DEFAULT NULL, `tel` ) DEFAULT NULL, `address` ) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of student -- ---------------------------- ', '大望路'); ', '知春路'); ', '回龙观'); -- ---------------------------- -- Table structure for t_user -- ---------------------------- DROP TABLE IF EXISTS `t_user`; CREATE TABLE `t_user` ( `id` ) NOT NULL AUTO_INCREMENT, `username` ) DEFAULT NULL, `password` ) DEFAULT NULL, `age` ) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of t_user -- ---------------------------- '); '); ');
2、编写实体类
package com.sunjian.entity; /** * @author sunjian * @date 2020/3/22 14:21 */ public class Student { private Integer id; private String name; private Integer score; private String tel; private String address; private Classes classes; private Course course; public Course getCourse() { return course; } public void setCourse(Course course) { this.course = course; } @Override public String toString() { return "Student{" + "id=" + id + ", name='" + name + '\'' + ", score=" + score + ", tel='" + tel + '\'' + ", address='" + address + '\'' + ", classes=" + classes + ", course=" + course + '}'; } public Integer getId() { return id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getScore() { return score; } public void setScore(Integer score) { this.score = score; } public String getTel() { return tel; } public void setTel(String tel) { this.tel = tel; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public Classes getClasses() { return classes; } public void setClasses(Classes classes) { this.classes = classes; } }
package com.sunjian.entity; import java.util.List; /** * @author sunjian * @date 2020/3/22 14:20 */ public class Classes { private Integer id; private String name; private List<Student> students; @Override public String toString() { return "Classes{" + "id=" + id + ", name='" + name + '\'' + ", students=" + students + '}'; } public List<Student> getStudents() { return students; } public void setStudents(List<Student> students) { this.students = students; } 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; } }
package com.sunjian.entity; import java.util.List; /** * @author sunjian * @date 2020/3/22 15:53 */ public class Course { private Integer id; private String name; private List<Student> students; private Classes classes; public Classes getClasses() { return classes; } public void setClasses(Classes classes) { this.classes = classes; } @Override public String toString() { return "Course{" + "id=" + id + ", name='" + name + '\'' + ", students=" + students + ", classes=" + classes + '}'; } 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> getStudents() { return students; } public void setStudents(List<Student> students) { this.students = students; } }
3、编写repository接口
package com.sunjian.repository; import com.sunjian.entity.Student; /** 一对一 * @author sunjian * @date 2020/3/22 14:33 */ public interface StudentRepository { public Student findStudentById(Integer id); }
package com.sunjian.repository; import com.sunjian.entity.Classes; import com.sunjian.entity.Student; import java.util.List; /** 一对多 * @author sunjian * @date 2020/3/22 15:07 */ public interface ClassesRepository { public Classes findClassById(Integer id); }
package com.sunjian.repository; import com.sunjian.entity.Course; /** 多对多 * @author sunjian * @date 2020/3/22 15:56 */ public interface CourseRepository { public Course findCourseById(Integer id); }
4、编写mapper.xml文件
StudentRepository.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="com.sunjian.repository.StudentRepository"> <!-- 一对一 --> <resultMap id="studentMap" type="com.sunjian.entity.Student"> <id property="id" column="sid"></id> <result property="name" column="sname"></result> <result property="score" column="score"></result> <result property="tel" column="tel"></result> <result property="address" column="address"></result> <association property="classes" javaType="com.sunjian.entity.Classes"> <id property="id" column="cid"></id> <result property="name" column="cname"></result> </association> </resultMap> <select id="findStudentById" parameterType="java.lang.Integer" resultMap="studentMap"> select s.id sid, s.name sname, s.score, s.tel, s.address, c.id cid, c.name cname from student s, classes c where s.cid = c.id and s.id = #{id} </select> </mapper>
ClassesRepository.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="com.sunjian.repository.ClassesRepository"> <!-- 一对多 --> <resultMap id="classMap" type="com.sunjian.entity.Classes"> <id property="id" column="cid"></id> <result property="name" column="cname"></result> <collection property="students" ofType="com.sunjian.entity.Student"> <id property="id" column="sid"></id> <result property="name" column="sname"></result> <result property="score" column="score"></result> <result property="tel" column="tel"></result> <result property="address" column="address"></result> </collection> </resultMap> <select id="findClassById" parameterType="java.lang.Integer" resultMap="classMap"> select c.id cid, c.name cname, s.id sid, s.name sname, s.score, s.tel, s.address from classes c, student s where s.cid = c.id and c.id = #{id} </select> </mapper>
CourseRepository.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="com.sunjian.repository.CourseRepository"> <!-- 多对多 --> <resultMap id="courseMap" type="com.sunjian.entity.Course"> <id property="id" column="courseid"></id> <result property="name" column="coursename"></result> <collection property="students" ofType="com.sunjian.entity.Student"> <id property="id" column="sid"></id> <result property="name" column="sname"></result> <result property="score" column="score"></result> <result property="tel" column="tel"></result> <result property="address" column="address"></result> </collection> <collection property="classes" ofType="com.sunjian.entity.Classes"> <id property="id" column="classid"></id> <result property="name" column="classname"></result> </collection> </resultMap> <select id="findCourseById" parameterType="java.lang.Integer" resultMap="courseMap"> select s.id sid, s.name sname, score, tel, address, c.id courseid, c.name coursename, cl.id classid, cl.name classname from student s, course c, classes cl, course_student cs where cl.id = s.cid and cs.sid = s.id and cs.cid = c.id and c.id = #{id}; </select> </mapper>
5、在resources下编写全局config.xml文件,将mapper.xml注册到config.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> <!-- 配置 MyBatis 数据源 --> <environments default="development"> <environment id="development"> <!-- JDBC事务管理 --> <transactionManager type="JDBC"></transactionManager> <dataSource type="POOLED"> <property name="driver" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC"/> <property name="username" value="root"/> <property name="password" value="root"/> </dataSource> </environment> </environments> <!-- 注册 --> <mappers> <!-- 单表 --> <mapper resource="com/sunjian/mapper/UserMapper.xml"></mapper> <mapper resource="com/sunjian/repository/UserRepository.xml"></mapper> <!-- 多表 一对一 --> <mapper resource="com/sunjian/repository/StudentRepository.xml"></mapper> <!-- 多表 一对多 --> <mapper resource="com/sunjian/repository/ClassesRepository.xml"></mapper> <!-- 多表 多对多 --> <mapper resource="com/sunjian/repository/CourseRepository.xml"></mapper> </mappers> </configuration>
6、编写测试类
package com.sunjian.test; import com.sunjian.entity.Classes; import com.sunjian.entity.Course; import com.sunjian.entity.Student; import com.sunjian.repository.ClassesRepository; import com.sunjian.repository.CourseRepository; import com.sunjian.repository.StudentRepository; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.InputStream; /** * @author sunjian * @date 2020/3/22 14:40 */ public class TestMoreTable { public static void main(String[] args) { InputStream inputStream = Student.class.getClassLoader().getResourceAsStream("config.xml"); SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder(); SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream); SqlSession sqlSession = sqlSessionFactory.openSession(); // 一对一 StudentRepository studentRepository = sqlSession.getMapper(StudentRepository.class); Student student = studentRepository.findStudentById(2); System.out.println(student); // 一对多 ClassesRepository classesRepository = sqlSession.getMapper(ClassesRepository.class); Classes classes = classesRepository.findClassById(2); System.out.println(classes); // 多对多 CourseRepository courseRepository = sqlSession.getMapper(CourseRepository.class); Course course = courseRepository.findCourseById(2); System.out.println(course); } }
Student{id=2, name='李四', score=91, tel='13502020303', address='知春路', classes=Classes{id=3, name='3班', students=null}, course=null} Classes{id=2, name='2班', students=[Student{id=1, name='张三', score=90, tel='15510211111', address='大望路', classes=null, course=null}, Student{id=3, name='赵六', score=87, tel='18800110011', address='回龙观', classes=null, course=null}]} Course{id=2, name='python', students=[Student{id=1, name='张三', score=90, tel='15510211111', address='大望路', classes=null, course=null}], classes=Classes{id=2, name='2班', students=null}}
OK.
MyBatis框架——多表查询的更多相关文章
- MyBatis框架——单表查询
Mybatis单表查询,示例 1.创建数据库 /* Navicat MySQL Data Transfer Source Server : localhost Source Server Versio ...
- Mybatis框架-联表查询显示问题解决
需求:查询结果要求显示用户名,用户密码,用户的角色 因为在用户表中只有用户角色码值,没有对应的名称,角色名称是在码表smbms_role表中,这时我们就需要联表查询了. 这里需要在User实体类中添加 ...
- Yii框架 多表查询实例
Yii框架多表查询实例:总共分为两个步骤(以下的代码我全部都写在model中):1.先在主表model中声明关联表中所需要查询的字段. public $surveyls_description; // ...
- 使用Mybatis进行连表查询、left join---https://blog.csdn.net/jinzhencs/article/details/51980518
使用Mybatis进行连表查询.left join https://blog.csdn.net/jinzhencs/article/details/51980518
- SpringBoot集成Mybatis实现多表查询的两种方式(基于xml)
下面将在用户和账户进行一对一查询的基础上进行介绍SpringBoot集成Mybatis实现多表查询的基于xml的两种方式. 首先我们先创建两个数据库表,分别是user用户表和account账户表 ...
- MyBatis的多表查询笔记
MyBatis的多表查询 随着学习的进步,需求的提高,我们在实际开发中用的最多的还是多表查询,就让我们一起学习MyBatis中的多表查询. 数据库准备 Class表 Student表 项目结构 这次使 ...
- 07 Mybatis的多表查询1----1对多和多对1---@Results注解用法总结
1.表与表之间的关系及其举例 表之间的关系有4种:一对多.多对一.一对一.多对多. 举例: (1)用户和订单就是一对多 一个用户可以下多个订单 (2)订单和用户就是多对一 多个订单属于同一个用户 (3 ...
- mybatis之联表查询
今天碰到了一个问题,就是要在三张表里面各取一部分数据然后组成一个list传到前台页面显示.但是并不想在后台做太多判断,(因为涉及到for循环)会拉慢运行速度.正好用的框架是spring+springM ...
- MyBatis实现关联表查询
一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关 ...
随机推荐
- Algorithms第3章及少量习题
第三章的主要思想就是DFS.讲了图上的DFS操作,然后讲了各种应用.这章默认图都是用邻接矩阵存的. procedure explore(G, v) Input: G = (V, E) is a gra ...
- windowserver 2012安装openssh
下载https://github.com/PowerShell/Win32-OpenSSH/releases解压放到C:\Program Files\OpenSSH-Win64 进入到C:\Progr ...
- 华为Mate 10牵手Microsoft Translator,让离线翻译可媲美在线神经网
编者按:日前,华为新发布的Mate 10手机系列采用Microsoft Translator技术实现了AI驱动型离线翻译功能.华为Mate 10是首款具有NPU(专用神经处理单元)的手机,可用于加速 ...
- ES Templates push
{ "order": 0, "template": "connector-connection*", "settings" ...
- android编译架构之添加C项目
1. 增加一个项目与android编译中枢息息相关.特别需要告诉编译中枢的一些特别信息. 例如: A 这个项目target名字是什么 B 这个项目编译类型是什么,bin?c?lib?or jar? ...
- SpringBoot入门系列(一)如何快速创建SpringBoot项目
这段时间也没什么事情,所以就重新学习整理了Spring Boot的相关内容.今天开始整理更新Spring Boot学习笔记,感兴趣的朋友可以关注我的博客:https://www.cnblogs.com ...
- PHP压缩文件夹 php
$path = PUBLIC_DIR.'/images/'; //待压缩文件夹父目录 $zipPath = PUBLIC_DIR.'/images_zip/'; //压缩文件保存目录 !is_dir( ...
- fsLayuiPlugin数据字典使用
概述 数据字典主要解决下拉框数据填充和数据表格转义处理,一个数据字典可以多处使用. 1.多个页面下拉框使用同样的数据,改一个地方需要把所有页面都要修改 2.数据表格转义代替自己手动写templet解析 ...
- EventEmitter:从命令式 JavaScript class 到声明函数式的华丽转身
新书终于截稿,今天稍有空闲,为大家奉献一篇关于 JavaScript 语言风格的文章,主角是函数声明式. 灵活的 JavaScript 及其 multiparadigm 相信"函数式&quo ...
- C#小游戏—钢铁侠VS太空侵略者
身为漫威迷,最近又把<钢铁侠>和<复仇者联盟>系列又重温了一遍,真的是印证了那句话:“读书百遍,其意自现”.看电影一个道理,每看一遍,都有不懂的感受~ 不知道大伙是不是也有同样 ...