mybatis学习笔记三(关联关系)
学习mybatis的关联关系,主要注解在代码上,这里不做解释。配置文件一样的就不贴了
1.关联关系表创建(学生对应老师 多对一)
学生老师表
2.表对应的实体类
package com.home.entity; /**
* 此类是:学生
* @author hpc
* @2017年1月14日下午7:06:33
*/
public class Student {
private Integer student_id;//学生id
private String student_name;//学生名字
private Integer student_number;//学生编号
private Teacher student_teacher;//是哪个教师的学生
public Integer getStudent_id() {
return student_id;
}
public void setStudent_id(Integer 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 Integer getStudent_number() {
return student_number;
}
public void setStudent_number(Integer student_number) {
this.student_number = student_number;
}
public Teacher getStudent_teacher() {
return student_teacher;
}
public void setStudent_teacher(Teacher student_teacher) {
this.student_teacher = student_teacher;
}
@Override
public String toString() {
return "Student [student_id=" + student_id + ", student_name=" + student_name + ", student_number="
+ student_number + ", student_teacher=" + student_teacher + "]";
}
}
package com.home.entity; import java.util.HashSet;
import java.util.Set; /**
* 此类是:老师
* @author hpc
* @2017年1月14日下午7:06:47
*/
public class Teacher {
private Integer teacher_id;// 老师id
private String teacher_name;// 老师名字
private Integer teacher_number;// 老师编号
private Set<Student> teacher_student = new HashSet<Student>();// 老师教过哪些学生 public Integer getTeacher_id() {
return teacher_id;
} public void setTeacher_id(Integer 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 Integer getTeacher_number() {
return teacher_number;
} public void setTeacher_number(Integer teacher_number) {
this.teacher_number = teacher_number;
} public Set<Student> getTeacher_student() {
return teacher_student;
} public void setTeacher_student(Set<Student> teacher_student) {
this.teacher_student = teacher_student;
} @Override
public String toString() {
return "Teacher [teacher_id=" + teacher_id + ", teacher_name=" + teacher_name + ", teacher_number="
+ teacher_number + ", teacher_student=" + teacher_student + "]";
} }
3.核心主要是配置文件
<?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.home.entity.studentMapper"><!-- 命名空间,一定要是唯一的,只有这样才能定位到这个文件来 -->
<!-- 多对一查询(多个学生对应一个老师) -->
<!-- select的属性
id:这个查找标签的唯一标识,通过id找到这条sql语句
parameterType:传进来的参数类型
resultMap:这条语句执行完,以什么形式返回结果集
-->
<select id="loadStudent" parameterType="int" resultMap="studentMap">
select *
from students as s join teachers as t
on t.teacher_id=s.student_teacher
where s.student_id=#{id}
</select>
<!-- 学生对象映射关系 -->
<!--resultMap的属性
type:以这个类型进行封装返回
id:找到该resultMap标签的唯一标识
resultMap的内部的标签介绍
<id>专门用于映射主键的
<result>普通属性映射
<collection>集合属性映射
<association>关系映射(1-1,1-n,n-1,n-n)
<constructor>专门用于映射构造函数的标签
<discriminator>鉴别器非常容易理 解,因为它的表现很像 Java 语言中的 switch 语句。
-->
<resultMap type="student" id="studentMap" >
<!-- 主键映射 -->
<id property="student_id" column="student_id" javaType="int"/>
<!-- 普通属性映射 -->
<!--
property:映射在这个属性上
column:以这个列上的为参照
javaType:以什么类型映射
-->
<result property="student_name" column="student_name" javaType="String"/>
<result property="student_number" column="student_number" javaType="int"/>
<!-- 关联关系映射 -->
<association property="student_teacher" column="teacher_id" resultMap="teacherMap"/>
</resultMap>
<!-- 学生对象映射关系 -->
<resultMap type="teacher" id="teacherMap">
<id property="teacher_id" column="teacher_id" javaType="int"/>
<result property="teacher_name" column="teacher_name" javaType="String"/>
<result property="teacher_number" column="teacher_number" javaType="int"/>
</resultMap>
</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="com.home.entity.teacherMapper">
<!-- teacher sql -->
<select id="loadTeacher" parameterType="int" resultMap="teacherMapper">
select *
from teachers as t join students as s
on s.student_teacher=t.teacher_id
where teacher_id=#{teacher_id}
</select>
<resultMap type="teacher" id="teacherMapper">
<id property="teacher_id" column="teacher_id" />
<result property="teacher_name" column="teacher_name" />
<result property="teacher_number" column="teacher_number" />
<collection property="teacher_student" ofType="student">
<id property="student_id" column="student_id" />
<result property="student_name" column="student_name"
javaType="String" />
<result property="student_number" column="student_number"
javaType="int" />
</collection>
</resultMap>
</mapper>
4. 测试
package com.home.mybatis; import java.io.IOException; import org.apache.ibatis.session.SqlSession; import com.home.entity.Student;
import com.home.entity.Teacher; public class TestApp {
public static void main(String[] args) throws IOException {
// 我将获取session的代码封装成了一个工具类,直接用工具类来获取session
SqlSession session = SessionUtils.getSession("mybatis.xml");
String loadTeacher="com.home.entity.teacherMapper.loadTeacher";
String loadStudent="com.home.entity.studentMapper.loadStudent";
Teacher teacher = session.selectOne(loadTeacher,1);
Student student = session.selectOne(loadStudent,1);
System.out.println(student);
System.out.println(teacher);
// 将数据属性到数据中去
session.commit();
// 关闭session
session.close();
}
}
5.结果
Student [student_id=4, student_name=hpc, student_number=1, student_teacher=Teacher [teacher_id=1, teacher_name=王老师, teacher_number=1, teacher_student=[]]]
Teacher [teacher_id=1, teacher_name=王老师, teacher_number=1, teacher_student=[Student [student_id=5, student_name=zll, student_number=2, student_teacher=null], Student [student_id=4, student_name=hpc, student_number=1, student_teacher=null]]]
mybatis学习笔记三(关联关系)的更多相关文章
- MyBatis学习笔记(三) 关联关系
首先给大家推荐几个网页: http://blog.csdn.net/isea533/article/category/2092001 没事看看 - MyBatis工具:www.mybatis.tk h ...
- MyBatis学习笔记(二) 关联关系
首先给大家推荐几个网页: http://blog.csdn.net/isea533/article/category/2092001 没事看看 - MyBatis工具:www.mybatis.tk h ...
- MyBatis学习笔记(三) Configuration类
一.初探Configuration类 我们先来看一下MyBatis的XML配置文件的结构,(摘自mybatis.org) 下面这个是Configuration类的部分变量 一点不一样是不是??? 其实 ...
- Mybatis学习笔记(三) —— DAO开发方法
一.SqlSession的使用范围 SqlSession中封装了对数据库的操作,如:查询.插入.更新.删除等. SqlSession通过SqlSessionFactory创建. SqlSessionF ...
- Mybatis学习笔记三
一.延迟加载 延迟加载即加载延迟了,并不是一次性加载完而是按需加载,感觉应该是针对多表查询而言的,即先查询单表等需要另一张表的信息时再去加载,这样能提高数据库的性能: 需要注意的是,mybatis提供 ...
- mybatis学习笔记(三)-- 优化数据库连接配置
原来直接把数据库连接配置信息写在conf.xml配置中,如下 <?xml version="1.0" encoding="UTF-8"?> < ...
- MyBatis学习笔记(三)——优化MyBatis配置文件中的配置
转自孤傲苍狼的博客:http://www.cnblogs.com/xdp-gacl/p/4264301.html 一.连接数据库的配置单独放在一个properties文件中 之前,我们是直接将数据库的 ...
- mybatis 学习笔记(三):mapper 代理开发 dao 层
mybatis 学习笔记(三):mapper 代理开发 dao 层 优势 通过使用mapper 代理,我们可以不需要去编写具体的实现类(使用 getMapper() 方法自动生成),只需编写接口即可, ...
- MyBatis:学习笔记(3)——关联查询
MyBatis:学习笔记(3)--关联查询 关联查询 理解联结 SQL最强大的功能之一在于我们可以在数据查询的执行中可以使用联结,来将多个表中的数据作为整体进行筛选. 模拟一个简单的在线商品购物系统, ...
随机推荐
- [翻译]HBase 中的 ACID
同前面翻译的一篇关联的,同作者的另一篇:ACID in HBase 这一篇不是单纯地描述一个问题,而是以 ACID 为主题,介绍了其在 HBase 中各个部分的体现及实现. ACID,即:原子性(At ...
- [Usaco2008 Open] Clear And Present Danger 寻宝之路[最短路][水]
Description 农夫约翰正驾驶一条小艇在牛勒比海上航行. 海上有N(1≤N≤100)个岛屿,用1到N编号.约翰从1号小岛出发,最后到达N号小岛.一 张藏宝图上说,如果他的路程上 ...
- Twitter算法
算法实践——Twitter算法面试题(积水问题)的线性时间解法 问题描述:在下图里我们有不同高度的挡板.这个图片由一个整数数组所代表,数组中每个数是墙的高度.下图可以表示为数组(2.5.1.2.3 ...
- [转]解决MySQL出现大量unauthenticated user的问题
最近发现两台MySQL server在中午的时候忽然(很突然的那种)发飙,不断的挂掉.重启mysql也尽是失败,看mysql的errorlog,只能看到类似如下的信息: Forcing close o ...
- QuickWebApi2:使用Lambda方式,完成对WebApi的开发和调用-文档的生成
续 QuickWebApi:使用Lambda方式,完成对WebApi的开发和调用 上一篇完成了主要的功能,本次修订主要重构了对接口文档的生成规范,使之可读性更佳,甚至可以作为接口文档进行发布(当然,在 ...
- algorithm(算法)
algorithm(算法) STL中算可以分为三种, 1.变序型队列算法,可以改变容器内的数据: 2.非变序型队列算法,处理容器内的数据而不改变他们 : 3.通用数值算法,这涉及到很多专业领域的算术操 ...
- Aspose.cells异步读写操作
public class AsyncExcel : Excel { static readonly object _objForlock = new object(); //public List&l ...
- springMVC3学习(十二)--文件上传优化CommonsMultipartResolver
基于上一篇文件上传发现效率很慢,我们应该对它进行优化 使用springMVC对文件上传的解析器 来处理文件上传的时候需要在spring的applicationContext里面加上springMVC ...
- 让textbox紧贴IME
将textbox放与页面最下方,并取消ApplicationBar. IE的ApplicationBar里放个了textbox,效果很炫,最重要用户体验很好. 于是也想对自己textbox做这样的设计 ...
- OOC,泛型,糟糕的设计。
虽然大部分都在谈ooc的编译器设计,但更多的内容在于程序设计的思想,复杂度,维护上面.我希望这篇文章能对读者有哪怕一丁点的帮助. 这篇文章遵循CC-BY-NC. = OOC,泛型,与那些糟糕的设计 原 ...