【Mybatis】一对多实例
①创建数据库和表,数据库为mytest,表为teacher和student
DROP TABLE IF EXISTS teacher;
DROP TABLE IF EXISTS student; CREATE TABLE teacher(
teacher_id INT PRIMARY KEY auto_increment NOT NULL,
teacher_name VARCHAR(20)
); CREATE TABLE student(
student_id INT PRIMARY KEY auto_increment NOT NULL,
student_name VARCHAR(20),
teacher_id INT
); ALTER TABLE student ADD CONSTRAINT fk_teacher_id FOREIGN KEY (teacher_id) REFERENCES teacher(teacher_id); INSERT INTO teacher(teacher_name) VALUES ("张三丰");
INSERT INTO teacher(teacher_name) VALUES ("王重阳");
INSERT INTO student(student_name, teacher_id) VALUES ("宋远桥", 1);
INSERT INTO student(student_name, teacher_id) VALUES ("俞莲舟", 1);
INSERT INTO student(student_name, teacher_id) VALUES ("俞岱岩", 1);
INSERT INTO student(student_name, teacher_id) VALUES ("张松溪", 1);
INSERT INTO student(student_name, teacher_id) VALUES ("张翠山", 1);
INSERT INTO student(student_name, teacher_id) VALUES ("殷梨亭", 1);
INSERT INTO student(student_name, teacher_id) VALUES ("莫声谷", 1); INSERT INTO student(student_name, teacher_id) VALUES ("丹阳子马钰", 2);
INSERT INTO student(student_name, teacher_id) VALUES ("长真子谭处端", 2);
INSERT INTO student(student_name, teacher_id) VALUES ("长生子刘处玄", 2);
INSERT INTO student(student_name, teacher_id) VALUES ("长春子丘处机", 2);
INSERT INTO student(student_name, teacher_id) VALUES ("玉阳子王处一", 2);
INSERT INTO student(student_name, teacher_id) VALUES ("广宁子郝大通", 2);
INSERT INTO student(student_name, teacher_id) VALUES ("清静散人孙不二", 2);
②创建Java工程,导入相应的jar包

③创建配置文件conf.xml和数据库配置文件db.properties
<?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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${name}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments> <mappers>
<mapper resource="org/mybatis/mapping/teacherMapper.xml"/>
<mapper resource="org/mybatis/mapping/studentMapper.xml"/>
</mappers>
</configuration>
driver = com.mysql.jdbc.Driver
url = jdbc:mysql://localhost:3306/mytest
name = root
password = root
④创建实体类Teacher和Student
package org.mybatis.domain;
import java.util.List;
public class Teacher {
private int teacher_id;
private String teacher_name;
private List<Student> students;
public int getTeacher_id() {
return teacher_id;
}
public void setTeacher_id(int teacher_id) {
this.teacher_id = teacher_id;
}
public String getTeacher_name() {
return teacher_name;
}
public void setTeacher_name(String teacher_name) {
this.teacher_name = teacher_name;
}
public List<Student> getStudents() {
return students;
}
public void setStudents(List<Student> students) {
this.students = students;
}
@Override
public String toString() {
return "[Teacher = teacher_id:" + teacher_id + ", teacher_name:" + teacher_name
+ ", the number of students:" + students.size() + "]";
}
}
package org.mybatis.domain;
public class Student {
private int student_id;
private String student_name;
private Teacher teacher;
public int getStudent_id() {
return student_id;
}
public void setStudent_id(int student_id) {
this.student_id = student_id;
}
public String getStudent_name() {
return student_name;
}
public void setStudent_name(String student_name) {
this.student_name = student_name;
}
public Teacher getTeacher() {
return teacher;
}
public void setTeacher(Teacher teacher) {
this.teacher = teacher;
}
@Override
public String toString() {
return "[Student = student_id:" + student_id + ", student_name:" + student_name +
", teacher:" + teacher.getTeacher_name() + "]";
}
}
⑤创建sql映射文件studentMapper.xml和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="org.mybatis.mapping.studentMapper">
<select id="getStudent" resultMap="getStudentMap">
select * from teacher t, student s where t.teacher_id=s.teacher_id and s.teacher_id=#{id}
</select> <resultMap type="org.mybatis.domain.Student" id="getStudentMap">
<id column="student_id" property="student_id" />
<result column="student_name" property="student_name" />
<association property="teacher" javaType="org.mybatis.domain.Teacher">
<id column="teacher_id" property="teacher_id"/>
<result column="teacher_name" property="teacher_name"/>
</association>
</resultMap>
</mapper>
studentMapper.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="org.mybatis.mapping.teacherMapper">
<select id="getTeacher" resultMap="getTeacherMap">
select * from teacher t, student s where t.teacher_id=s.teacher_id and t.teacher_id=#{id}
</select> <resultMap type="org.mybatis.domain.Teacher" id="getTeacherMap">
<id column="teacher_id" property="teacher_id" />
<result column="teacher_name" property="teacher_name" />
<collection property="students" ofType="org.mybatis.domain.Student">
<id column="student_id" property="student_id"/>
<result column="student_name" property="student_name"/>
</collection>
</resultMap>
</mapper>
teacherMapper.xml
⑥向配置文件中注册 studentMapper.xml和teacherMapper.xml 文件【已添加,查看第③步】
⑦测试类
package org.mybatis.app; import java.io.InputStream;
import java.util.List; import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;
import org.mybatis.domain.Student;
import org.mybatis.domain.Teacher; public class TestOneToMany { SqlSession session; @Before
public void beforeLoad() {
InputStream inputStream =
TestOneToMany.class.getClassLoader().getResourceAsStream("conf.xml");
SqlSessionFactory sqlSessionFactory =
new SqlSessionFactoryBuilder().build(inputStream);
session = sqlSessionFactory.openSession();
} @Test
public void testGetStudents() {
String statement = "org.mybatis.mapping.studentMapper.getStudent";
List<Student> studentList = session.selectList(statement, 1);
for(Student s : studentList) {
System.out.println(s.getStudent_name() + "的师傅是:" + s.getTeacher().getTeacher_name());
} session.close();
} @Test
public void testGetTeacher() {
String statement = "org.mybatis.mapping.teacherMapper.getTeacher";
Teacher t = session.selectOne(statement, 1);
System.out.println(t.getTeacher_name() + "有" + t.getStudents().size() + "个徒弟");
session.close();
} }
⑧结构图

