MyBatis总结(2)--级联查询
来源:互联网 发布:单片机 光耦 编辑:程序博客网 时间:2024/05/29 20:00
一、一对一
1、数据库设计
建立两张表,class表和teacher表,一个老师只能带一个班(建表语句略)
2、domain对象
package com.person.test.mybatis.domain;import java.util.List;/** * Copyright: Copyright (c) 2017/10/24 * Description: 描述班级的domain对象 * CLASS_NAME: Classes * PACKAGE_NAME: com.person.test.mybatis.domain * version: v1.0.0 * author: Jin Biao * date: 2017/10/24 8:56 */public class Classes { private int id; private String name; private Teacher teacher; public Classes() { } public Classes(int id, String name, Teacher teacher) { this.id = id; this.name = name; this.teacher = teacher; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Teacher getTeacher() { return teacher; } public void setTeacher(Teacher teacher) { this.teacher = teacher; } @Override public String toString() { return "Classes{" + "id=" + id + ", name='" + name + '\'' + ", teacher=" + teacher + '}'; }}
package com.person.test.mybatis.domain;/** * Copyright: Copyright (c) 2017/10/24 * <p> * Description: * CLASS_NAME: Teacher * PACKAGE_NAME: com.person.test.mybatis.domain * version: v1.0.0 * author: Jin Biao * date: 2017/10/24 8:57 */public class Teacher { private int id; private String tName; public Teacher() { } public Teacher(int id, String tName) { this.id = id; this.tName = tName; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String gettName() { return tName; } public void settName(String tName) { this.tName = tName; } public String toString(){ return "Teacher [ id = " + id + " t_name = " + tName + "]"; }}
3、mapper.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="mybatis.mapping.classMapper"><!--使用resultMap属性实现一对一的对应关系--> <select id="getById" parameterType="int" resultMap="ClassResultMap1"> SELECT c.*,t.id t_id,t.name t_name FROM class c,teacher t WHERE c.t_id = t.id AND c.id = #{id} </select> <!--column对应的是表中的字段名--> <resultMap id="ClassResultMap1" type="Classes"> <id property="id" column="id"/> <result property="name" column="name"/> <!--这里使用<association>标签实现两张表的查询关联 column 指的是classes的外键,这里有两种实现方法:1.一种是关联查询: SELECT c.*,t.id t_id,t.name t_name FROM class c,teacher t WHERE c.t_id = t.id AND c.id = #{id} 2.另一种是嵌套查询,先得到t_id,在通过id去teacher表查询teacher的信息--> <association property="teacher" javaType="Teacher" column="t_id" > <!--这里需要特别关注的是如果两个表的字段名一样,要在查询结果将其中一个的字段名重命名,如果没有,不会报错,但是查询得到的teacher的结果会是classes的数据--> <id property="id" column="t_id"/> <result property="tName" column="t_name"/> </association><!--嵌套查询的实现 select 指的是获取哪个查询语句这里使用的是teacherMpper.xml文件中的getById语句--> <association property="teacher" column="t_id" select="mybatis.mapping.teacherMapper.getById"/> </resultMap></mapper>
4.junit测试
- MybatisUtil类
package com.person.test.mybatis.utils;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.FileInputStream;import java.io.InputStream;/** * Copyright: Copyright (c) 2017/10/23 * <p> * Description: * CLASS_NAME: MybatisUtil * PACKAGE_NAME: com.person.test.mybatis.utils * version: v1.0.0 * author: Jin Biao * date: 2017/10/23 8:57 */public class MybatisUtil { /** method_name:getSessionFactory * param: void * description: 获取sessionFactory * create_user: Jin Biao * create_date: 2017/10/23 * create_time: 9:07 **/ public static SqlSessionFactory getSessionFactory() throws Exception{ String resource = "src/com/person/test/mybatis/conf.xml"; //读取配置文件 InputStream inputStream = new FileInputStream(resource); //建立factory SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream); return factory; } public static SqlSession getSqlSession() throws Exception { return getSessionFactory().openSession(); } /** method_name: getSqlSession * param: boolean isAutoCommit * description: 是否自动提交事务 true:自动提交 false:需要手动提交 * create_user: Jin Biao * create_date: 2017/10/23 * create_time: 9:13 **/ public static SqlSession getSqlSession(boolean isAutoCommit) throws Exception { return getSessionFactory().openSession(isAutoCommit); }}
- 测试内容
@Test public void testGetById() throws Exception {//这里使用MybatisUtil将mybatis实现的功能进行封装 SqlSession sqlSession = MybatisUtil.getSqlSession(true); String statement = "mybatis.mapping.classMapper.getById"; Classes classes = sqlSession.selectOne(statement,2); sqlSession.close(); System.out.println(classes); }
二、一对多查询
1、数据库设计
再新增一张表student表,一个班级内有多个学生,一个学生只能在一个班级,建表语句也不多说。
2.domain对象
Student对象
package com.person.test.mybatis.domain;/** * Copyright: Copyright (c) 2017/10/25 * Description: * CLASS_NAME: Student * PACKAGE_NAME: com.person.test.mybatis.domain * version: v1.0.0 * author: Jin Biao * date: 2017/10/25 17:35 */public class Student { private int id; private String name; public Student(){ } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Student{" + "id=" + id + ", name='" + name + '\'' + '}'; }}
Class对象,这里要多一个属性List<Student>package com.person.test.mybatis.domain;import java.util.List;/** * Copyright: Copyright (c) 2017/10/24 * Description: 描述班级的domain对象 * CLASS_NAME: Classes * PACKAGE_NAME: com.person.test.mybatis.domain * version: v1.0.0 * author: Jin Biao * date: 2017/10/24 8:56 */public class Classes { private int id; private String name; private List<Student> students; public Classes() { } public int getId() { return id; } public void setId(int 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; } @Override public String toString() { return "Classes{" + "id=" + id + ", name='" + name + '\'' + ", students=" + students + '}'; }}
3、classes.xml文件
一对多的实现和一对一相差不大,将association标签换成collection
<?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="mybatis.mapping.classMapper"> <select id="getClasses" parameterType="int" resultMap="ClassResultMap2"> SELECT * FROM class c , student s where c.id = s.c_id AND c.id = #{id}</select> <!--一对多联合查询--> <resultMap id="ClassResultMap2" type="Classes"> <id property="id" column="id"/> <result property="name" column="name"/> <collection property="students" ofType="Student"> <id property="id" column="s_id"/> <result property="name" column="s_name"/> </collection></resultMap></mapper>
4、junit测试
@Test public void getClasses() throws Exception { SqlSession sqlSession = MybatisUtil.getSqlSession(true); String statement = "mybatis.mapping.classMapper.getClasses"; Classes classes = sqlSession.selectOne(statement,1); sqlSession.close(); System.out.println(classes); }
阅读全文
0 0
- MyBatis总结(2)--级联查询
- mybatis 级联查询
- mybatis特性--- 级联查询
- MyBatis 的级联查询
- mybatis级联查询
- Mybatis级联查询
- mybatis级联查询
- mybatis级联查询
- MyBatis 级联查询
- mybatis级联查询
- Mybatis 中级联查询方式
- mybatis同表级联查询
- Mybatis级联查询和缓存
- 总结DetachedCriteria级联查询
- 总结DetachedCriteria级联查询
- MyBatis学习总结——实现级联表查询(一对一,一对多)
- MyBatis 级联查询,一对一,一对多
- mybatis级联查询的新写法
- 通过google插件Thumbnails实现图片指定大小压缩
- mongodb在java中的语句编译
- [CCFwithAxin]201709-2公共钥匙盒
- java实现的一些常用的排序算法
- 偏向锁、轻量级锁、重量级锁
- MyBatis总结(2)--级联查询
- sbhz
- 文章标题 ImageNet 数据集介绍及应用
- 输出100·200之间的素数
- Linux 安装两个MySQL服务器的操作步骤
- 在分布式数据库中CAP原理CAP+BASE
- Java--Mac安装配置Tomcat
- Deep Learning:Optimization for Training Deep Models(一)
- Nodejs fs模块