文章目录
- 一、相关概念Mybatis
- 1.1 什么是Mybatis
- 1.1 如何实现简化JDBC
- 二、如何创建 Mybatis 项目
- 2.1 创建SpringBoot项目 + 加载依赖
- 2.2 准备数据库 以及 对象的映射
- 2.3 配置数据库连接池
- 2.4 使用Mybatis操作数据库
- 2.5 单元测试
- 三、其他
- 3.1 数据库与Java对象的映射规则 ---- 结果映射
- 【1】概念介绍
- 【2】注解写法的处理方式
- 【3】xml写法的处理方式
- 3.2 传参规则
- 3.3 参数重命名规则
- 3.2 开发规范介绍
- 3.3 打印 Mybatis 执行的SQL
一、相关概念Mybatis
1.1 什么是Mybatis
- 是持久层框架:是一个用来操作数据库的持久层框架,基于JDBC开发的,可以简化JDBC的开发(将JDBC共性的东西放在框架里,程序员只要基于框架写个性的内容即可)
- 使用场景:我们一般会使用Mybatis操作关系型数据库
- 关于官网:Mybatis官网
- 两个依赖的区分:
1.1 如何实现简化JDBC
- 创建数据库连接池DataSource:在Spring Boot的配置文件中配置一下数据库的信息即可
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/mycnblog?characterEncoding=utf8&useSSL=false
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
- 通过DataSource获取数据库连接Connection:底层有一个默认的数据库连接池,可以直接从这里面拿连接
- 编写SQL语句:分为注解和xml两种写法
@Select("select * from userinfo") //查询操作的注解写法
- 通过Connection即SQL创建命令对象 Statement:
- 替换占位符:
- 使用Statement执行SQL语句:
- 根据查询/增删改执行不同的方法:
- 处理结果:
- JDBC中,执行查询操作我们需要遍历结果集。而Mybatis直接返回一个List即可,Mybatis会根据我们的返回结果自动匹配
@Select("select * from userinfo")
List<UserInfo> selectAll();
- 处理异常和释放资源:异常还是要我们自己处理的,但一旦方法执行完了,Mybatis会立马帮我们释放资源
二、如何创建 Mybatis 项目
2.1 创建SpringBoot项目 + 加载依赖
- 需要加载的依赖:
2.2 准备数据库 以及 对象的映射
- 准备数据库:进行建库建表操作
- 关于数据库客户端的使用:小黑框和图形化的数据库都可以使用
- 关于数据库客户端的使用:小黑框和图形化的数据库都可以使用
- 对象的映射:数据库对象和Java对象映射
2.3 配置数据库连接池
注意要根据自身数据库的情况,进行修改,如密码、数据库名、版本等
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/mycnblog?characterEncoding=utf8&useSSL=false
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
2.4 使用Mybatis操作数据库
- 创建包和接口:因为我们用的是@Mapper,所以包通常设置为【mapper】,类名则是以【Mapper】结尾,可以方便我们查找
- @Mapper:是ibatis提供的注解,ibatis是Mybatis前身。加了@Mapper就不需要再加上五大注解了。
- 作用:寓意【Mybatis告诉Spring来管理这个对象】,效果和五大注解差不多。此处我们用的是Mybatis框架,故而不用五大注解。
- 为什么不是创建一个类:如果是一个类,selectAll方法里就必须要写方法的实现了
- @Select:表示一个查询语句,里面的参数是表示SQL语句的字符串。我们使用不同的注解,会调用不同的方法。
2.5 单元测试
- 方式一:原始版:在src文件下里写一个代码调用接口。下面是在Controller层写,但这其实并不规范,毕竟单元测试的代码并不符合【控制层】的定义。
@RestController
public class UserInfoController {
@Autowired
private UserInfoMapper userInfoMapper;
@PostConstruct
public void init(){
List<UserInfo> userInfos = userInfoMapper.selectAll();
System.out.println(userInfos.toString());
}
}
- 方式二:使用IDEA测试类:在Mapper接口下,选择generate —>test,让IDEA帮我们生成测试代码
三、其他
3.1 数据库与Java对象的映射规则 ---- 结果映射
【1】概念介绍
- 什么是结果映射:Mybatis会自动根据数据库的字段名和Java对象的属性名进行映射
- 名称一致:直接赋值
- 名称不一致:
- 从mysql层面进行结果映射 :xxx as xxx
不推荐,感觉改变了mysql的命名规范,而且把SQL语句弄得很复杂 - 从Mybatis层面进行结果映射:告诉Mybatis哪些字段是对应的,让它帮我们映射
- 配置驼峰自动转换:因为命名规范上,数据库默认用蛇形,Java属性名用小驼峰。故而可以直接写入配置文件,由Mybatis映射时自动转驼峰
- 从mysql层面进行结果映射 :xxx as xxx
【2】注解写法的处理方式
1. 对mysql查询结果重命名
@Select("select id, username, password, age, gender," +
"phone, delete_flag as deleteFlag, create_time as createTime," +
"update_time as updateTime from userInfo ")
List<UserInfo> selectAll();
2. 使用@Results、@Result
3. 配置自动转驼峰:Mybatis拿到数据结果后,会读取配置,然后根据配置里的内容进行结果映射
mybatis:
configuration:
map-underscore-to-camel-case: true #自动驼峰转换
【3】xml写法的处理方式
1. 对mysql查询结果重命名:和注解的一样
<?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="com.example.sp20240530.mapper.UserInfoXMLMapper">
<select id="selectAll" resultType="com.example.sp20240530.model.UserInfo">
select id, username, password, age, gender,
phone, delete_flag as deleteFlag, create_time as createTime,
update_time as updateTime from userInfo
</select>
</mapper>
- 使用< resultMap>、< result>:
- resultType VS resultMap:前者指【结果的类型】,后者指【结果的映射】,有了resultMap就不需要resultType了
- 配置自动转驼峰:和注解的一样
3.2 传参规则
- 只有一个参数:如果只有一个参数,名称是可以不匹配的,Mybatis会直接拿去用。但通常情况下,为了方便去阅读,我们还是会让他们保持一致
@Mapper
public interface UserInfoMapper {
@Select("select * from userinfo where id = #{id}")
UserInfo selectUser(Integer id123);
}
- 有多个参数:要求名称对应上
3.3 参数重命名规则
- 参数不为对象:直接使用改名后的参数即可
@Mapper
public interface UserInfoMapper {
@Select("select * from userinfo where id = #{userId}")
UserInfo selectUser(@Param("userId") Integer id);
//结合了映射规则,只有一个参数的情况
@Select("select * from userinfo where id = #{userId111}")
UserInfo selectUser2(@Param("userId") Integer id);
}
- 参数为对象:用【对象.属性名】的写法
3.2 开发规范介绍
- XXXMapper:使用Mybatis对数据库的操作类,叫做XXXMapper(因为我们多用@Mapper)
- 企业建表规范:需要具备4个字段,哪怕项目中用不到,也需要我们有
- id:身份标识
- create_time:记录,可以方便后续使用
- delete_flag:表示一个删除的标志,表示数据有无被删除,可以让我们使用【逻辑删除】而不是【物理删除】
-
原理:企业开发中,我们一般不轻易删除数据,能用逻辑删除就用逻辑删除。
(1)逻辑删除指从逻辑上进行数据删除,如把标志改变,后续查找的时候不查找这块。物理删除则是delete操作,真的从硬盘里删除了数据(2)一旦物理删除了,后续找回数据十分麻烦,我们也并不确定该数据在未来是否真的再也不用了,故而不推荐物理删除。
-
- update_time:保障数据修改时的安全
- is_xxx:表达是否概念的字母,必须使用is_xxx的方式命名
- 字段名、表名全部小写:
- 开发时尽量不要使用*:需要查询哪些字段,直接去写即可,如果需要全部的字段就全部写完
3.3 打印 Mybatis 执行的SQL
- 作用:帮我们进行调试,看到SQL代码的执行情况(运行的SQL、参数、结果分别是什么)
- 打印在开发环境:该日志的打印只建议出现在开发环境中,不要出现在线上环境。
- 原理:因为当前我们打印这个日志,是为了帮助开发人员进行数据上的调试的。线上环境已经不是调试阶段了
- 环境分类:我们在实际的开发工作中,通常分为下面四种环境
- 开发环境:写代码过程中,进行调试的这个环境
- 方式:本地开发,或者一些公司提供单独的服务器让员工进行开发调试
- 数据库使用:使用的是开发环境的数据库
- 测试环境:测试人员使用的
- 数据库使用:使用的是测试的数据库、配置,和开发环境没什么关系
- 预发布环境:和线上环境同等地位,但不对外提供服务,主要用来观测上线的程序是否会出问题
- 数据库使用:和线上环境一样都用的是【线上数据库】
- 数据库使用:
- 发布环境(线上环境):域名后面会对应好几个服务器,分为“发布环境”和“预发布环境”,用户访问只能访问到“发布环境”。
- 开发环境:写代码过程中,进行调试的这个环境
mybatis:
configuration: # 配置打印 MyBatis 执行的 SQL
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl