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.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关 ...
随机推荐
- 主成分分析(PCA)模型概述
数据降维 降维是对数据高维度特征的一种预处理方法.降维是将高维度的数据保留下最重要的一些特征,去除噪声和不重要的特征,从而实现提升数据处理速度的目的.在实际的生产和应用中,降维在一定信息损失范围内,可 ...
- 初窥Android AudioFlinger
Android AudioFlinger 是Android音频系统的两大服务之一,另一个服务是AudioPolicyService,这两大服务都在系统启动时有MediaSever加载,加载的代码位于 ...
- ubuntu 18.04 添加快快捷方式
1. 创建启动软件的快捷方式的文件 # cd ~/桌面 # vim pycharm18.1.desktop # 注意文件的后缀是 .desktop [Desktop Entry] Version=1. ...
- Python基本小程序
目录 Python基本小程序 一.筛选从1-100所有的奇数 二.筛选从0-100所有的偶数 三.求1-100之间所有的偶数和,奇数和 四.三个数由小到大输出 五.四个数字重复数字的三位数 Pytho ...
- [面试专题]Web缓存详解
Web缓存详解 标签(空格分隔): 缓存 缓存之于性能优化 请求更快:通过将内容缓存在本地浏览器或距离最近的缓存服务器(如CDN),在不影响网站交互的前提下可以大大加快网站加载速度. 降低服务器压力: ...
- 「ReStory」在 Markdown 中自由书写 React 组件 (Beta)
介绍 先睹为快 我们在开发一个小小的 React 组件库,但是我们遇到了一个大难题,那就是为我们的组件库书写一个合理的文档. 作为组件文档,我们非常希望我们的组件用例代码能够展现出来,是的我们在书写文 ...
- mongoose-面向对象操作mongodb的Nodejs框架
介绍 无论是mysql还是mongodb,传统的与数据库交互的方式都是按照他们提供的API来写代码.它们提供的API往往不是很容易理解,而且难以记忆,如果传错了参数,写错一个符号都要查文档. ORM( ...
- java递归树形菜单显示
今天写权限整好涉及到一些菜单的显示,最先想到的是递归遍历输出,但是呢在网上找了很多有关的资料没有符合自己需求的所以就自己写了一个,如果觉得靠谱 请点点关注!!!赞一个 首先看一些设计的数据库设计 菜单 ...
- Xcode调试之exc_bad_access以及 message sent to deallocated instance
如果出现exc_bad_access错误,基本上是由于内存泄漏,错误释放,对一个已经释放的对象进行release操作.但是xcode有时候不会告诉你错误在什么地方(Visual Studio这点做得很 ...
- 分布式图数据库 Nebula Graph 的 Index 实践
导读 索引是数据库系统中不可或缺的一个功能,数据库索引好比是书的目录,能加快数据库的查询速度,其实质是数据库管理系统中一个排序的数据结构.不同的数据库系统有不同的排序结构,目前常见的索引实现类型如 B ...