【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>
二、实体类
2.1Teacher
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;
}
}
2.2Classes
package com.myBatis.entity;
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;
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 + "]";
}
public Classes(String name, Teacher teacher) {
super();
this.name = name;
this.teacher = teacher;
}
public Classes() {
super();
}
}
三、映射文件
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>
classesMapper.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> </mapper>
四、测试类
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 testUpdateClasses() {
SqlSession sqlSession=myBtaisUtil.getsqlSession();
//先查找
String selectclasses = "com.myBatis.mapper.classesMapper.getclassess";
Classes classes =sqlSession.selectOne(selectclasses, 3);
System.out.println(classes);
//再修改
Teacher teacher = new Teacher(4);
System.out.println();
classes.setTeacher(teacher);
String update = "com.myBatis.mapper.classesMapper.updateClasses";
int i = sqlSession.update(update, classes);
System.out.println(i);
Classes classes2= sqlSession.selectOne(selectclasses, 3);
System.out.println(classes2);
} //添加
@Test
public void testAddClasses() {
SqlSession sqlSession=myBtaisUtil.getsqlSession();
String add = "com.myBatis.mapper.classesMapper.addClasses";
Classes classes = new Classes();
Teacher teacher= new Teacher(4);
classes.setName("1111");
classes.setTeacher(teacher);
int i = sqlSession.insert(add, classes);
System.out.println(i);
} //删除
@Test
public void testDeleteClasses() {
SqlSession sqlSession=myBtaisUtil.getsqlSession();
String delete = "com.myBatis.mapper.classesMapper.deleteClasses";
int i= sqlSession.delete(delete, 5);
System.out.println(i);
} //查询
@Test
public void testGetClasses() {
SqlSession sqlSession=myBtaisUtil.getsqlSession();
String select = "com.myBatis.mapper.classesMapper.getclassess";
Classes classes = sqlSession.selectOne(select, 7);
System.out.println(classes);
}
}
MyBatis一对一关联查询总结
MyBatis中使用association标签来解决一对一的关联查询,association标签可用的属性如下:
- property:对象属性的名称
- javaType:对象属性的类型
- column:所对应的外键字段名称
- select:使用另一个查询封装的结果
【MyBatis】-----【MyBatis】---表级联系【一对一】--增删改查的更多相关文章
- MyBatis学习(三)MyBatis基于动态代理方式的增删改查
1.前言 上一期讲到MyBatis-Statement版本的增删改查.可以发现.这种代码写下来冗余的地方特别多.写一套没啥.如果涉及到多表多查询的时候就容易出现问题.故.官方推荐了一种方法.即MyBa ...
- Mybatis实现简单的CRUD(增删改查)原理及实例分析
Mybatis实现简单的CRUD(增删改查) 用到的数据库: CREATE DATABASE `mybatis`; USE `mybatis`; DROP TABLE IF EXISTS `user` ...
- 一、数据库表中字段的增删改查,二、路由基础.三、有名无名分组.四、多app共存的路由分配.五、多app共存时模板冲突问题.六、创建app流程.七、路由分发.八、路由别名,九、名称空间.十、反向解析.十一、2.x新特性.十二、自定义转换器
一.数据库表中字段的增删改查 ''' 直接在modules中对字段进行增删改查 然后在tools下点击Run manage.py Task执行makemigrations和migrate 注意在执行字 ...
- Django项目的创建与介绍.应用的创建与介绍.启动项目.pycharm创建启动项目.生命周期.三件套.静态文件.请求及数据.配置Mysql完成数据迁移.单表ORM记录的增删改查
一.Django项目的创建与介绍 ''' 安装Django #在cmd中输入pip3 #出现这个错误Fatal error in launcher: Unable to create process ...
- 第三百零七节,Django框架,models.py模块,数据库操作——表类容的增删改查
Django框架,models.py模块,数据库操作——表类容的增删改查 增加数据 create()方法,增加数据 save()方法,写入数据 第一种方式 表类名称(字段=值) 需要save()方法, ...
- 五 Django框架,models.py模块,数据库操作——表类容的增删改查
Django框架,models.py模块,数据库操作——表类容的增删改查 增加数据 create()方法,增加数据 save()方法,写入数据 第一种方式 表类名称(字段=值) 需要save()方法, ...
- mysql对库,表及记录的增删改查
破解密码 #1.关闭mysqlnet stop mysqlmysql还在运行时需要输入命令关闭,也可以手动去服务关闭 #2.重新启动mysqld --skip-grant-tables跳过权限 #3m ...
- MyBatis初级实战之二:增删改查
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- 02.Mybatis的动态代理方式实现增删改查
动态代理的方式实现增删改查: 通过约定的方式定位sql语句 约定 > 配置文件 > 硬编码 约定的目标是省略掉通过硬编码的方式定位sql的代码,通过接口直接定位出sql语句,以下代码为通过 ...
- Mybatis学习笔记之---CRUD(增删改查)
Mybatis的CRUD(增删改查) 1.pom.xml <dependencies> <dependency> <groupId>junit</groupI ...
随机推荐
- nacos集群搭建
nacos介绍 Nacos 支持基于 DNS 和基于 RPC 的服务发现(可以作为springcloud的注册中心).动态配置服务(可以做配置中心).动态 DNS 服务. 1.从官网下载nacos压缩 ...
- git每次更新都需要输入账号密码,如何解决?
//如果https请求pull每次都需要输入账号密码,则 git config --global credential.helper store 那么,在下一次更新,需要输入账号密码,然后git就 ...
- Java并发编程实战 第14章 构建自定义的同步工具
状态依赖性 定义:只有满足特定的状态才能继续执行某些操作(这些操作依赖于固定的状态,这些状态需要等待别的线程来满足). FutureTask,Semaphroe,BlockingQueue等,都是状态 ...
- 【CF896C】Willem, Chtholly and Seniorious
ODT模板题,ODT适合随机数据下具有维护区间推平操作的序列维护题目,时间复杂度较为玄学.. 代码如下 #include <bits/stdc++.h> #define pb push_b ...
- 【洛谷P1730】最小密度路径
题目大意:给定一个 N 个点,M 条边的有向图,现有 Q 个询问,每次询问 X 到 Y 的最小密度路径是多少.最小密度路径的定义是路径长度除以路径边数. 题解:利用矩阵乘法,可以预处理出从 X 到 Y ...
- Vue 上传图片压缩 的问题
前言 也是很少来写博客了,也是赖吧,哈哈 最近新的进度里有上传图片太大,需要前台进行图片压缩问题,然后查阅了相关资料 上传图片大于100* 1024 的用canvas 来压缩来解决 然后IOS拍照上传 ...
- mysql慢查询分析
mysql慢查询分析 Posted: 29. 08. 2014 | Author: zdz | Category: mysql MySQL 慢查询日志分析 1. pt-query-digest分析慢查 ...
- javascript面向对象学习(一)
面向对向的初体验 创建一个标签 // 传统 var p = document.createElement('p'); var txt = document.createTextNode('我是传统js ...
- 【leetcode】1189. Maximum Number of Balloons
题目如下: Given a string text, you want to use the characters of text to form as many instances of the w ...
- postman-变量
Variables 什么是变量 变量是一个符号,可以接受不同的值.你可能根据你的项目经验,对其他语言的变量比较熟悉.在postman 的工作原理也是一样的 为什么使用变量 变量允许你在不同的地方重复使 ...