一. Mybatis的概念
Mybatis是一款优秀的 持久化 框架,用于简化 JDBC 的开发.
持久层: 指的就是持久化操作的层,通常指数据访问层(dao),是用来操作数据库的.
二. 配置Mybatis 环境
MyBatis的创建是基于SpringBoot项目来创建的,较于SpringBoot项目的创建来说,只是增加了相关的MyBatis 依赖和数据库驱动。
注意:添加MyBatis依赖后,不要忘记添加数据库驱动,因为操作数据库就必须要添加相关数据库的驱动才可实现操作数据库。MyBatis 与数据库驱动成对出现
三. Mybatis 的使用
1. 添加依赖: Mybatis,Mysql 驱动
如上图
2. 配置数据库
3. 写Mapper
四. 常见问题
1. SQL语句错误
查看错误日志
2. 配置信息错误
检查账号密码
3. 未配置数据库
4. 数据库不存在
5. 表不存在
6. 方法名重复
五. Mybatis 的基础操作
查看数据库和代码:
运行结果: 名称对应不上的都没值
结论: Mybatis 的对应就是拿到sql 的返回结果按名称默认对应,对应的上就直接赋值
1. 打印日志
mybatis:
configuration: # 配置打印 MyBatis 执行的 SQL 日志
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
2. 参数的传递
2.1 单个参数
如果只有一个参数,参数名称不需要对应
测试代码: 在需要测试的Mapper接口中,右键->Generate->Test
记得加 @SpringBootTest 注解,加载Spring运行环境
2.2 多个参数
有多个参数传递,需名称一致
测试代码: 在需要测试的Mapper接口中,右键->Generate->Test
查询到deleteFlag为 1 ,gender为 2 的
2.3 参数重命名
注意: 加上@Param 注解之后,sql中使用的参数名称必须和@Param定义的一样
2.4 扩展
返回的结果只有一个,可以使用 List 或者 对象 来接收
如果有 多个 结果返回,必须使用 集合 接收
3. 增(Insert)
方法定义直接用对象,赋值时,直接使用对象的属性
下图各个对应的名称需一致
测试代码
返回结果:
也可以返回字段的 id: 加 @Options 注解
使用 @Param注解,参数是对象,赋值时,使用的是: 对象名.属性名
4. 删(delete)
5. 改(update)
6. 查(Select)
经过上面的查询,发现有几个字段是没有赋值的,只有 Java对象属性名称 和 数据库字段名称 一模一样时,才会进行赋值.
原因分析: 当自动映射查询结果时, Mybatis会自动获取结果中返回的列名并在 Java类中查找相同名字的属性(忽略大小写). 意味着如果发现了 ID 列和 id 属性, Mybatis会将列ID的值赋值给 id 属性.
解决办法:
1. 起别名
在SQL语句中,给列名起别名,保持别名和实体类属性名⼀样
2. 指定结果映射关系
把字段的值赋值给对象属性
也可以复用结果映射关系 (添加 id, value )
3. 驼峰命名
配置文件:
通常数据库列使用蛇形命名法进行命名(下划线分割各个单词),而Java属性一般遵循驼峰命名法约定,为了在这两种命名方式之间启用映射关系,需要将 map-underscore-to-camel-case 设为 true
六. Mybatis的XML 方式
1. 配置连接字符串和Mybatis
此步骤需要进行两项设置,数据库连接字符串设置和Mybatis的XML 文件设置.
如果是application.yml文件,配置内容如下:
2. 写持久层代码
持久层代码分为两部分:
1. 方法定义 Interface
2. 方法实现: XXX.xml
2.1 添加 Mapper 接口
数据持久层的接口定义
package org.bite.mybatis.mapper; import org.apache.ibatis.annotations.Mapper; import org.bite.mybatis.model.UserInfo; @Mapper public interface UserInfoXmlMapper { Integer insert(UserInfo userInfo); }
2.2 添加 UserInfoXMLMapper.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="org.bite.mybatis.mapper.UserInfoXmlMapper"> </mapper>
创建文件的路径参考
2.3 增(insert)
单元测试
运行结果
2.4 删(delete)
1) 方法定义 Interface
2) 方法实现: XXX.XML
3) 单元测试
4) 运行结果
2.5 改(update)
1) 方法定义 Interface
2) 方法实现: XXX.XML
3) 单元测试
4) 运行结果
2.6 查(select)
1) 方法定义 Interface
2) 方法实现: XXX.XML
3) 单元测试
4) 运行结果
3. 解决字段映射
3.1 起别名
参考注解
3.2 指定映射关系
1) 方法定义 Interface
2) 方法实现: XXX.XML
3) 测试运行不再赘述
3.3 驼峰自动转换
在配置文件中修改即可
4. 其他查询操作
4.1 多表查询
1) 方法定义 Interface
2) 方法实现: XXX.XML
3) 运行结果
4.2 #{ } 和 ${ }
#{ } 使用的是预编译SQL,通过 ? 占位的方式,提前对SQL进行编译,然后把参数填充到SQL语句中, # { } 会根据参数类型,自动拼接引号 ' '
${ } 会直接进行字符替换,一起对SQL进行编译,如果参数为字符串,需要加上引号 ' '
参数为数字类型时,也可以加上 ' ' ,查询结果不变,但可能会导致索引失效,性能下降
区别:
#{ } 和 ${ } 区别就是 预编译SQL 和 即时SQL 的区别.
1. 性能更高
2. 更安全 (防止SQL注入)
注入原因: # 预编译SQL,占位的方式
$ 即时SQL,直接拼接的方式
4.3 ${ } 使用场景
使用 ${sort} 可以实现排序查询,而使用 #{sort} 就不能实现排序查询了
注意: 此处 sort 参数为String类型,但是SQL语句中,排序规则是不需要加引号 ' ' 的,所以此时的 ${sort} 也不加引号
#{ } 会根据参数类型判断是否拼接引号 ' ' ,如果参数类型为String,就会加上 引号
4.4 LIKE 查询
like 使用 #{ } 报错
把 #{ } 改成 ${ } 可以正确查出来,但是 ${ }存在SQL注入的问题,所以不能直接使用${ }
解决办法: 使用 mysql 的内置函数 concatenate()来处理
七. 数据库连接池
7.1 介绍
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用⼀个现有的数据库连接,而不是再重新建立⼀个.
没有使用数据库连接池的情况: 每次执行SQL语句,要先创建一个新的连接对象,然后执行SQL语句,SQL语句执行完,再关闭连接对象释放资源,这种重复性的创建连接,销毁连接比较消耗资源
使用数据库连接池的情况: 程序启动时,会从数据库连接池中创建一定数量的Connection对象,当客户请求数据库连接池,会从数据库连接池中获取Connection对象,然后执行SQL,SQL语句执行完,再把Connection归还给连接池.
优点: 1. 减少了网络开销 2. 资源重用 3. 提升了系统的性能
Hikari: SpringBoot默认使用的数据库连接池
Druid: 如果想把默认的数据库连接池切换到Druid数据库连接池,只需要引入相关依赖即可