JavaWeb——后端之Mybatis

四、Mybatis

概念: Mybatis是一款持久层(Dao层)框架,用于简化JDBC(Sun操作数据库的规范,较繁琐)的开发

历史: Apache的一个开源项目iBatis,2010年由apache迁移到了google code,并改名MyBatis。2013年11月迁移到Github

1. 入门程序

1)创建Spring module;创建的时候勾选MyBatis Framework和MySql service(对应数据库的类型)

2)准备数据以及数据库环境

3)定义一个实体类,实体类的变量要与表中的数据类型以及名称对应,实体类变脸阿哥使用包装类,命名使用驼峰命名

4)创建Mybatis的环境,在模块的application.properties中声明

#驱动类名称
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#数据库连接的url
spring.datasource.url=jdbc:mysql://124.221.237.48(地址):3306/test(数据库名)
#连接数据库的用户名
spring.datasource.username=xy
#连接数据库的密码
spring.datasource.password=123456

5)定义mapper,就是使用Sql语句的类,要使用Mapper进行注解,这样运行时,会自动生成该接口的实现类对象(代理对象),并将该对象交给IOC容器管理。

在类中定义抽象方法,如果是查询就使用@Select()注解,括号中指定sql查询语句

注:要想有sql语法提示

选中Sql语句右键Show Context Actions——>inject language——>MySql(要想提示表名,要将数据库连接到IDEA——使用IDEA连接数据库)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在这里插入图片描述

6)在测试启动类中编写测试方法,因为要使用mapper接口中的方法,所以使用Autowired,从IOC中获取bean对象

2. 数据库池连接

使用配置文件进行配置之后,SpringBoot底层就会自动使用数据库连接池技术管理和分配连接

概念:

  • 数据库连接池是个容器,负责分配、管理数据库连接
  • 它允许应用程序重复使用一个现有的数据库连接,而不是再重建一个
  • 释放空闲时间超过最大空闲事件的连接,来避免因为没有释放连接而一起的数据库连接遗漏

优势:

  • 资源重用
  • 提升系统响应速度
  • 避免数据库连接遗漏

产品:

Druid

引入依赖(版本要对应调整)

# Spring2
<dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.8</version>
</dependency># Spring3
<dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-3-starter</artifactId><version>1.2.20</version>
</dependency>

配置数据库连接池类型(可以不)

Hikari(springboot默认)

3. lombok工具包

原有问题: 数据库中的数据要对应一个实体类,并为其生成构造器,getter/setter,toString等方法

lombok: 一个实用的java类库,能通过注解的形式自动生成构造器、getter/setter、equals、hashcode、toString等方法,并可以自动化生成日志变量,简化java开发,提高效率

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

准备工作: 添加依赖

<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId>
</dependency>

注: Lombok会在编译时,自动生成对应的java代码。我们使用lombok时,还需要安装一个lombok的插件(idea自带)

4. Mybatis基础操作

1)删除

EmpMapper.java

@Mapper
public interface EmpMapper {// 根据ID删除数据@Delete("delete from emp where id= #{id}")public void delete(Integer id);
}
// #{}是占位符,生成的就是预编译的SQL语句

测试方法

@SpringBootTest
class SpringbootMybatisCrudApplicationTests {@Autowiredprivate EmpMapper empMapper;@Testpublic void testDelete() {empMapper.delete(17);}
}

想要查看执行的日志信息可以配置==>预编译SQL

# 配置mybatis日志,指定输出到控制台
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

在这里插入图片描述

在这里插入图片描述

参数占位符

在这里插入图片描述

2)新增

接口方法

// 插入数据
@Insert("insert into emp(username, name, gender, image, job, entrydate, dept_id, create_time, update_time) " +"values(#{username}, #{name}, #{gender}, #{image}, #{job}, #{entrydate}, #{deptId}, #{createTime}, #{updateTime})")
public void insert(Emp emp);  // 参数太多,使用实体类进行封装

测试方法

@Test
public void testInsert() {Emp emp = new Emp();emp.setUsername("Tom");emp.setName("汤姆");emp.setImage("1.jpg");emp.setGender((short)1);emp.setJob((short)1);emp.setEntrydate(LocalDate.of(2000, 1, 1));emp.setCreateTime(LocalDateTime.now());emp.setUpdateTime(LocalDateTime.now());emp.setDeptId(1);empMapper.insert(emp);}

