Mybatis框架 day1018

ok了家人们书接上文,我们继续学习mybatis框架

.数据输出

5.7 属性和字段的映射

5.7.1 别名映射
将数据库表的字段别名设置成和实体类属性一致。
<!-- 给每一个字段设置一个别名,让别名和Java实体类中
属性名一致 -->
<select id="findAll"
resultType="com.lzw.pojo.Employee">
select emp_id empId,emp_name
empName,emp_salary empSalary from t_emp
</select>
5.7.2 全局配置自动识别驼峰式命名规则

Mybatis全局配置文件加入如下配置:

<!-- 使用settings对Mybatis全局进行设置 -->
<settings>
<!-- 将xxx_xxx这样的列名自动映射到xxXxx这样驼峰式命
名的属性名 -->
<setting name="mapUnderscoreToCamelCase"
value="true"/>
</settings>
SQL 语句中可以不使用别名
<select id="findAll" resultType="Employee">
select emp_id,emp_name,emp_salary from
t_emp
</select>
5.7.3 使用resultMap
使用 resultMap 标签定义对应关系,然后引用这个对应关系
//根据员工ID查询员工信息
public Employee findEmpById(Integer empId);
<!--
使用resultMap标签进行数据的封装
id属性:当前resultMap的唯一标识
type属性:最终稿封装的类型,一般写全限定名
-->
<resultMap id="empResultMap"
type="Employee">
<!--id标签维护主键列,property写Java实体的属
性名,column写数据库表的字段名-->
<id property="empId" column="emp_id">
</id>
<!--result标签维护普通列,property写Java实体
的属性名,column写数据库表的字段名-->
<result property="empName"
column="emp_name"></result>
<result property="empSalary"
column="emp_salary"></result>
</resultMap>
<!--resultMap="empResultMap" 引用上面的
resultMap-->
<select id="findEmpById"
resultMap="empResultMap">
select * from t_emp where emp_id = #
{empId}
</select>
@Test
public void testFindById() throws
IOException {
SqlSession sqlSession =
SqlSessionUtil.openSession();
//4.获取接口的实现类对象
EmployeeMapper employeeMapper =
sqlSession.getMapper(EmployeeMapper.class);
//5.基于多态调用方法
Employee employee =
employeeMapper.findEmpById(1);
//6.释放资源
sqlSession.close();
//7.打印
System.out.println(employee);
}

.MyBatis多表映射

6.1 数据准备

表与表之间的关系:一对一、一对多、多对多
CREATE TABLE t_customer(
customer_id INT NOT NULL AUTO_INCREMENT,
customer_name CHAR(100),
PRIMARY KEY (customer_id)
);
CREATE TABLE t_order (
order_id INT NOT NULL AUTO_INCREMENT,
order_name CHAR(100),
customer_id INT,
PRIMARY KEY (order_id)
);
INSERT INTO t_customer (customer_name) VALUES
('张三');
INSERT INTO t_order (order_name, customer_id)
VALUES ('101', '1');
INSERT INTO t_order (order_name, customer_id)
VALUES ('102', '1');
INSERT INTO t_order (order_name, customer_id)
VALUES ('103', '1');
-- 创建讲师表
CREATE TABLE t_teacher (
t_id INT PRIMARY KEY,
t_name VARCHAR(50)
);
-- 创建学生表
CREATE TABLE t_student (
s_id INT PRIMARY KEY,
s_name VARCHAR(50)
);
-- 创建中间表
CREATE TABLE t_inner (
t_id INT,
s_id INT,
PRIMARY KEY (t_id, s_id)
);
-- 向讲师表中插入测试数据
INSERT INTO t_teacher VALUES (1, '张三');
INSERT INTO t_teacher VALUES (2, '李四');
INSERT INTO t_teacher VALUES (3, '王五');

一对一查询的语句:
-- 向学生表中插入测试数据
INSERT INTO t_student VALUES (1, '小明');
INSERT INTO t_student VALUES (2, '小红');
INSERT INTO t_student VALUES (3, '小刚');
-- 向中间表中插入测试数据
INSERT INTO t_inner VALUES (1, 1);
INSERT INTO t_inner VALUES (1, 3);
INSERT INTO t_inner VALUES (2, 2);
INSERT INTO t_inner VALUES (3, 1);
INSERT INTO t_inner VALUES (3, 3);

6.2 一对一查询

