Mybatis入门(四)------联表查询
Mybatis联表查询
一、1对1查询
1、数据库建表
假设一个老师带一个学生
CREATE TABLE teacher(
t_id INT PRIMARY KEY,
t_name VARCHAR(30)
);
CREATE TABLE student(
s_id INT PRIMARY KEY,
s_name VARCHAR(30),
t_id INT ,
FOREIGN KEY(t_id) REFERENCES teacher(t_id)
);
INSERT INTO teacher VALUES(1, "wanglaoshi");
INSERT INTO student VALUES(1, "zhangsan", 1);
2、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="com.mybatis.mapper.TeacherMapper">
<!-- 关联查询中你需要告诉 MyBatis 如何加载关联。MyBatis 在这方面会有两种不同的方式: -->
<!-- 1、嵌套结果:使用嵌套结果映射来处理重复的联合结果的子集 -->
<resultMap type="com.mybatis.model.Student" id="Student1">
<id column="s_id" property="id"></id>
<result column="s_name" property="name"></result>
<association property="teacher" javaType="com.mybatis.model.Teacher">
<id column="t_id" property="id"></id>
<result column="t_name" property="name"></result>
</association>
</resultMap>
<select id="selectStudent1" resultMap="Student1">
select * from student s, teacher t where t.t_id = s.t_id and s.s_id = #{id}
</select>
<!-- 2、嵌套查询:通过执行另外一个 SQL 映射语句来返回预期的复杂类型 -->
<resultMap type="com.mybatis.model.Student" id="Student2">
<id column="s_id" property="id"></id>
<result column="s_name" property="name"></result>
<association column="t_id" property="teacher" select="selectTeacher"></association>
</resultMap>
<select id="selectStudent2" resultMap="Student2">
select * from student s, teacher t where t.t_id = s.t_id and s.s_id = #{id}
</select>
<select id="selectTeacher" resultType="com.mybatis.model.Teacher">
select t_id id, t_name name from teacher t where t.t_id = #{id}
</select>
</mapper>
3、在Configuration.xml中注册TeacherMapper.xml
<mappers>
<!-- 注册UserMapper.xml文件 -->
<mapper resource="com/mybatis/mapper/UserMapper.xml"/>
<!-- 注册TeacherMapper.xml文件 -->
<mapper resource="com/mybatis/mapper/TeacherMapper.xml"/>
<!-- 注册UserMapperI接口 -->
<mapper class="com.mybatis.mapper.UserMapperI"/>
</mappers>
4、编写JavaBean
public class Teacher {
//主键
private String id;
//姓名
private String name;
//学生
private Student student;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
}
public class Student {
//主键
private String id;
//姓名
private String name;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
5、单元测试代码
public class DbTest4 {
private SqlSessionFactory sqlSessionFactory;
@Before
public void init() throws IOException {
//通过mybatis提供的资源加载类加载配置文件
Reader reader = Resources.getResourceAsReader("Configuration.xml");
//获取SqlSessionFactoryBuilder
SqlSessionFactoryBuilder sqlSessionFactroyBuilder = new SqlSessionFactoryBuilder();
//根据XML配置文件构建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = sqlSessionFactroyBuilder.build(reader);
this.sqlSessionFactory = sqlSessionFactory;
}
@Test
public void queryStudent1() {
SqlSession session = sqlSessionFactory.openSession(true);
try {
Teacher teacher = session.selectOne("com.mybatis.mapper.TeacherMapper.selectTeacher1", 1);
System.out.println(JsonUtils.objectToJsonString(teacher));
} finally {
session.close();
}
}
@Test
public void queryStudent2() {
SqlSession session = sqlSessionFactory.openSession(true);
try {
Teacher teacher = session.selectOne("com.mybatis.mapper.TeacherMapper.selectTeacher2", 1);
System.out.println(JsonUtils.objectToJsonString(teacher));
} finally {
session.close();
}
}
}
6、输出结果
嵌套结果:
嵌套查询
二、1对多查询
1、数据库建表
CREATE TABLE task(
task_id INT PRIMARY KEY,
description VARCHAR(50),
score DOUBLE,
s_id INT,
FOREIGN KEY(s_id) REFERENCES student(s_id)
);
INSERT INTO task VALUES(1, "数学作业", "100", 1);
INSERT INTO task VALUES(2, "英语作业", "98", 1);
2、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="com.mybatis.mapper.TeacherMapper">
<resultMap type="com.mybatis.model.Teacher" id="Teacher">
<id column="t_id" property="id"></id>
<result column="t_name" property="name"></result>
<association property="student" javaType="com.mybatis.model.Student">
<id column="s_id" property="id"></id>
<result column="s_name" property="name"></result>
<collection property="tasks" ofType="com.mybatis.model.Task">
<id column="task_id" property="id"></id>
<result column="description" property="description"></result>
<result column="score" property="score"></result>
</collection>
</association>
</resultMap>
<select id="selectTeacher" resultMap="Teacher">
select * from student s, teacher t, task e where t.t_id = s.t_id and e.s_id = s.s_id and t.t_id = #{id}
</select>
</mapper>
3、编写JavaBean
public class Teacher {
//主键
private String id;
//姓名
private String name;
//学生
private Student student;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
}
public class Student {
//主键
private String id;
//姓名
private String name;
//作业集合
private List<Task> tasks;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Task> getTasks() {
return tasks;
}
public void setTasks(List<Task> tasks) {
this.tasks = tasks;
}
}
public class Task {
//主键
private String id;
//描述
private String description;
//分数
private double score;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public double getScore() {
return score;
}
public void setScore(double score) {
this.score = score;
}
}
4、单元测试代码
public class DbTest5 {
private SqlSessionFactory sqlSessionFactory;
@Before
public void init() throws IOException {
//通过mybatis提供的资源加载类加载配置文件
Reader reader = Resources.getResourceAsReader("Configuration.xml");
//获取SqlSessionFactoryBuilder
SqlSessionFactoryBuilder sqlSessionFactroyBuilder = new SqlSessionFactoryBuilder();
//根据XML配置文件构建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = sqlSessionFactroyBuilder.build(reader);
this.sqlSessionFactory = sqlSessionFactory;
}
@Test
public void queryStudent() {
SqlSession session = sqlSessionFactory.openSession(true);
try {
Teacher teacher = session.selectOne("com.mybatis.mapper.TeacherMapper.selectTeacher", 1);
System.out.println(JsonUtils.objectToJsonString(teacher));
} finally {
session.close();
}
}
}
5、输出结果
Mybatis入门(四)------联表查询的更多相关文章
- mybatis一对多联表查询的两种常见方式
1.嵌套结果查询(部分代码如下) sql语句接上: 注释:class表(c别名),student表teacher(t别名)teacher_id为class表的字段t_id为teacher表的字段,因为 ...
- MyBatis联表查询
MyBatis逆向工程主要用于单表操作,那么需要进行联表操作时,往往需要我们自己去写sql语句. 写sql语句之前,我们先修改一下实体类 Course.java: public class Cours ...
- mybatis 联表查询
一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关 ...
- MyBatis学习存档(5)——联表查询
之前的数据库操作都是基于一张表进行操作的,若一次查询涉及到多张表,那该如何进行操作呢? 首先明确联表查询的几个关系,大体可以分为一对一和一对多这两种情况,接下来对这两种情况进行分析: 一.建立表.添加 ...
- mybatis之联表查询
今天碰到了一个问题,就是要在三张表里面各取一部分数据然后组成一个list传到前台页面显示.但是并不想在后台做太多判断,(因为涉及到for循环)会拉慢运行速度.正好用的框架是spring+springM ...
- Mybatis框架-联表查询显示问题解决
需求:查询结果要求显示用户名,用户密码,用户的角色 因为在用户表中只有用户角色码值,没有对应的名称,角色名称是在码表smbms_role表中,这时我们就需要联表查询了. 这里需要在User实体类中添加 ...
- Spring Hibernate JPA 联表查询 复杂查询(转)
今天刷网,才发现: 1)如果想用hibernate注解,是不是一定会用到jpa的? 是.如果hibernate认为jpa的注解够用,就直接用.否则会弄一个自己的出来作为补充. 2)jpa和hibern ...
- Spring Hibernate JPA 联表查询 复杂查询
今天刷网,才发现: 1)如果想用hibernate注解,是不是一定会用到jpa的? 是.如果hibernate认为jpa的注解够用,就直接用.否则会弄一个自己的出来作为补充. 2)jpa和hibern ...
- FreeSql (十七)联表查询
FreeSql在查询数据下足了功能,链式查询语法.多表查询.表达式函数支持得非常到位. IFreeSql fsql = new FreeSql.FreeSqlBuilder() .UseConnect ...
随机推荐
- MySQL组复制MGR(一)-- 技术概述
(一)复制技术的发展 MySQL的复制技术主要经历了异步主从复制,半同步复制,组复制(Group Replication)3个阶段. (1)传统的异步主从复制 传统的MySQL提供了一种简单的主从复制 ...
- 常用mongo使用方式(限本人)
mongoose连接详情参考官网 在项目中新建db文件夹 connect.js连接mongo: const mongoose=require('mongoose'); mongoose.connect ...
- ken桑带你读源码 之scrapy
开篇声明 文章讲解源码不一定从入口开始 主题更注重 思路讲解以及核心函数 ok? 废话到此为止 /scrapy/downloadermiddlewares/ 文件夹下是下载器的 中间件 ...
- 完了!TCP出了大事!
前情回顾:<非中间人就不能劫持TCP了吗?> 不速之客 夜黑风高,乌云蔽月. 两位不速之客,身着黑衣,一高一矮,潜入Linux帝国. 这一潜就是一个多月,直到他们收到了一条消息······ ...
- 使用hibernate validate做参数校验
1.为什么使用hibernate validate 在开发http接口的时候,参数校验是必须有的一个环节,当参数校验较少的时候,一般是直接按照校验条件做校验,校验不通过,返回错误信息.比如以下校验 ...
- 《JAVA并发编程的艺术》学习笔记
第一章:并发编程的挑战 1.1 上下文切换 即使是单核处理器也支持多线程执行代码,CPU通过给每个线程分配CPU时间片来实现这个机制.时间片是CPU分配给各个线程的时间,因为时间片非常短,所以CPU通 ...
- Python入门看这些,最详细学习书籍推荐
随着人工智能以及脚本开发火热,Python已经被推上一个非常火热的巅峰! 那么,想要学习Python却又不知道从哪里开始的朋友,看这里呀~ Python在整个编程语言来说,是比较容易上手,而且“见效” ...
- 032_go语言中的定时器
代码演示 package main import "fmt" import "time" func main() { timer1 := time.NewTim ...
- 一个Python爬虫工程师学习养成记
大数据的时代,网络爬虫已经成为了获取数据的一个重要手段. 但要学习好爬虫并没有那么简单.首先知识点和方向实在是太多了,它关系到了计算机网络.编程基础.前端开发.后端开发.App 开发与逆向.网络安全. ...
- javascript逻辑判断与循环笔记
短路运算(逻辑中断) 1.短路运算的原理:当有多个表达式(值)时,左边的表达式值可以确定结果的时候就不再继续运算右边的表达式的值 2.逻辑与 && 如果 ...