主键返回

插入数据成功后,想要获取这个插入数据的主键

@Options(useGeneratedKeys = true, keyProperty = "id")
@Insert("insert into emp(username, name, gender, image, job, entrydate, dept_id, create_time, update_time) " +"values(#{username}, #{name}, #{gender}, #{image}, #{job}, #{entrydate}, #{deptId}, #{createTime}, #{updateTime})")
public void insert(Emp emp);

3)更新

根据主键id查询回显

然后修改对应数据

@Update(更新的SQL语句)

4)查询

// 根据ID查询数据
@Select("select  * from emp where id = #{id}")
public Emp getById(Integer id);
@Test
public void testGetById() {Emp emp = empMapper.getById(1);System.out.println(emp);
}

在这里插入图片描述

数据封装

  • 实体类属性名和数据库表查询返回的字段名一致,mybatis会自动封装
  • 如果实体类属性名和数据库表查询返回的字段名不一致,不能自动封装(数据库属性命名是下划线分隔,实体类变量命名是驼峰)

解决数据封装问题

方案一:给数据库字段起别名

方案二:通过@Results,@Result注解手动映射封装

// 通过@Results和@Result注解进行封装
@Results({@Result(column = "dept_id", property = "deptId"),@Result(column = "create_time", property = "createTime"),@Result(column = "update_time", property = "updateTime")
})
@Select("select  * from emp where id = #{id}")
public Emp getById(Integer id);

方案三:开启Mybatis的驼峰命名自动映射开关(前提:数据库字段名字和Java中的属性名命名都是严格按照规范的)

# 开启mybatis的驼峰命名自动映射开关
mybatis.configuration.map-underscore-to-camel-case=true

条件查询

// 条件查询
//    @Select("select * from emp where name like'%${name}%' and gender=#{gender} and entrydate between #{begin} and #{end} order by update_time desc")
//    public List<Emp> list(String name, Short gender, LocalDate begin, LocalDate end);
// 为了防止SQL注入
@Select("select * from emp where name like concat('%', #{name}, '%') and gender=#{gender} and entrydate between #{begin} and #{end} order by update_time desc")
public List<Emp> list(String name, Short gender, LocalDate begin, LocalDate end);
@Test
public void testSelect() {
List<Emp> empList = empMapper.list("张", (short)1, LocalDate.of(2010, 1, 1), LocalDate.of(2020, 1, 1));
System.out.println(empList);
}

5. XML映射文件(配置SQL语句)

在这里插入图片描述

条件查询的XML映射文件


<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itheima.mapper.EmpMapper"><!--第一个参数是方法名,第二个参数是查询返回的单条语句的全类名--><select id="list" resultType="com.itheima.pojo.Emp">select * from emp where name like concat('%', #{name}, '%') and gender=#{gender} and entrydate between #{begin} and #{end} order by update_time desc</select>
</mapper>

MybatisX是一款基于IDEA的快速开发Mybatis的插件,为效率而生

使用注解来映射简单的语句会使代码更加简洁,但是稍微复杂一点,就混乱不堪。——>如果做一些复杂的操作,最好使用XML来映射语句

6. 动态SQL

概念: 随着用户的输入或者外部条件的变化而变化的SQL语句

6.1 <if>

