5--SpringBoot、Mybatis

news2024/9/24 23:31:47

目录

Mybatis

Mybatis入门操作步骤

1.准备工作

创建springboot工程

创建数据库表和实体类

连接数据库

创建接口XxxMapper

2.数据库连接池

Lombok

使用

Mybatis 

准备工作

删除

日志输入

参数占位符

新增

更新

查询

驼峰命名

条件查询

XML

创建XML文件

编写XML映射文件

Mybatis动态SQL

条件查询

更新员工


Mybatis

MyBatis是一款优秀的 持久层 框架,用于简化JDBC的开发。Mybatis框架,就是对原始的JDBC程序的封装。

JDBC ( Java DataBase Connectivity ),就是使用Java语言操作关系型数据库的一套API

MyBatis本是 Apache的一个开源项目iBatis,2010年这个项目由apache迁移到了google code,并

且改名为MyBatis 201311月迁移到Github

持久层:指的是就是数据访问层(dao),是用来操作数据库的。

框架:是一个半成品软件,是一套可重用的、通用的、软件基础代码模型。在框架的基础上进行软

件开发更加高效、规范、通用、可拓展。

使用Mybatis操作数据库,就是在Mybatis中编写SQL查询代码,发送给数据库执行,数据库执行后

返回结果。

Mybatis会把数据库执行的查询结果,使用实体类封装起来(一行记录对应一个实体类对象)

Mybatis入门操作步骤

1. 准备工作(创建springboot工程、数据库表user、实体类User)

2. 引入Mybatis的相关依赖,配置Mybatis(数据库连接信息)

3. 编写SQL语句(注解/XML)

1.准备工作

创建springboot工程

并导入 mybatis 的起步依赖、 mysql 的驱动包。

创建springboot时引入MyBatis Framework和MySQL Driver

在pom.xml文件中,自动导入了依赖

创建数据库表和实体类

在数据库中创建表user,并创建对应的实体类User

实体类的属性名与表中的字段名一一对应。

连接数据库

 在文件application.properties中配置增加代码

全部都是 spring.datasource.xxxx 开头。 

#驱动类名称
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#数据库连接的url
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis
#连接数据库的用户名
spring.datasource.username=root
#连接数据库的密码
spring.datasource.password=1234

记得修改url,使用自己数据库的用户名和密码

创建接口XxxMapper

在创建出来的 springboot 工程中,在引导类所在包下,在创建一个包 mapper 。在 mapper 包下创建一个
接口 UserMapper ,这是一个持久层接口( Mybatis 的持久层接口规范一般都叫 XxxMapper )。

在接口文件中加入代码

@Mapper
public interface UserMapper {
//查询所有用户数据
@Select("select id, name, age, gender, phone from user")
public List<User> list();
}

@Mapper注解:表示是mybatis中的Mapper接口

程序运行时,框架会自动生成接口的实现类对象(代理对象),并给交Spring的IOC容器管理

@Select注解:代表的就是select查询,用于书写select查询语句

对于 Mybatis 来说,在开发持久层程序操作数据库时,需要重点关注以下两个方面:

1. application.properties

#驱动类名称

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

#数据库连接的url

spring.datasource.url=jdbc:mysql://localhost:3306/mybatis

#连接数据库的用户名

spring.datasource.username=root

#连接数据库的密码

spring.datasource.password=1234

2. Mapper接口(编写SQL语句)

@Mapper

public interface UserMapper {

@Select("select id, name, age, gender, phone from user")

public List<User> list();

}

2.数据库连接池

数据库连接池是个容器,负责分配、管理数据库连接(Connection)

没有使用数据库连接池:

客户端执行SQL语句:要先创建一个新的连接对象,然后执行SQL语句,SQL语句执行后又需

要关闭连接对象从而释放资源,每次执行SQL时都需要创建连接、销毁链接,这种频繁的重复

创建销毁的过程是比较耗费计算机的性能。

使用数据库连接池

程序在启动时,会在数据库连接池(容器)中,创建一定数量的Connection对象

允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个

客户端在执行SQL时,先从连接池中获取一个Connection对象,然后在执行SQL语句,SQL语句执

行完之后,释放Connection时就会把Connection对象归还给连接池(Connection对象可以复用)

释放空闲时间超过最大空闲时间的连接,来避免因为没有释放连接而引起的数据库连接遗漏

客户端获取到Connection对象了,但是Connection对象并没有去访问数据库(处于空闲),数据库连