6.2.1 一对一查询的模型和SQL语句
用户表和订单表的关系为,一个用户有多个订单,一个订单只
从属于一个用户
一对一查询的需求:查询一个订单,与此同时查询出该订单所
属的用户
一对一查询的语句:
select
o.order_id,o.order_name,c.customer_id,c.customer
_name
from t_order o,t_customer c
where o.customer_id=c.customer_id
and o.order_id=1
6.2.2 创建CustomerOrder实体
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Customer {
private Integer customerId;
private String customerName;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Order {
private Integer orderId;
private String orderName;
//代表当前订单从属于哪一个客户
private Customer customer;
}
6.2.3 创建OrderMapper接口
public interface OrderMapper {
public Order findOrderById(Integer orderId);
}
6.2.4 配置OrderMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper
3.0//EN"
"https://mybatis.org/dtd/mybatis-3-
mapper.dtd">
<mapper namespace="com.lzw.mapper.OrderMapper">
<resultMap id="oderAndCustomerMap"
type="Order">
<id property="orderId"
column="order_id"></id>
<result property="orderName"
column="order_name"></result>
<!--
association标签维护一对一的关系
property属性:最终要封装的对象中的属性名
javaType属性:该属性的类型,可以是类的全限
定名或者别名
-->
<association property="customer"
javaType="Customer">
<id property="customerId"
column="customer_id"></id>
<result property="customerName"
column="customer_name"></result>
</association>
</resultMap>
<!--resultType:是自动封装,且只能封装一个对象-->
<select id="findOrderById"
resultMap="oderAndCustomerMap">
select
o.order_id,o.order_name,c.customer_id,c.customer
_name
from t_order o,t_customer c
where o.customer_id=c.customer_id
and o.order_id= #{orderId}
</select>
</mapper>
6.2.5 测试结果
@Test
public void testDemo(){
//使用工具类获取SqlSession对象
SqlSession sqlSession =
SqlSessionUtil.openSession();
//基于接口获取实现类对象(代理对象)
OrderMapper orderMapper =
sqlSession.getMapper(OrderMapper.class);
//通过多态调用方法
Order order =
orderMapper.findOrderById(1);
//输出结果
System.out.println(order);
//释放资源
sqlSession.close();
}

6.3 一对多查询

6.3.1 一对多查询的模型和SQL语句
用户表和订单表的关系为,一个用户有多个订单,一个订单只
从属于一个用户
一对多查询的需求:查询一个用户,与此同时查询出该用户具
有的订单
一对多查询语句:
select
c.customer_id,c.customer_name,o.order_id,o.order
_name
from t_customer c,t_order o
where c.customer_id = o.customer_id
and c.customer_id = 1
6.3.2 创建CustomerOrder实体
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Customer {
private Integer customerId;
private String customerName;
//表示当前用户有哪些订单
public List<Order> orderList;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Order {
private Integer orderId;
private String orderName;
//代表当前订单从属于哪一个客户
private Customer customer;
}
6.3.3 创建CustomerMapper接口
public interface CustomerMapper {
public Customer findCustomerById(Integer
customerId);
}
6.3.4 配置CustomerMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper
3.0//EN"
"https://mybatis.org/dtd/mybatis-3-
mapper.dtd">
<mapper
namespace="com.lzw.mapper.CustomerMapper">
<resultMap id="customerAndOrderMap"
type="Customer">
<id property="customerId"
column="customer_id"></id>
<result property="customerName"
column="customer_name"></result>
<!--
collection标签:映射一对多的关联关系
property属性:实体类对象的属性名
ofType属性:集合属性中元素的类型
-->
<collection property="orderList"
ofType="Order">
<id property="orderId"
column="order_id"></id>
<result property="orderName"
column="order_name"></result>
</collection>
</resultMap>
<select id="findCustomerById"
parameterType="int"
resultMap="customerAndOrderMap">
select
c.customer_id,c.customer_name,o.order_id,o.order
_name
from t_customer c,t_order o
where c.customer_id = o.customer_id
and c.customer_id = #{customerId}
</select>
</mapper>
6.3.5 测试结果
@Test
public void testDemo(){
//使用工具类获取SqlSession对象
SqlSession sqlSession =
SqlSessionUtil.openSession();
//基于接口获取实现类对象(代理对象)
CustomerMapper customerMapper =
sqlSession.getMapper(CustomerMapper.class);
//通过多态调用方法
Customer customer =
customerMapper.findCustomerById(1);
//输出结果
System.out.println(customer);
//释放资源
sqlSession.close();
}

6.4 多对多查询

6.4.1 多对多查询的模型和SQL语句
学生表和老师表的关系为,一个老师教过多个学生,一个学生
被多个老师教过
多对多查询的需求:查询老师同时查询出该老师教过哪些学生
select t.t_id,t.t_name,s.s_id,s_name
from t_teacher t,t_inner i,t_student s
where t.t_id=i.t_id and i.s_id=s.s_id and t.t_id
=1

select s.s_id,s_name,t.t_id,t.t_name
from t_student s,t_inner i,t_teacher t
where s.s_id=i.s_id and i.t_id=t.t_id and s.s_id
=1
6.4.2 创建TeacherStudent实体
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Teacher {
private Integer tId;
private String tName;
//表示一个老师教过多个学生
private List<Student> studentList;
}


@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student {
private Integer sId;
private String sName;
//表示一个学生被多个老师教过
private List<Teacher> teacherList;
}
6.4.3 创建TeacherMapperStudentMapper接口
public interface TeacherMapper {
//根据ID查询老师信息
public Teacher findTeacherById(Integer tId);
}
public interface StudentMapper {
//根据ID查询学生信息
public Student findStudentById(Integer sId);
}
6.4.4 配置TeacherMapper.xmlStudentMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper
3.0//EN"
"https://mybatis.org/dtd/mybatis-3-
mapper.dtd">
<mapper
namespace="com.lzw.mapper.TeacherMapper">
<resultMap id="teacherResultMap"
type="Teacher">
<id property="tId" column="t_id"></id>
<result property="tName" column="t_name">
</result>
<collection property="studentList"
ofType="Student">
<id property="sId" column="s_id"></id>
<result property="sName"
column="s_name"></result>
</collection>
</resultMap>
<select id="findTeacherById"
parameterType="int"
resultMap="teacherResultMap">
select t.t_id,t.t_name,s.s_id,s_name
from t_teacher t,t_inner i,t_student s
where t.t_id=i.t_id and i.s_id=s.s_id and
t.t_id =#{tId}
</select>
</mapper>
------------------------------------------------
------------------------------------
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper
3.0//EN"
"https://mybatis.org/dtd/mybatis-3-
mapper.dtd">
<mapper
namespace="com.lzw.mapper.StudentMapper">
<resultMap id="studentResultMap"
type="Student">
<id property="sId" column="s_id"></id>
<result property="sName" column="s_name">
</result>
<collection property="teacherList"
ofType="Teacher">
<id property="tId" column="t_id"></id>
<result property="tName"
column="t_name"></result>
</collection>
</resultMap>
<select id="findStudentById"
parameterType="int"
resultMap="studentResultMap">
select s.s_id,s_name,t.t_id,t.t_name
from t_student s,t_inner i,t_teacher t
where s.s_id=i.s_id and i.t_id=t.t_id and
s.s_id =#{sId}

</select>
</mapper>
6.4.5 测试结果
@Test
public void testDemo(){
//使用工具类获取SqlSession对象
SqlSession sqlSession =
SqlSessionUtil.openSession();
//基于接口获取实现类对象(代理对象)
TeacherMapper teacherMapper =
sqlSession.getMapper(TeacherMapper.class);
StudentMapper studentMapper =
sqlSession.getMapper(StudentMapper.class);
//通过多态调用方法
Teacher teacher =
teacherMapper.findTeacherById(1);
Student student =
studentMapper.findStudentById(1);
//输出结果
System.out.println(teacher);
System.out.println(student);
//释放资源
sqlSession.close();
}

.MyBatis动态SQL

7.1 动态SQL需求和简介

经常遇到很多按照很多查询条件进行查询的情况,比如京东的
商品搜索等。其中经常出现很多条件不取值的情况,在后台应
该如何完成最终的 SQL 语句呢?
动态 SQL MyBatis 的强大特性之一。如果你使用过 JDBC
或其它类似的框架,你应该能理解根据不同条件拼接 SQL
句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还
要注意去掉列表最后一个列名的逗号。利用动态 SQL ,可以
彻底摆脱这种痛苦。

7.2 动态SQL之和标签

7.2.1 编写接口方法
public interface EmployeeMapper {
//根据条件查询用户信息
public List<Employee>
findByCondition(Map<String,Object> map);
}
7.2.2 编写映射配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper
3.0//EN"
"https://mybatis.org/dtd/mybatis-3-
mapper.dtd">
<mapper
namespace="com.lzw.mapper.EmployeeMapper">
<!--
if标签:判断这个SQL语句片段是否要加入整个SQL语
句
true加入整个SQL语句中
false不加入整个SQL语句中
where标签:判断是否追加where关键字,会自动去除
多余的 and or关键字
-->
<select id="findByCondition"
resultType="Employee">
select * from t_emp
<where>
<if test="empName !=null">
emp_name = #{empName}
</if>
<if test="empSalary !=null">
and emp_salary = #{empSalary}
</if>
</where>
</select>

</mapper>
7.2.3 编写测试代码
@Test
public void testDemo(){
//使用工具类获取SqlSession对象
SqlSession sqlSession =
SqlSessionUtil.openSession();
//基于接口获取实现类对象(代理对象)
EmployeeMapper employeeMapper =
sqlSession.getMapper(EmployeeMapper.class);
//通过多态调用方法
Map<String,Object> map=new HashMap<>();
//map.put("empName","张三");
//map.put("empSalary",200.33);
List<Employee> employeeList =
employeeMapper.findByCondition(map);
//输出结果
System.out.println(employeeList);
//释放资源
sqlSession.close();
}

ok了家人们,明天见

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/894414.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

赋能特大城市水务数据安全高速运算,深圳计算科学研究院YashanDB数据库系统斩获“鼎新杯”二等奖

第三届“鼎新杯”数字化转型应用优秀案例评选结果日前正式公布&#xff0c;深圳计算科学研究院联合深圳市环境水务集团有限公司申报的《深圳环境水务国产数据库YashanDB&#xff0c;赋能特大城市水务数据安全高速运转》案例&#xff0c;经过5个多月的评审&#xff0c;从4000申报…

设计模式04-创建型模式1(简单工厂/工厂模式/抽象工厂/Java)

3.1 简单工厂模式 3.1.1 创建型模式 创建型设计模式将对象的创建过程和对象的使用过程分离&#xff0c;用户使用对象时无需关注对象的创建细节&#xff0c;外界对于这些对象只需要知道它们共同的接口&#xff0c;而不用清楚其实现细节&#xff0c;使得整个系统的设计更加符合…

Redis JSON介绍

Redis JSON介绍 Redis JSON先说说JSON是什么再说说JSON Path先推荐两个网站JSONPath JAVA clents Redis JSON 安装内存json命令语法命令url命令解释JSON.ARRAPPENDJSON.ARRINDEXJSON.ARRINSERTJSON.ARRLENJSON.ARRPOPJSON.ARRTRIMJSON.CLEARJSON.DEBUG MEMORYJSON.DEBUGJSON.DE…

单例模式(自动加载)

目录 介绍 使用 在脚本中写一个函数 让一个「自定义场景」作为单例「自动加载」 介绍 单例模式是编程中的一种设计思想&#xff0c;是为了解决某些编程语言中没有全局变量概念而产生的这对于实现某种模块非常好用 比如玩家信息&#xff0c;有时候&#xff0c;游戏中的很多…

数组中超过一半的元素

有一个数组&#xff0c;找出其中数量超过的元素是谁。比如数组 [3, 2, 3] &#xff0c;输出 3。 这个问题要解起来不难&#xff0c;暴力计数&#xff0c;转为 map&#xff0c;排序都能解决。但是他们的空间复杂度都不低&#xff0c;即便排序能做到 O(1) 的空间复杂度&#xff…

计算机系统简介

一、计算机的软硬件概念 1.硬件&#xff1a;计算机的实体&#xff0c;如主机、外设、硬盘、显卡等。 2.软件&#xff1a;由具有各类特殊功能的信息&#xff08;程序&#xff09;组成。 系统软件&#xff1a;用来管理整个计算机系统&#xff0c;如语言处理程序、操作系统、服…

电影评论网站:Spring Boot技术栈应用

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理电影评论网站的相关信息成为必然。开发合适…

安装macOS Sequoia注意事项

随着macOS Sequoia的发布&#xff0c;许多Mac用户开始计划升级到这一最新版本。然而&#xff0c;升级系统并非简单点击“升级”按钮即可。在安装新系统之前&#xff0c;有一些关键的注意事项可以帮助你避免潜在的问题&#xff0c;确保顺利过渡到macOS Sequoia。本文将详细介绍在…

FPGA图像处理之三行缓存

文章目录 一、前言二、FPGA实现三行缓存的架构三、Verilog代码实现四、仿真验证五、输入图像数据进行仿真验证 一、前言 在 FPGA 做图像处理时&#xff0c;行缓存是一个非常重要的一个步骤&#xff0c;因为图像输入还有输出都是一行一行进行的&#xff0c;即处理完一行后再处理…

实现uniapp天地图边界范围覆盖

前言&#xff1a; 在uniapp中&#xff0c;难免会遇到使用地图展示的功能&#xff0c;但是百度谷歌这些收费的显然对于大部分开源节流的开发者是不愿意接受的&#xff0c;所以天地图则是最佳选择。 此篇文章&#xff0c;详细的实现地图展示功能&#xff0c;并且可以自定义容器宽…

Python画笔案例-086 turtle 多线程绘画

1、turtle 多线程绘画 通过 python 的turtle 库 多线程绘画,如下图: 2、实现代码 turtle 库 多线程绘画,以下为实现代码: """多线程绘画.py """ from random import random,randint from turtle import Turtle,Screen from threading

SpringDataRedis快速入门

SpringDataRedis 什么是SpringDataRedis SpringData是Spring中数据操作的模块,包含对各种数据库的集成,其中对Redis的集成模块就叫做SpringDataRedis SpringDataRedis中提供了RedsiTemplate工具类,其中封装了各种对Redis的操作。并且将不同数据类型的操作API封装到了不同的类…

redis基础—主从同步原理与配置以及哨兵模式

一&#xff1a;redis的主从同步原理 1.slave节点发送同步请求到master节点 2.slave节点通过master节点的认证开始进行同步 3.认证结束后&#xff0c;master节点开启bgsave进程 4.master节点会开启bgsave进程发送内存快照rbd到slave节点&#xff0c;在此过程中是异步操作&…

【原创】java+springboot+mysql在线文件管理系统设计与实现

个人主页&#xff1a;程序猿小小杨 个人简介&#xff1a;从事开发多年&#xff0c;Java、Php、Python、前端开发均有涉猎 博客内容&#xff1a;Java项目实战、项目演示、技术分享 文末有作者名片&#xff0c;希望和大家一起共同进步&#xff0c;你只管努力&#xff0c;剩下的交…

Docker学习笔记(2)- Docker的安装

1. Docker的基本组成 镜像&#xff08;image&#xff09;&#xff1a;Docker镜像就像是一个模板&#xff0c;可以通过这个模板来创建容器服务。通过一个镜像可以创建多个容器。最终服务运行或者项目运行就是在容器中。容器&#xff08;container&#xff09;&#xff1a;Docker…

Spring6梳理14——依赖注入之P命名空间

以上笔记来源&#xff1a; 尚硅谷Spring零基础入门到进阶&#xff0c;一套搞定spring6全套视频教程&#xff08;源码级讲解&#xff09;https://www.bilibili.com/video/BV1kR4y1b7Qc 目录 ①搭建模块 ②引入配置文件 ③创建bean-dip.xml文件 ④创建课程类文件 ⑤创建学生…

基于SpringBoot+Vue+uniapp微信小程序的校园反诈骗微信小程序的详细设计和实现(源码+lw+部署文档+讲解等)

项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不是配置文件。Spring Boot 通过自动化配置和约…

day-69 使二进制数组全部等于 1 的最少操作次数 II

思路 与3191. 使二进制数组全部等于 1 的最少操作次数 I思路类似&#xff0c;区别在于该题每次将下标i开始一直到数组末尾所有元素反转&#xff0c;所以我们用一个变量可以统计翻转次数 解题过程 从左向右遍历数组的过程中&#xff0c;有两种情况需要进行翻转&#xff1a;1.当…

【Linux】内存文件系统的I/O、重定向

文章目录 1. 系统中的文件2. 回顾C中的文件接口3. 文件类的系统调用3.1 open3.2 文件描述符 4. IO的基本过程5.重定向5.1 引入重定向5.2 系统中的重定向接口 6. 缓冲区问题7. 简单版shell的实现 1. 系统中的文件 在学习完Linux权限后&#xff0c;我们清楚的知道&#xff1a;文…

【JVM】内存模型

文章目录 内存模型的基本概念案例 程序计数器栈Java虚拟机栈局部变量表栈帧中局部变量表的实际状态栈帧中存放的数据有哪些 操作数栈帧数据 本地方法栈 堆堆空间是如何进行管理的? 方法区静态变量存储 直接内存直接内存的作用 内存模型的基本概念 在前面的学习中,我们知道了字…