MyBatis 操作数据库(入门)

1. MyBatis入门

mybatis是一款优秀的持久层框架,用于简化JDBC的开发

MyBatis操作数据库的步骤:

1.准备工作

2.引入MyBatis的相关依赖,配置MyBatis

3.编写SQL语句

4.测试

1.1 数据准备

1.2 配置数据库连接字符串

1.3 写持久层代码

1.4 单元测试

方法一:

方法二:

方法三:


2. MyBatis的基础操作

2.1 打印日志

配置

2.2 参数传递

2.3 增(Insert)

直接使用UserInfo对象的属性名来获取参数


返回主键


如果绑定对象,要使用 userInfo.username

2.4 删(delete)

2.5 改(update)

2.6 查(select)

在查询时可以看出有些字段是没有赋值的,只有java对象属性和数据库字段完全一样时才会进行赋值

解决方法:

1.起别名

2.结果映射

3.开启驼峰命名

2.6.1 起别名

在SQL语句中,给列名起别名,保持别名和实体类属性名一样

2.6.2 结果映射

如果其他SQL,也希望可以复用这个映射关系,可以给这个Results定义⼀个名称

2.6.3 开启驼峰命名(推荐)

复制代码
mybatis:
  configuration:
    map-underscore-to-camel-case: true #配置驼峰⾃动转换

3. MyBatis XML配置文件

MyBatis的开发有两种方式

1.注解

2.XML

MyBatis XML 的方式需要以下两步

3.1 配置连接字符串和MyBatis

3.2 写持久层代码

添加UserInfoXMLMapper.xml

如果配置错误:

单元测试

3.3 增删改查操作

3.3.1 增(insertI)

3.3.2 删(delete)

3.3.3 改(update)

3.3.4 查(select)

从运行结果来看出有几个属性没有被赋值

解决方法:

  1. 起别名

  2. 结果映射

  3. 开启驼峰命名

起别名

结果映射

开启驼峰命名

4.其他查询操作

4.1 多表查询

4.2 #{} 和 ${}

先观察Integer类型的参数

输入的参数并没有在后面拼接,id的值使用?进行站位,这种SQL我们称之为**"预编译SQL**"

将#{} 改为 ${}

可以看到,这次的参数是直接拼接在SQL语句中了

观察String类型的参数


可以看到这次的参数依然直接拼接在SQL语句中,但是字符串作为参数时,需要添加引号

区别:

#{} ${} 的区别是预编译SQL和即时SQL的区别

1.性能更高

绝大多数情况下,某一条SQL语句可能会被反复调用执行,或者每次执行的时候只有个别的值不同,如果每次都需要经过上面雨大解析,SQL优化、SQL编译,效率会降低

预编译SQL,编译一次之后会将编译后的SQL语句缓存起来,侯建再次执行这条语句时,不会再次编译,省去解析优化的过程,以此来提高效率

2.更安全(防止SQL注入)

SQL注入:是通过操作输入的数据来修改事先定义好的SQL语句,已达到执行代码对服务器进行攻击的方法

sql 注入代码: ' or 1='1

为什么 #{} 能防止 SQL 注入?根本原因:使用了预编译 + 参数绑定机制

核心区别

  • #{} :预编译占位符。MyBatis 会将其替换为 ?,然后使用 PreparedStatement 进行参数设置。参数值被当作数据处理,不会改变 SQL 语句的结构。

  • ${} :字符串替换占位符。MyBatis 会直接拼接参数值到 SQL 语句中,参数值被当作SQL 代码的一部分,可能导致 SQL 语句结构改变。

4.3 排序功能

从上面的例子可以得出结论:{} 会有SQL注入的风险,所以要尽量使用 #{} 完成查询,但是{} 也是有其用处的

排序时传参数用 #{}

报错:

org.springframework.jdbc.BadSqlGrammarException

可以看出是SQL出错了

==> Preparing: select * from user_info order by id ?

==> Parameters: desc(String)

ORDER BY 需要的:是 SQL 语法关键字(ASC/DESC)或列标识符,不是字符串常量。

使用${} 要防止SQL注入,可以约束输入的值

除此之外,还有表名作为参数的时候,也只能使用 ${}

4.4 like查询

Caused by: java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0).

改为${}

由于输入的内容是无法预测和控制的,所以有SQL注入的风险

可以改变策略:使用MySQL内置函数 concat()来处理

5. 数据库连接池

5.1 介绍

数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个

**没有使用数据库连接池的情况:**每次执行SQL语句,有先创建一个新的连接对象,然后执行SQL语句,SQL语句执行完再关闭连接对象,这种重复的创建连接,销毁连接比较消耗资源

**使用数据连接池的情况:**程序启动,会在数据库连接池中创建一定数量的Connection对象,当客户请求数据库连接池,会获取Connection对象,然后执行SQL语句,执行完后再把Connection归还给数据库连接池

优点:

1.减少网络开销

2.资源重用

3.提升系统的性能

5.2 使用

常见的数据库连接池:C3P0,DBCP,Druid,Hikari

目前比较流行的是:Hikari Druid

5.2.1 Hikari

SpringBoot 默认使用的数据库连接池

5.2.2 Druid

6. 总结

6.1 MySQL 开发企业规范

6.2 #{} 和 ${}

相关推荐
电商API_180079052472 小时前
反向海淘是什么?现状如何?未来趋势如何?
数据库·人工智能·笔记·性能优化·数据挖掘·网络爬虫
MRSM_012 小时前
Redis 缓存、队列、排行榜的核心用法
数据库·redis·缓存
Trouvaille ~2 小时前
【Redis篇】Redis 安装与启动:快速搭建一个 Redis 环境
数据库·redis·后端·ubuntu·缓存·环境搭建·安装教程
fengxin_rou2 小时前
【Feed 高并发架构实战】:雪花 ID + 三级缓存 + 计数旁路设计详解
数据库·redis·缓存·架构·事务·并发
wand codemonkey3 小时前
SpringbootWeb【入门】+MySQL【安装】+【DataDrip安装 】+【连接MySQL】
java·mysql·mybatis
廿一夏11 小时前
MySql存储引擎与索引
数据库·sql·mysql
lzhdim13 小时前
SQL 入门 15:SQL 事务:从 ACID 到四种常见的并发问题
数据库·sql
瀚高PG实验室13 小时前
瀚高企业版V9.1.1在pg_restore还原备份文件时提示extract函数语法问题
数据库·瀚高数据库
TDengine (老段)14 小时前
TDengine Tag 设计哲学与 Schema 变更机制
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据