接池发现Connection对象的空闲时间 > 连接池中预设的最大空闲时间,此时数据库连接池就会自

动释放掉这个连接对象

数据库连接池的好处:

1. 资源重用

2. 提升系统响应速度

3. 避免数据库连接遗漏

常见的数据库连接池:

C3P0 、DBCP 、Druid 、Hikari (springboot默认)

现在使用更多的是:Hikari、Druid (性能更优越) 、Hikari(追光者) [默认的连接池]

如果想把默认的数据库连接池切换为Druid数据库连接池,只需要完成以下两步操作即可:

1. pom.xml文件中引入依赖

<dependency>

<!-- Druid连接池依赖 -->

<groupId>com.alibaba</groupId>

<artifactId>druid-spring-boot-starter</artifactId>

<version>1.2.8</version>

</dependency>

2. application.properties 中引入数据库连接配置

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

spring.datasource.url=jdbc:mysql://localhost:3306/mybatis

spring.datasource.username=root

spring.datasource.password=1234

优点

1. 数据库连接四要素(驱动、链接、用户名、密码),都配置在springboot默认的配置文件

application.properties中

2. 查询结果的解析及封装,由mybatis自动完成映射封装,我们无需关注

3. 在mybatis中使用了数据库连接池技术,从而避免了频繁的创建连接、销毁连接而带来的资源浪

费。

使用SpringBoot+Mybatis的方式操作数据库,能够提升开发效率、降低资源浪费

1. application.properties

2. Mapper接口(编写SQL语句)

3. 数据库连接池

在前面我们所讲解的mybatis中,使用了数据库连接池技术,避免频繁的创建连接、销毁连接而带来的资源浪费。

Lombok

Lombok是一个实用的Java类库,可以通过简单的注解来简化和消除一些必须有但显得很臃肿的Java代码。

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

使用

1 步:在 pom.xml 文件中引入依赖

<!-- springboot的父工程中,已经集成了lombok并指定了版本号,故当前引入依赖时不需要指定 version -->

<dependency>

<groupId>org.projectlombok</groupId>

<artifactId>lombok</artifactId>

</dependency>

 2步:在实体类上添加注解

import lombok.Data;

@Data //getter方法、setter方法、toString方法、hashCode方法、equals方法

@NoArgsConstructor //无参构造

@AllArgsConstructor//全参构造

public class User {

private Integer id;

private String name;

private Short age;

private Short gender;

private String phone;

}

Mybatis 

准备工作

1. 准备数据库表

