【MyBatis】-----【MyBatis】---表级联系【一对多】
一、核心配置文件
- <?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>
- <!-- 最开始加载引用db.properties文件 -->
- <properties resource="db.properties"/>
- <!-- 取别名 以下情况别名为类名 -->
- <typeAliases>
- <package name="com.myBatis.entity"/>
- </typeAliases>
- <!--
- development : 开发模式
- work : 工作模式
- -->
- <environments default="development">
- <environment id="development">
- <transactionManager type="JDBC" />
- <!-- 配置数据库连接信息 -->
- <dataSource type="POOLED">
- <property name="driver" value="${driver}" />
- <property name="url" value="${url}" />
- <property name="username" value="${username}" />
- <property name="password" value="${password}" />
- </dataSource>
- </environment>
- </environments>
- <!-- 引用映射文件 -->
- <mappers >
- <mapper resource="com/myBatis/mapper/classesMapper.xml"/>
- <mapper resource="com/myBatis/mapper/teacherMapper.xml"/>
- </mappers>
- </configuration>
二、实体类
Classes
- package com.myBatis.entity;
- import java.util.List;
- public class Classes {
- private int id; // id===>c_id
- private String name; // name===>c_name
- /**
- * class表中有一个teacher_id字段,所以在Classes类中定义一个teacher属性,
- * 用于维护teacher和class之间的一对一关系,通过这个teacher属性就可以知道这个班级是由哪个老师负责的
- */
- private Teacher teacher;
- //使用一个List<Student>集合属性表示班级拥有的学生
- private List<Student> students;
- 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;
- }
- 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 + ", teacher=" + teacher + ", students=" + students + "]";
- }
- //增删改要用到的两个构造方法
- public Classes(String name, Teacher teacher) {
- super();
- this.name = name;
- this.teacher = teacher;
- }
- public Classes() {
- super();
- }
- }
Teacher
- package com.myBatis.entity;
- public class Teacher {
- // 定义实体类的属性,与teacher表中的字段对应
- private int id; // id===>t_id
- private String name; // name===>t_name
- 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 "Teacher [id=" + id + ", name=" + name + "]";
- }
- public Teacher() {
- super();
- }
- public Teacher(int id) {
- super();
- this.id = id;
- }
- }
Student
- package com.myBatis.entity;
- public class Student {
- //定义属性,和student表中的字段对应
- private int id; //id===>s_id
- private String name; //name===>s_name
- 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 + "]";
- }
- }
三、映射文件
classessMapper.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,namespace的值习惯上设置成包名+sql映射文件名,
- 这样就能够保证namespace的值是唯一的
- -->
- <mapper namespace="com.myBatis.mapper.classesMapper">
- <!-- 嵌套结果:使用嵌套结果映射来处理重复的联合结果的子集
- 封装联表查询的数据(去除重复的数据)
- 根据id查询得到一个user对象 -->
- <select id="getclassess" parameterType="int" resultMap="ClassResultMap">
- select * from classes c, teacher t where c.t_id=t.t_id and c.c_id=#{id}
- </select>
- <!-- 使用resultMap映射实体类和字段之间的一一对应关系 -->
- <resultMap type="Classes" id="ClassResultMap">
- <id property="id" column="c_id"/>
- <result property="name" column="c_name"/>
- <association property="teacher" javaType="Teacher">
- <id property="id" column="t_id"/>
- <result property="name" column="t_name"/>
- </association>
- </resultMap>
- <!-- 根据id查询删除一个class 的t_id -->
- <delete id="deleteClasses" parameterType="Classes">
- delete from classes where c_id=#{id}
- </delete>
- <!-- 添加(Create) -->
- <insert id="addClasses" parameterType="Classes">
- insert into classes values(null,#{name},#{teacher.id})
- </insert>
- <!-- 修改班级所对应的老师(Update) -->
- <update id="updateClasses" parameterType="Classes">
- update classes set t_id=#{teacher.id} where c_id=#{id}
- </update>
- <!--一对多 -->
- <!--
- 根据classId查询对应的班级信息,包括学生,老师
- -->
- <!--
- 嵌套结果: 使用嵌套结果映射来处理重复的联合结果的子集
- SELECT * FROM class c, teacher t,student s WHERE c.teacher_id=t.t_id AND c.C_id=s.class_id AND c.c_id=1
- -->
- <select id="getClass3" parameterType="int" resultMap="ClassResultMap3">
- select * from classes c, teacher t,student s where c.t_id=t.t_id and c.c_id=s.class_id and c.c_id=#{id}
- </select>
- <resultMap type="Classes" id="ClassResultMap3">
- <id property="id" column="c_id"/>
- <result property="name" column="c_name"/>
- <association property="teacher" column="t_id" javaType="Teacher">
- <id property="id" column="t_id"/>
- <result property="name" column="t_name"/>
- </association>
- <!-- ofType指定students集合中的对象类型 -->
- <collection property="students" ofType="Student">
- <id property="id" column="s_id"/>
- <result property="name" column="s_name"/>
- </collection>
- </resultMap>
- </mapper>
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,namespace的值习惯上设置成包名+sql映射文件名,
- 这样就能够保证namespace的值是唯一的
- -->
- <mapper namespace="com.myBatis.mapper.teacherMapper">
- <!-- 根据id查询得到一个user对象 -->
- <select id="getteacher" parameterType="int" resultMap="TeacherResultMap">
- select * from classes c, teacher t where c.t_id=t.t_id and t.t_id=#{id}
- </select>
- <!-- 使用resultMap映射实体类和字段之间的一一对应关系 -->
- <resultMap type="teacher" id="TeacherResultMap">
- <id property="id" column="t_id"/>
- <result property="name" column="t_name"/>
- </resultMap>
- <insert id="addTeacher" parameterType="Teacher">
- insert into teacher values(#{t_name})
- </insert>
- </mapper>
四、封装类
- package com.myBatis.util;
- import java.io.IOException;
- import java.io.Reader;
- import org.apache.ibatis.io.Resources;
- import org.apache.ibatis.session.SqlSession;
- import org.apache.ibatis.session.SqlSessionFactory;
- import org.apache.ibatis.session.SqlSessionFactoryBuilder;
- public class myBtaisUtil {
- static Reader reader=null;
- static SqlSessionFactory sqlSessionFactory= null;
- static SqlSession sqlSession = null;
- /**
- * 加载核心配置文件
- * 获取SqlSessionFactory
- * @return SqlSessionFactory
- */
- public static SqlSessionFactory getsqlSessionFactory() {
- try {
- reader = Resources.getResourceAsReader("SqlMapConfig.xml");
- sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
- } catch (IOException e) {
- e.printStackTrace();
- }
- return sqlSessionFactory;
- }
- /**
- * 获取SqlSession
- * @return SqlSession
- */
- public static SqlSession getsqlSession() {
- return sqlSession= getsqlSessionFactory().openSession(true);
- }
- }
五、测试类
- package myBatisTest;
- import org.apache.ibatis.session.SqlSession;
- import org.junit.Test;
- import com.myBatis.entity.Classes;
- import com.myBatis.entity.Teacher;
- import com.myBatis.util.myBtaisUtil;
- public class TestUser {
- //查询
- @Test
- public void testGetClasses() {
- SqlSession sqlSession=myBtaisUtil.getsqlSession();
- String select = "com.myBatis.mapper.classesMapper.getClass3";
- Classes classes = sqlSession.selectOne(select, 1);
- System.out.println(classes);
- }
- }
【MyBatis】-----【MyBatis】---表级联系【一对多】的更多相关文章
- 【MyBatis】-----【MyBatis】---表级联系【一对一】--增删改查
一.核心配置文件 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration ...
- 7.Mybatis关联表查询(这里主要讲的是一对一和一对多的关联查询)
在Mybatis中的管理表查询这里主要介绍的是一对一和一对多的关联查询的resultMap的管理配置查询,当然你也可以用包装类来实现.不过这里不说,做关联查询的步骤可以简单的总结为以下的几步: 1.分 ...
- Mybatis注解开发多表一对一,一对多
Mybatis注解开发多表一对一,一对多 一对一 示例:帐户和用户的对应关系为,多个帐户对应一个用户,在实际开发中,查询一个帐户并同时查询该账户所属的用户信息,即立即加载且在mybatis中表现为一对 ...
- 【Mybatis】MyBatis之表的关联查询(五)
本章介绍Mybatis之表的关联查询 一对一关联 查询员工信息以及员工的部门信息 1.准备表employee员工表,department部门表 CREATE TABLE `employee` ( `i ...
- MyBatis 多表查询
1.多表设计 多表查询 a.多表设计 (1)一对一 在任意一方设计外键保存另一张表的主键,维系表和表的关系 (2)一对多 在多的一方设计外键保存一的一方的主键,维系表和表的关系 (3)多对多 设计一张 ...
- SSM(二)MyBatis多表联查
这篇文章写了以下几个简单的例子,用来说明MyBatis多标联查基本语法 1.sql片段的用法 2.一对多查询 3.多条sql的一对多查询 4.多对一查询 5.多条sql一对多查询 6.多对多查询 这里 ...
- Mybatis多表操作
一:引言 在学习完前面的mybatis基本语法后,大家都有个认知,这个Mybatis太强大了,比之前使用JDBC写方便多了,但是你们当初在使用原生JDBC写SQL查询的时候有没有遇到过多表查询呢?肯定 ...
- 【MyBatis】MyBatis 多表操作
MyBatis 多表操作 文章源码 一对一查询 需求:查询所有账户信息,关联查询下单用户信息. 注意:因为一个账户信息只能供某个用户使用,所以从查询账户信息出发关联查询用户信息为一对一查询.如果从用户 ...
- 三、mybatis多表关联查询和分布查询
前言 mybatis多表关联查询和懒查询,这篇文章通过一对一和一对多的实例来展示多表查询.不过需要掌握数据输出的这方面的知识.之前整理过了mybatis入门案例和mybatis数据输出,多表查询是在前 ...
随机推荐
- python-字符编码的转换
python-字符编码的转换 1.了解基础知识 ASCII 一个英文,占一个字节.只能存英文和特殊字符. gb2312 约可以存7000中文 gb1830 约可以存27000中文 gbk 默认中文, ...
- mongoose 开源http库
Mongoose是一个用C编写的网络库.它为客户端和服务器模式实现TCP,UDP,HTTP,WebSocket,CoAP,MQTT的事件驱动的非阻塞API. 设计理念: Mongoose有三个基本的数 ...
- 016-zabbix低级自动发现以及MySQL多实例
1.概述 Zabbix的网络发现是指zabbix server通过配置好的规则,自动添加host,group,template Zabbix的主动注册刚好和网络发现是相反的,功能基本一致.zabbix ...
- 校内题目T2691 桶哥的问题——送桶
这是一道校内题目,但迷路的蒟蒻们同样被欢迎来此学习QWQ 题目描述: 题目背景 @桶哥本校——皎月pks大佬OrzOrz 买完了桶,桶哥要去送桶. 题目描述 桶哥买了nn个桶, 他要将这些桶送去nn个 ...
- 浅谈java虚拟机|系列2|JVM运行时
今天我们继续谈谈JVM架构. 今天主要讲讲JVM运行时, 先来一个图: 上篇文章,我们知道,JVM运行时,简单来说就是把class文件翻译成操作系统相关的机器码(或汇编语言),然后通过调用操作系统函数 ...
- 流式布局和viewport
流式布局 百分比布局,非固定宽度,内容向两边填充,流动的布局. viewport(视口) PC端的网页在手机端的浏览器显示是不会出现网页的,这是因为移动端的网页不是直接放在移动端的浏览器中,而是放在移 ...
- Ubuntu启动器创建
Ubuntu 启动器创建 启动器的本质是一个后缀为.desktop的文件,文件内容如下(这里为我创建的Chrome启动器) [Desktop Entry] Encoding=UTF- Name=Chr ...
- xz 解压缩命令,老是忘记
.tar.xz的解压命令 $ xz -d ***.tar.xz $ tar -xvf ***.tar 或者 $ tar xvJf ***.tar.xz
- 【NOIP2016提高A组模拟9.14】数列编辑器
题目 分析 比赛上,没有注意到询问只询问光标前面,于是只打了个暴力. 因为询问只询问光标前面,首先,当光标向后每移动到一个位置,顺便将这个位置的前缀和,和最大前缀和求出来. 总之,模拟 #includ ...
- c# linq 分组groupby
转载: https://www.cnblogs.com/cncc/p/9846390.html 一.先准备要使用的类: 1.Person类: class Person { public string ...