<mapper namespace="com.itheima.mapper.EmpMapper"><!--第一个参数是方法名,第二个参数是查询返回的单条语句的全类名--><select id="list" resultType="com.itheima.pojo.Emp">select *from empwhere<if test="name != null">name like concat('%', #{name}, '%')</if><if test="gender != null">and gender = #{gender}</if><if test="begin != null and end != null">and entrydate between #{begin} and #{end}</if>order by update_time desc</select></mapper>
@Test
public void testSelect() {// List<Emp> empList = empMapper.list("张", (short)1, LocalDate.of(2010, 1, 1), LocalDate.of(2020, 1, 1));List<Emp> empList = empMapper.list("张", null, null, null);System.out.println(empList);
}

在这里插入图片描述

问题: 如果第一个为空,wher就会紧跟着and,不合规的SQL

解决: 使用<where></where> 代替where

  • 动态生成where关键字
  • 自动去除条件前的and和or
<mapper namespace="com.itheima.mapper.EmpMapper"><!--第一个参数是方法名,第二个参数是查询返回的单条语句的全类名--><select id="list" resultType="com.itheima.pojo.Emp">select *from emp<where><if test="name != null">name like concat('%', #{name}, '%')</if><if test="gender != null">and gender = #{gender}</if><if test="begin != null and end != null">and entrydate between #{begin} and #{end}</if></where>order by update_time desc</select></mapper>

<set></set>

  • 去掉字段之后多余的逗号

6.2 <foreach>

<!--批量删除-->
<!--
collection:遍历的集合
item:遍历的元素
separator:分隔符
open:遍历开始前拼接的SQL片段
close:遍历结束后拼接的SQL片段
-->
<delete id="deleteByIds">delete from emp where id in<foreach collection="ids" item="id" separator="," open="(" close=")">#{id}</foreach>
</delete>
// 批量删除
public void deleteByIds(List<Integer> ids);
@Test
public void testDeletByIds() {List<Integer> ids = Arrays.asList(13, 14, 15);empMapper.deleteByIds(ids);
}

6.3 <sql><include>

重复SQL片段——》代码复用性差

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Zookeeper(持续更新)

VIP-01 Zookeeper特性与节点数据类型详解 文章目录 VIP-01 Zookeeper特性与节点数据类型详解正文1. 什么是Zookeeper&#xff1f;2. Zookeeper 核心概念2.1、 文件系统数据结构2.2、监听通知机制2.3、Zookeeper 经典的应用场景3.2. 使用命令行操作zookeeper 正文 什么是Zookee…

初学编程,到底选Java还是C++?

初学编程&#xff0c;到底选Java还是C? 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「C的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#x…

LeGO-LOAM 安装以及运行

一、源码地址&#xff1a; GitHub - RobustFieldAutonomyLab/LeGO-LOAM: LeGO-LOAM: Lightweight and Ground-Optimized Lidar Odometry and Mapping on Variable TerrainLeGO-LOAM: Lightweight and Ground-Optimized Lidar Odometry and Mapping on Variable Terrain - GitH…

异步任务判断执行和重复使用实现类

主要是展示一下如何在书写异步任务判断的时候&#xff0c;如何根据返回值类型进行重复使用相同接口里面的不同实现类的方法 /*** 父类接口* **/ public interface Exceutor {String getTaskType();void excetuor(String s); }/*** 异步处理任务的任务类型** author yangziqian…

arcpy点要素生成经纬度字段脚本

说明 本脚本是用来简化操作的&#xff0c;正常情况下要生成经纬度字段&#xff0c;需要添加字段→填写字段名→写字段类型→字段计算器→计算几何。。。 而且经纬度都需要&#xff0c;要循环两遍。 本脚本就是为了简化以上操作的&#xff0c;安装后&#xff0c;打开脚本直接输…

从《数据库索引设计与优化》看mysql索引设计

很久之前写的一篇文章&#xff0c;主要是结合mysql45讲和《数据库索引设计与优化》讨论索引设计的&#xff0c;拿出来分享下。 选用什么引擎 对于INSERT_SELECT型数据库&#xff0c;如果没有事务的要求&#xff0c;更倾向于选择MyISAM。 因为InnoDB会维护更多的数据&#xff…

一个古老的终端显示控制命令-tput命令|帮你解决中英文混合时终端列对齐输出问题

终端显示控制对于写一个 终端脚本 是非常有用的&#xff0c;在没有图形界面时Unix和类Unix系统用户都是在Terminal控制终端下工作的。虽然Linux操作系统的图形界面出现淡化了终端显示控制&#xff0c;但终端控制功能依旧是每个命令行用户不可或缺的一部分。只是我们不知道在使用…

【LeetCode:129. 求根节点到叶节点数字之和 | 二叉树 + 递归】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

记录汇川:水塔指令解释-ST

可以通过帮助查看指令手册 PLC的IO地址映射-两种方法 第一种&#xff1a; 新建一个全局变量表&#xff0c;按照如图所示建立IO地址 第二种&#xff1a; 直接如图所示位置定义名字 注意&#xff1a;IW和QB这两个前面一个有蓝色M一个没有。 蓝色的M表示模块发生变化的时候地址不会…

【S32K 进阶之旅】 NXP S32K3 以太网 RMII 接口调试(1)

前言 大联大世平集团推出了一款基于 NXP 车规级 MCU S32K344 的开发板——花名“Cavalry”&#xff0c;它使用 BGA257 封装的 32 位 ArmCortex-M7 S32K344 作为主控芯片&#xff0c;在69.6*130mm 的小体积开发板上搭载了 SBC 电源管理芯片、CAN 收发器、LIN 收发器、FLASH 存储…

低噪声,高增益的音频信号处理电路芯片选型分析

随着智能手机、汽车音频、AI智能音箱&#xff0c;智能家居、家庭影院、平板电脑、笔记本电脑等智能设备的普及&#xff1b;数字音频功放芯片的应用也越来越广泛&#xff1b;同时对音频信号处理的芯片的性能要求越来越高&#xff1b;以下几款就是常用热门音频信号处理电路芯片分…

NVM NodeJs版本管理 通关宝典

NVM NodeJs版本管理 通关宝典&#x1f3f9; 文章目录 NVM NodeJs版本管理 通关宝典&#x1f3f9;一、NVM是什么二、开始使用NVM三、NVM 命令速查四、手动安装特定Node版本(Windows)&#x1f644;4.1 NVM for windows 运行机制4.2 手动安装流程 五、切换 NVM 下载镜像源六、常见…

21. Mysql 事件或定时任务,解放双手,轻松实现自动化

文章目录 概念常见操作事件调度器操作查看事件创建事件删除事件启动与关闭事件 精选示例构造实时数据定时统计数据 总结参考资料 概念 Mysql 事件是一种在特定时间点自动执行的数据库操作&#xff0c;也可以称呼为定时任务&#xff0c;它可以自动执行更新数据、插入数据、删除…

x-cmd pkg | doggo - 现代化的 DNS 客户端

目录 简介首次用户快速实验指南功能特点类似工具与竞品进一步探索 简介 doggo 是一个由 Karan Sharma 于 2020 年使用 Go 语言开发的 DNS 客户端。它类似于 dig 命令&#xff0c;但旨在以现代化、简洁和可读的格式输出 DNS 查询结果。 首次用户快速实验指南 使用 x doggo 即可…

1.4 day4 IO进程线程

使用两个子进程进行文件拷贝&#xff0c;父进程进行资源回收 #include <myhead.h> int main(int argc, const char *argv[]) {//创建一个文件描述符并以只读的方式打开int fd-1;if((fdopen("./test.bmp",O_RDONLY))-1){perror("open error");return…

IDAPython详细版(二)

六&#xff1a;操作数 可以使用idc.get_openrand_typed(ea,n)得到操作数的类型。ea是地址&#xff0c;n是索引 这里有8种不同类型的操作数类 0_void 如果一个指令木有任何操作数它将返回0 0_reg 如果一个操作数是一个普通的寄存器将返回此类型。这个值在内部表示为1. o_mem …

java: 写入数据到HBase

一、添加依赖 <dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-client</artifactId><version>2.6.0</version></dependency><dependency><groupId>org.apache.hbase</groupId><art…

Prometheus-Alertmanage钉钉实现告警

获取钉钉的webhook地址 1、注册企业钉钉 a、注册企业钉钉 浏览器打开钉钉注册页面 填入手机号码&#xff0c;填入获取到的验证码&#xff0c;点注册 填入企业资料并注册 注册成功后&#xff0c;扫描二维码下载钉钉&#xff0c;如下图&#xff1a; b、添加机器人 管理后台 因…

Modbus RTU Learn

一、传输方式 采用主从应答方式进行 帧格式 功能码对应寄存器 演示01功能码 返回数据 0F 转换成二进制 02功能码 0F 转换成二进制 03功能码 读两个寄存器 04功能码 返回数据&#xff0c;读两个寄存器 05功能码 06功能码 10功能码 响应报文

在centos上安装WordPress 及创建配置文件无反应的解决方案

一、安装Apache服务 1.直接在命令行中输入以下命令即可,顺便安装编译组件&#xff1a; yum install -y httpd yum install -y httpd-devel2.启动Apache服务和设置Apache自启&#xff1a; 1 systemctl start httpd 2 systemctl enable httpd 3.添加一个测试页面&#xff0c;…