【Mybatis】一对多实例的更多相关文章
- mybatis 一对多的注入 指的是连表查询时候 将不同的查询结果以列表存储对象形式 注入进去 多对一指的是 查询多条结果但都是一样的 只需注入一条
mybatis 一对多的注入 指的是连表查询时候 将不同的查询结果以列表存储对象形式 注入进去 多对一指的是 查询多条结果但都是一样的 只需注入一条
- Java基础-SSM之mybatis一对多和多对一关系映射
Java基础-SSM之mybatis一对多和多对一关系映射 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.准备测试环境(创建数据库表) 1>.创建customers表: ...
- mybatis一对多关联查询+pagehelper->分页错误
mybatis一对多关联查询+pagehelper->分页错误. 现象: 网上其他人遇到的类似问题:https://segmentfault.com/q/1010000009692585 解决: ...
- 1. mybatis 的入门实例
mybatis 的入门实例 1.创建一个普通的Java项目 1.加入jar包(所有mybatis 和mysql) 2.加入配置文件 src 目录下 (1) db.properties mysql.us ...
- MyBatis一对多和多对多xml配置
MyBatis一对多和多对多xml配置 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE ma ...
- mybatis一对多关联关系映射
mybatis一对多关联关系映射 一对多关联关系只需要在多的一方引入少的一方的主键作为外键即可.在实体类中就是反过来,在少的一方添加多的一方,声明一个List 属性名 作为少的一方的属性. 用户和订单 ...
- 3.SpringBoot整合Mybatis(一对多)
前言: Mybatis一对多的处理关系: 一个人有好多本书,每本书的主人只有一个人.当我们查询某个人拥有的所有书籍时,就涉及到了一对多的映射关系. 一.添加数据表: CREATE TABLE `boo ...
- mybatis 一对多查询 集合创建空对象的问题
在做 mybatis 一对多查询的时候, resultMap 里面用到了集合标签 collection ,后来发现 当该条数据没有子集的时候, collection 会自动创建一个属性都是null的对 ...
- mybatis 一对多和多对一 简单案例笔记
以案例说明(以下案例代码都敲过验证过) 多对一(多个学生对一个老师 即学生集合中都存一个老师对象) Mybatis多对一实现方式1: //定义Student 和 Teacher 实体 @Data p ...
- Mybatis 一对多延迟加载,并且子查询中与主表字段不对应 (19)
Mybatis 一对多延迟加载,并且子查询中与主表字段不对应应用说明. 实现一对多关联(懒加载),一个教研组对应多个教师,既:教师的教研编号与教研组的教研编号关联,并且教师关联教研组外键与教研组编号 ...
随机推荐
- 使用 JSON-lib 出现异常 java.lang.reflect.InvocationTargetException
我是在使用json时引起的这个异常,上面是使用json-lib用到的几个jar包,原因是在commons-lang3-3.1.jar这个jar上,commons-lang3和commons-lang会 ...
- 微信小程序如何套用iconfont
前言 如果你在开发微信时,没有图标的话,可以到http://www.iconfont.cn/ 官方下使用图标,那么我们去使用一些吧,到官方网址下点击使用~ 下载代码即可使用,看看下载的文件吧. 如图可 ...
- 《http权威指南》读书笔记2
概述 最近对http很感兴趣,于是开始看<http权威指南>.别人都说这本书有点老了,而且内容太多.我个人觉得这本书写的太好了,非常长知识,让你知道关于http的很多概念,不仅告诉你怎么做 ...
- [CocoaPods]客户端加载第三方库
请先阅读另一篇博文铺垫知识基础:[CocoaPods]终端方式集成第三方库 客户端的Github地址:CocoaPods-app 点击下载客户端: [CocoaPods客户端] 安装下载的文件.软件界 ...
- 使用config 来管理ssh的会话
通常利用 ssh 连接远程服务器,一般都要输入以下类型命令: ssh user@hostname -p port 如果拥有多个ssh账号,特别是像我这种喜欢在终端里直接ssh登录, 要记住每个ssh账 ...
- Tools - 源代码阅读分析工具Source Insight
简介 https://www.sourceinsight.com/ Source Insight是一个面向项目开发的程序编辑器和代码浏览器,可以分析C/C++.C#.Java.Python等语言源代码 ...
- LeetCode:144_Binary Tree Preorder Traversal | 二叉树的前序遍历 | Medium
题目:Binary Tree Preorder Traversal 二叉树的前序遍历,同样使用栈来解,代码如下: struct TreeNode { int val; TreeNode* left; ...
- keras中的mini-batch gradient descent (转)
深度学习的优化算法,说白了就是梯度下降.每次的参数更新有两种方式. 一. 第一种,遍历全部数据集算一次损失函数,然后算函数对各个参数的梯度,更新梯度.这种方法每更新一次参数都要把数据集里的所有样本都看 ...
- SQL Server性能优化(14)索引碎片
一. 外部碎片和内部碎片的概念 碎片的概念和检测,参考MSDN:https://msdn.microsoft.com/zh-cn/library/ms189858.aspx 二.对于碎片的解决办法 解 ...
- 移动端 h5开发相关内容总结(三)
之前写过两篇开发中遇到的问题和解决方案.当时是CSS 和 JavaScript 分开写的.现在写这篇文章的时候感觉很多内容都是有内在联系的,所以不好分开. 给大家分享一下这半年来的感受吧: 知道和理解 ...