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)

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

解决方法:
-
起别名
-
结果映射
-
开启驼峰命名
起别名

结果映射

开启驼峰命名

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 #{} 和 ${}