2. 创建一个新的springboot工程,选择引入对应的起步依赖(mybatismysql驱动、lombok

3. application.properties中引入数据库连接信息

4. 创建对应的实体类 Emp(实体类属性采用驼峰命名)

5. 准备Mapper接口 EmpMapper

准备好后,项目工程结构目录如下

删除

SQL语句

-- 删除 id=17 的数据
delete from emp where id = 17 ;

接口方法实现删除操作

@Mapper

public interface EmpMapper {

@Delete("delete from emp where id = #{id}")//使用#{key}方式获取方法中的参数值

public void delete(Integer id);

}

@Delete注解:用于编写delete操作的SQL语句

日志输入

Mybatis当中我们可以借助日志,查看到sql语句的执行、执行传递的参数以及执行结果。具体操作如下:

1. 打开application.properties文件

2. 开启mybatis的日志,并指定输出到控制台

#指定mybatis输出日志的位置, 输出控制台

mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

预编译SQL的两个优势:

性能更高:预编译SQL,编译一次之后会将编译后的SQL语句缓存起来,后面再次执行这条语句

时,不会再次编译。(只是输入的参数不同)

更安全(防止SQL注入):将敏感字进行转义,保障SQL的安全性。

参数占位符

在Mybatis中提供的参数占位符有两种:${...} 、#{...}

#{...}

执行SQL时,会将#{…}替换为?,生成预编译SQL,会自动设置参数值

使用时机:参数传递,都使用#{…}

${...}

拼接SQL。直接将参数拼接在SQL语句中,存在SQL注入问题

使用时机:如果对表名、列表进行动态设置时使用

注意事项:在项目开发中,建议使用#{...},生成预编译SQL,防止SQL注入安全

新增

SQL语句

insert into emp(username, name, gender, image, job, entrydate, dept_id,

create_time, update_time) values ('songyuanqiao','宋远桥',1,'1.jpg',2,'2012-10-

09',2,'2022-10-01 10:00:00','2022-10-01 10:00:00');

接口方法实现删除操作

@Mapper

public interface EmpMapper {

@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);

}

更新

SQL语句

update emp set username = 'linghushaoxia' , name = ' 令狐少侠 ' , gender = 1 , image =
'1.jpg' , job = 2 , entrydate = '2012-01-01' , dept_id = 2 , update_time = '2022-10-
01 12:12:12' where id = 18 ;

接口方法实现更新操作

@Mapper

public interface EmpMapper {

/**

* 根据id修改员工信息

* @param emp

*/

@Update("update emp set username=#{username}, name=#{name}, gender=#{gender},

image=#{image}, job=#{job}, entrydate=#{entrydate}, dept_id=#{deptId},

update_time=#{updateTime} where id=#{id}")

public void update(Emp emp);

}

查询

SQL语句

select id, username, password , name, gender, image, job, entrydate, dept_id,
create_time, update_time from emp;

接口方法事项查询操作

@Mapper
public interface EmpMapper {
@Select ( "select id, username, password, name, gender, image, job, entrydate,
dept_id, create_time, update_time from emp where id=#{id}" )
public Emp getById ( Integer id );
}

驼峰命名

如果字段名与属性名符合驼峰命名规则, mybatis 会自动通过驼峰命名规则映射
# application.properties 中添加:
mybatis.configuration.map-underscore-to-camel-case = true

条件查询

SQL语句

select id, username, password , name, gender, image, job, entrydate, dept_id,
create_time, update_time
from emp
where name like '% %'
and gender = 1
and entrydate between '2010-01-01' and '2020-01-01 '
order by update_time desc ;

接口方法实现条件查询

方法一

@Mapper

public interface EmpMapper {

@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);

}

1. 方法中的形参名和SQL语句中的参数占位符名保持一致

2. 模糊查询使用${...}进行字符串拼接,这种方式呢,由于是字符串拼接,并不是预编译的形

式,所以效率不高、且存在sql注入风险。

性能低、不安全、存在SQL注入风险

方法二

@Mapper

public interface EmpMapper {

@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);

}

性能高、安全

XML

Mybatis的开发有两种方式

1. 注解

2. XML

使用Mybatis的注解方式,主要是来完成一些简单的增删改查功能。如果需要实现复杂的SQL功能,建议

使用XML来配置映射语句,也就是将SQL语句写在XML配置文件中。

Mybatis中使用XML映射文件方式开发,需要符合一定的规范

1. XML映射文件的名称与Mapper接口名称一致,并且将XML映射文件和Mapper接口放置在相同包下(同包同名)

2. XML映射文件的namespace属性为Mapper接口全限定名一致

3. XML映射文件中sql语句的idMapper接口中的方法名一致,并保持返回类型一致。

<select>标签:就是用于编写select查询语句的。

resultType属性,指的是查询返回的单条记录所封装的类型

创建XML文件

编写XML映射文件

在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="">
</mapper>

Mybatis动态SQL

<if> :用于判断条件是否成立。使用test属性进行条件判断,如果条件为true,则拼接SQL

<if test="条件表达式">

要拼接的sql语句

</if>

条件查询

原SQL语句

<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>

动态SQL语句

<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>

order by update_time desc

</select>

使用 <where> 标签代替SQL语句中的where关键字

<where> 只会在子元素有内容的情况下才插入where子句,而且会自动去除子句的开头的AND

OR

动态SQL语句

<select id="list" resultType="com.itheima.pojo.Emp">

select * from emp

<where>

<!-- if做为where标签的子元素 -->

<if test="name != null">

and 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>

更新员工

修改Maper接口

@Mapper

public interface EmpMapper {

//删除@Update注解编写的SQL语句

//update操作的SQL语句编写在Mapper映射文件中

public void update(Emp emp);

}

修改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.itheima.mapper.EmpMapper">

<!--更新操作-->

<update id="update">

update emp

set

<if test="username != null">

username=#{username},

</if>

<if test="name != null">

name=#{name},

</if>

<if test="gender != null">

gender=#{gender},

</if>

<if test="image != null">

image=#{image},

</if>

<if test="job != null">

job=#{job},

</if>

<if test="entrydate != null">

entrydate=#{entrydate},

</if>

<if test="deptId != null">

dept_id=#{deptId},

</if>

<if test="updateTime != null">

update_time=#{updateTime}

</if>

where id=#{id}

</update>

</mapper>

使用 <set> 标签代替SQL语句中的set关键字

<set> :动态的在SQL语句中插入set关键字,并会删掉额外的逗号。(用于update语句中)

<?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.itheima.mapper.EmpMapper">

<!--更新操作-->

<update id="update">

update emp

<!-- 使用set标签,代替update语句中的set关键字 -->

<set>

<if test="username != null">

username=#{username},

</if>

<if test="name != null">

name=#{name},

</if>

<if test="gender != null">

gender=#{gender},

</if>

<if test="image != null">

image=#{image},

</if>

<if test="job != null">

job=#{job},

</if>

<if test="entrydate != null">

entrydate=#{entrydate},

</if>

<if test="deptId != null">

dept_id=#{deptId},

</if>

<if test="updateTime != null">

update_time=#{updateTime}

</if>

</set>

where id=#{id}

</update>

</mapper>

文中部分内容及图片来自黑马程序员

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

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

相关文章

关于前端知识中框架概念部分的详细介绍

1、为什么要学习流行框架&#xff1f; 企业&#xff1a;为了提高效率&#xff0c;因为时间就是金钱。开发人员&#xff1a;提高了开发效率发展进程&#xff1a; JS>JQuery>模板引擎>框架时代&#xff08;Angular(2)、React、Vue&#xff09;好处&#xff1a;不用直接…

2.安卓逆向-初识java语言

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;图灵Python学院 上一个内容&#xff1a;1.安卓逆向-说明 关于java语言的介绍就不写了没啥用直接开始 首先java语言写的代码运行说明 …

kolors文生图框架安装

环境安装 根据Kolors【github】的指引&#xff0c;安装命令如下&#xff1a; apt-get install git-lfs git clone https://github.com/Kwai-Kolors/Kolors cd Kolors conda create --name kolors python3.8 conda activate kolors pip install -r requirements.txt python3 s…

Vue3+TS项目封装SVG图标显示组件vite-plugin-svg-icons插件使用

准备好svg文件 假设从iconfont-阿里巴巴矢量图标库下载了一个svg格式的图标&#xff0c;放在我们项目里&#xff0c;并重命名为ic_money.svg&#xff0c;相对路径为&#xff1a;src\assets\images\icons\ic_money.svg 安装vite-plugin-svg-icons插件 npm install vite-plugi…

常用电路及分析

前言 最近在研究一些简单的硬件知识&#xff0c;把在网上看到的一些常见电路分析总结了一下。 有纰漏请指出&#xff0c;转载请说明。 学习交流请发邮件 1280253714qq.com 串联稳压电路 三极管串联线性稳压电路原理详解及Multisim仿真_三极管稳压电路-CSDN博客 线性稳压电…

Java小白一文讲清Java中集合相关的知识点(八)

HashMap底层机制及源码剖析 HashMap底层维护了Node类型的数组table,默认为null 当创建对象时&#xff0c;将加载因子初始化为0.75&#xff1b; 当添加key-value时&#xff0c;通过key的哈希值得到在table的索引&#xff0c;然后判断该索引处是否有元素&#xff0c;如果没有元…

力扣 — — 2555. 两个线段获得的最多奖品

力扣 — — 2555. 两个线段获得的最多奖品 一、题目描述 题目大意&#xff1a;给定一个数组prizePositions&#xff0c;数组中的值表示的是奖品的位置&#xff0c;每一个位置可以有多个奖品&#xff0c;并且设定一个线段的长度 K K K&#xff0c;要求从所有奖品位置中选择两个…

修改Netty 中EventLoopGroup的线程名字前缀

此方案针对 netty 4 , 阅读Netty 源码的过程中涉及到多种线程跳转&#xff0c;2-1 3-1 4-1 类似的命名头晕眼花&#xff0c;直接改了成方便辨认的名字吧&#xff01; 代码如下&#xff1a; public static EventLoopGroup getEventLoopGroup(String name, int nThread) {Defaul…

第十一周:机器学习

第十一周周报 摘要Abstract机器学习1. 注意力机制&#xff08;下&#xff09;1.1 multi-head self-attention&#xff08;多头注意力机制&#xff09;1.2 Positional Encoding&#xff08;位置编码&#xff09;1.3 truncated self attention&#xff08;截断式注意力机制&#…

SVGJS使用

svgjs用于操作 SVG 和动画的轻量级库。 官网 SVG.js v3.2 |家 (svgjs.dev) 1、安装 npm install svgdotjs/svg.js 或者下载直接引用 2、使用 <script src"https://cdn.jsdelivr.net/npm/svgdotjs/svg.js3.0/dist/svg.min.js"></script> import { S…

Win11 22H2/23H2用户速来!9月更新补丁KB5043076已发布

系统之家于9月11日发出最新报道&#xff0c;微软针对Win11用户发布了9月最新的更新补丁KB5043076&#xff0c;22H2用户升级系统后&#xff0c;版本号升至22621.4169&#xff0c;23H2用户的系统版本也升至22631.4169。此次更新支持用户从Windows分享窗口将内容共享到安卓设备。以…

95. UE5 GAS RPG 实现创建多段飞弹攻击敌人

从这篇开始&#xff0c;我们将实现一些技能&#xff0c;比如多段火球术&#xff0c;闪电链等等。 在这一篇里&#xff0c;我们先实现多段火球术&#xff0c;技能可以通过配置发射出多个火球术进行攻击。 创建多段火球函数 首先在我们之前创建的RPGFireBolt.h类里面增加一个生…

k8s的环境配置

一、前期系统环境准备 准备3台主机&#xff1a;硬盘50G cpu2个 内存2G 1、3台主机同时配置 1&#xff09;关闭防火墙与selinux、NetworkManager [rootk8s-master ~]# systemctl stop firewalld[rootk8s-master ~]# systemctl disable firewalldRemoved symlink /etc/systemd/…

ctfshow-web入门-sql注入-web248-UDF 注入

udf 全称为&#xff1a;user defined function&#xff0c;意为用户自定义函数&#xff1b;用户可以添加自定义的新函数到 Mysql 中&#xff0c;以达到功能的扩充&#xff0c;调用方式与一般系统自带的函数相同&#xff0c;例如 contact()&#xff0c;user()&#xff0c;versio…

VUE实现刻度尺进度条

一、如下图所示效果: 运行后入下图所示效果: 实现原理是用div画图并动态改变进度, 二、div源码 <div style="width: 100%;"><div class="sdg_title" style="height: 35px;"><!--对话组[{{ dialogGroup.index }}]编辑-->&…

如何在微信中使用AI智能回复,真AI大模型;微加机器人免费智能回复功能

之前一直想实现在微信中使用AI大模型进行消息回复&#xff0c;也使用过很多开源的工具自己调OpenAI的API&#xff0c;但是整体太复杂&#xff0c;而且跑在自己电脑上也不稳定 今天发现微加机器人也支持AI回复&#xff0c;而且AI功能还是免费的&#xff0c;没有tokens收费 微加…

【Gephi】可视化教程

此教程专供欣欣向荣及其舍友使用 文章目录 导入数据上色改变布局设置节点大小统计拓扑结构输出图形保存文件 导入数据 点击【文件】-【导入电子表格】 先选择csv格式的network 直接下一步 点击完成 【图的类型】改为“有向的” 点击确认 会弹出报错&#xff0c;直接clos…

CSS 响应式设计(补充)——WEB开发系列36

随着移动设备的普及&#xff0c;网页设计的焦点逐渐转向了响应式设计。响应式设计不仅要求网页在各种屏幕尺寸上良好展示&#xff0c;还要适应不同设备的特性。 一、响应式设计之前的灵活布局 在响应式设计流行之前&#xff0c;网页布局通常是固定的或流动的。固定布局使用固定…

vc-upload源码分析 -- ant-design-vue系列

vc-upload源码分析 – ant-design-vue系列 1 整体结构 上传组件的使用分两种&#xff1a;点击上传和拖拽上传。 点击的是组件或者是卡片&#xff0c;这个是用户通过插槽传递的。除上传外的其他功能&#xff0c;比如预览、自定义文件渲染等功能&#xff0c;也不是上传的核心功…

2. 变量和指令(omron 机器自动化控制器)——1

机器自动化控制器——第二章 变量和指令 1 2-1 变量一览表MC通用变量轴变量▶ 轴组变量 运动控制指令的输入变量输入变量的有效范围▶ 枚举体一览表 运动控制指令的输出变量运动控制指令的输入输出变量 2-1 变量一览表 MC功能模块使用的变量分为两类。 一类是监视轴等的状态及…