QA 由浅入深持久层框架- MyBatis Plus
ztj100 2025-01-06 16:30 29 浏览 0 评论
一、MyBatis-Plus Introduce
MyBatis-Plus是一款非常强大的MyBatis增强工具包,只做增强不做改变,在不用编写任何SQL语句的情况下即可以极其方便的实现单一、批量、分页等操作。
MyBatis-Plus支持通用CRUD操作,内置通用Mapper以及通用Service以及强大的条件构造器,并且支持逆向工程即支持代码生成器,其他特性可以参考MyBatis-Plus;关于通用Mapper可以参考Mappper3官网 或者 QA 由浅入深持久层框架(十)- MyBatis 通用 Mapper(Part A) 至 QA 由浅入深持久层框架(十三)- MyBatis 通用 Mapper(Part D) 这四篇文章
1.1 工程搭建
1.1.1 MyBatis-Spring集成
使用IDEA创建Maven工程创建mybatis-plus项目,加入Spring依赖、MyBatis依赖以及其他依赖。 同时resources目录下还需要Spring配置文件application.xml、MyBatis全局配置文件mybatis-config.xml、日志配置logback.xml以及数据库连接信息配置db.properties;具体配置可以参考 QA 由浅入深持久层框架(十)- MyBatis 通用 Mapper(Part A)。
新增entity包,增加实体类Tesla
@Data
public class Tesla {
private Integer id;
private String name;
private Double price;
private String vehicleType;
private String factory;
}
新增mapper包,增加TeslaMapper接口
public interface TeslaMapper {
Tesla selectTeslaById(Integer id);
}
resources目录下新增mappers文件夹,增加TeslaMapper.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="com.lilith.mapper.TeslaMapper">
<sql id="teslaAllColums">
id,name,price,vehicle_type,factory
</sql>
<select id="selectTeslaById" resultType="com.lilith.entity.Tesla">
SELECT
<include refid="teslaAllColums"></include>
FROM tesla where id = #{id}
</select>
</mapper>
test包下增加测试类TeslaMapperTest,对selectTeslaById方法进行测试
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:application.xml")
public class TeslaMapperTest {
@Autowired
private TeslaMapper teslaMapper;
@Test
public void selectTeslaById(){
Tesla tesla = teslaMapper.selectTeslaById(2);
System.out.println("查询到的内容为:" + tesla);
}
}
执行测试
1.1.2 集成MyBatis-Plus
集成MyBatis-Plus非常简单,只需要两步,并且MyBatis-Plus自动维护了MyBatis和MyBatis-Spring,所以只需要导入MyBatis-Plus的依赖就可以代替MyBatis和MyBatis-Spring。
第一步是增加MyBatis-Plus依赖,并注释MyBatis和MyBatis-Spring依赖
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus</artifactId>
<version>3.5.0</version>
</dependency>
第二步是替换SqlSessionFactory
<!--替换为MyBatis-Plus的MyBatisSqlSessionFactoryBean,原来是MyBatis的SqlSessionFactoryBean-->
<bean id="mybatisSqlSessionFactoryBean" class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean">
<!--标签内的内容保持不变-->
</property>
</bean>
复制代码
plus:集成MyBatis-Plus与集成通用Mapper的区别:
依赖不同
- 增加的依赖不同,通用Mapper没有维护MyBatis和MyBatis-Spring,导入依赖的时候需要导入通用Mapper的依赖、MyBatis依赖以及MyBatis-Spring的依赖
配置文件修改方式不同
- MyBatis继承通用Mapper需要修改Spring配置文件中的MapperScannerConfigurer为通用Mapper下的。MP使用的是MyBatis的MapperScannerConfigurer
- MyBatis继承MP需要修改SqlSessionFactoryBean为MP下的MyBatisSqlSessionFactoryBean,通用Mapper使用的就是MyBatis本身的SqlSessionFactoryBean
再次执行测试
控制台出现MP的logo,输出查询的数据,MP集成成功
二、MyBatis-Plus 的 CRUD
在搭建工程的时候就是使用的原生MyBatis集成Spring对tesla表进行了一次查询操作,使用MyBatis与使用通用Mapper以及使用MP(MyBatis-Plus)操作表步骤有什么区别?
使用MyBatis操作表的步骤是:
- 创建TeslaMapper接口,增加CRUD方法
- 创建TeslaMapper.xml映射文件,在映射文件中添加CRUD对应的SQL语句
使用通用Mapper操作表的步骤是:
- 创建TeslaMapper接口,集成通用Mapper的Mapper接口,就自动获得了CRUD方法,不需要Mapper XML文件
使用MP操作表的步骤是:
- 创建TeslaMapper接口,继承BaseMapper接口,就获得了CRUD方法,甚至不需要常见Mapper XML文件
2.1 BaseMapper接口
查看BaseMapper接口源码
可以看出BaseMapper接口中提供了许多CRUD的方法,继承BaseMapper接口就自动获得了这些方法
2.2 重要注解使用
@TableId注解
在TeslaMapperTest类中新增insert方法测试,往tesla表中插入一条记录
@Test
public void insert(){
Tesla tesla = new Tesla();
tesla.setName("Model 3 Performance");
tesla.setPrice(330000d);
tesla.setVehicleType("Compact Car");
tesla.setFactory("Shanghai Gigafactory");
teslaMapper.insert(tesla);
}
复制代码
执行测试
控制台输出的INSERT语句主键是1166057474,并不是按照已存在的数据递增,这是应为没有设置主键策略。
@TableId注解可以设置主键策略
在id属性上增加@TableId注解@TableId(type = IdType.AUTO),再次测试
查看数据库中插入的数据
插入的主键实现了自动递增
如果想要获取注解可以直接在插入成功后从插入的对象获取。MP会自动将主键回写到实体类中。在insert方法最后增加一句代码
System.out.println(tesla.getId());
复制代码
执行insert方法
控制台输出插入数据库的主键值
@TableName注解
在通用Mapper中需要通过注解将实体类和表、实体类属性和字段实现一一对应,防止在实体类属性名无法通过驼峰转换法转为与表字段名一致或者实体类类名与表名不一致再或者实体类中有些属性在表中没有对应的字段,那么MP与通用Mapper一致都是通过继承接口来获取通用CRUD方法,MP应该有一些注解可以将表和实体类、字段和属性一一对应起来。
首先来看看如果表名和类名不一致,再次执行插入会出现什么错误。修改表tesla的表名为t_tesla
增加测试方法,对MP提供的selectById方法测试
@Test
public void selectById(){
Tesla tesla = teslaMapper.selectById(2);
System.out.println("查询到的内容为:" + tesla);
}
复制代码
执行selectById方法
默认查询的表名为实体类名的首字母小写
需要使用@TableName注解将Tesla实体类与t_tesla表关联起来 @TableName(value = "t_tesla")
再次执行selectById方法
成功查询出id为2的记录,查询的表名是注解中指定的表名
MP全局策略配置
在表非常多的情况下,如果每个表都需要指定主键生成策略以及使用注解指定表名,也会非常麻烦,所以可以通过全局配置来解决
主键的全局配置
在application.xml配置文件中可以设置MP全局策略,通过bean标签进行设置并且在mybatisSqlSessionFactoryBean中引入全局配置。
<!--将DB配置注入全局配置-->
<bean id="globalConfig" class="com.baomidou.mybatisplus.core.config.GlobalConfig">
<property name="dbConfig" ref="dbConfig"/> <!-- 非必须 -->
</bean>
<bean id="dbConfig" class="com.baomidou.mybatisplus.core.config.GlobalConfig.DbConfig">
<!--全局配置主键策略,AUTO或者索引0-->
<property name="idType" value="AUTO"></property>
</bean>
复制代码
在mybatisSqlSessionFactoryBean中注入全局配置
<!--替换为MyBatis-Plus的MyBatisSqlSessionFactoryBean,原来是MyBatis的SqlSessionFactoryBean-->
<bean id="mybatisSqlSessionFactoryBean" class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean">
</property>
<!--将全局配置注入到SqlSessionFactoryBean-->
<property name="globalConfig" ref="globalConfig" />
</bean>
复制代码
将Tesla实体类上的@TableId注解注释,执行insert方法
查看数据库插入的记录
同样可以实现主键自动递增,这样就免去了在每一个实体类的主键属性上增加@TableId注解
表名的全局配置
如果表名都有统一的前缀,也可以使用全局配置
<bean id="dbConfig" class="com.baomidou.mybatisplus.core.config.GlobalConfig.DbConfig">
<!--全局配置主键策略,AUTO或者索引0-->
<property name="idType" value="AUTO"></property>
<!--配置统一表名前缀-->
<property name="tablePrefix" value="t_" />
</bean>
复制代码
将实体类上的@TableName注解注释,执行selectById方法
查询的表名成功加上了指定的前缀。
其他MP配置请参考官方配置文档
@TableField注解
如果表字段和实体类属性完全不一致,这就不仅仅是通过配置驼峰命名法能够解决的了。
修改Tesla实体类属性,更改name为vehicleName、更改price为vehiclePrice
@Data
public class Tesla {
private Integer id;
private String vehicleName;
private Double vehiclePrice;
private String vehicleType;
private String factory;
}
复制代码
执行selectById测试
在实体类属性和字段名不一致的时候可以使用@TableField注解来表示该属性和指定的字段一一对应。修改Tesla实体类
@Data
public class Tesla {
private Integer id;
@TableField(value = "name")
private String vehicleName;
@TableField(value = "price")
private Double vehiclePrice;
private String vehicleType;
private String factory;
}
复制代码
再次selectById测试
控制台输出的SQL语句中增加了别名,别名就是原本的属性名,成功查询出数据。
@TableField的属性有value和exist,value就是要指定对应的字段的名称;exist指该属性在表中是否有对应的字段,默认是true
2.3 MP中关于表和实体类注解与通用Mapper中关于表和实体类注解的区别
MP中通过注解来解决实体类和表以及属性和字段的对应关系
- @TableName:将实体类和指定的表对应起来,默认的表名是实体类名字的首字母小写
- @TableId:指定主键生成策略,存在默认的生成策略
- @TableField:设置属性与指定字段一一对应
在通用Mapper中也可以通过注解来解决实体类和表对应关系
- @Table:该注解用来将实体类与指定的表一一对应
- @Id:该注解用来指定属性与表中主键字段对应
- @GeneratedValue:该注解用来指定主键的生成策略,与@Id同时使用
- @Column:该注解用来将实体类属性和字段一一对应起来
- @Transient:该注解表示属性在表中吴对应的字段
原生MyBatis注解策略需要在insert标签内使用两个属性useGeneratedKeys和keyProperty来获取生成的主键。
<insert id="insertEmployee" useGeneratedKeys="true" keyProperty="id">
INSERT INTO t_employee(empname,gender,email) values (#{empName},#{gender},#{email})
</insert>
复制代码
2.4 MP 的 insert 相关方法
MP中BaseMapper的insert方法会将实体类插入带数据库表中,MP会对插入的属性进行值判断,可以实现将有值的字段插入,值为空的属性不会执行插入操作。
更改TeslaMapperTest中的insert方法,将部分属性赋值的代码注释,
@Test
public void insert(){
Tesla tesla = new Tesla();
tesla.setVehicleName("Model 3 Performance");
// tesla.setVehiclePrice(330000d);
// tesla.setVehicleType("Compact Car");
tesla.setFactory("Shanghai Gigafactory");
teslaMapper.insert(tesla);
System.out.println(tesla.getId());
}
复制代码
执行测试
根据控制台输出的SQL语句,可以确定MP只将有值的字段执行了插入。如果想要空的字段也出现在INSERT语句中,需要给字段设置NULL。
作者:RiemannHypo
链接:https://juejin.cn/post/7069790264885248007
相关推荐
- WPS 隐藏黑科技!OCT2HEX 函数用法全攻略,数据转换不再愁
-
WPS隐藏黑科技!OCT2HEX函数用法全攻略,数据转换不再愁在WPS表格的强大函数库中,OCT2HEX函数堪称数据进制转换的“魔法钥匙”。无论是程序员处理代码数据,还是工程师进行电路设计...
- WPS 表格隐藏神器!LEFTB 函数让文本处理更高效
-
WPS表格隐藏神器!LEFTB函数让文本处理更高效在职场办公和日常数据处理中,WPS表格堪称我们的得力助手,而其中丰富多样的函数更是提升效率的关键。今天,要为大家介绍一个“宝藏函数”——LEF...
- Java lombok 使用教程(lombok.jar idea)
-
简介Lombok是...
- PART 48: 万能结果自定义,SWITCH函数!
-
公式解析SWITCH:根据值列表计算表达式并返回与第一个匹配值对应的结果。如果没有匹配项,则返回可选默认值用法解析1:评级=SWITCH(TRUE,C2>=90,"优秀",C2...
- Excel 必备if函数使用方法详解(excel表if函数使用)
-
excel表格if函数使用方法介绍打开Excel,在想输出数据的单元格点击工具栏上的“公式”--“插入函数”--“IF”,然后点击确定。...
- Jetty使用场景(jetty入门)
-
Jetty作为一款高性能、轻量级的嵌入式Web服务器和Servlet容器,其核心优势在于模块化设计、快速启动、低资源消耗...
- 【Java教程】基础语法到高级特性(java语言高级特性)
-
Java作为一门面向对象的编程语言,拥有清晰规范的语法体系。本文将系统性地介绍Java的核心语法特性,帮助开发者全面掌握Java编程基础。...
- WPS里这个EVEN 函数,90%的人都没用过!
-
一、开篇引入在日常工作中,我们常常会与各种数据打交道。比如,在统计员工绩效时,需要对绩效分数进行一系列处理;在计算销售数据时,可能要对销售额进行特定的运算。这些看似简单的数据处理任务,实则隐藏着许多技...
- 64 AI助力Excel,查函数查用法简单方便
-
在excel表格当中接入ai之后会是一种什么样的使用体验?今天就跟大家一起来分享一下小程序商店的下一步重大的版本更新。下一个版本将会加入ai功能,接下来会跟大家演示一下基础的用法。ai功能规划的是有三...
- python入门到脱坑 函数—函数的调用
-
Python函数调用详解函数调用是Python编程中最基础也是最重要的操作之一。下面我将详细介绍Python中函数调用的各种方式和注意事项。...
- 从简到繁,一文说清vlookup函数的常见用法
-
VLOOKUP函数是Excel中常用的查找与引用函数,用于在表格中按列查找数据。本文将从简单到复杂,逐步讲解VLOOKUP的用法、语法、应用场景及注意事项。一、VLOOKUP基础:快速入门1.什么是...
- Java新特性:Lambda表达式(java lambda表达式的3种简写方式)
-
1、Lambda表达式概述1.1、Lambda表达式的简介Lambda表达式(Lambdaexpression),也可称为闭包(Closure),是Java(SE)8中一个重要的新特性。Lam...
- WPS 冷门却超实用!ODD 函数用法大揭秘,轻松解决数据处理难题
-
WPS冷门却超实用!ODD函数用法大揭秘,轻松解决数据处理难题在WPS表格庞大的函数家族里,有一些函数虽然不像SUM、VLOOKUP那样广为人知,却在特定场景下能发挥出令人惊叹的作用,OD...
- Python 函数式编程的 8 大核心技巧,不允许你还不会
-
函数式编程是一种强调使用纯函数、避免共享状态和可变数据的编程范式。Python虽然不是纯函数式语言,但提供了丰富的函数式编程特性。以下是Python函数式编程的8个核心技巧:...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- idea eval reset (50)
- vue dispatch (70)
- update canceled (42)
- order by asc (53)
- spring gateway (67)
- 简单代码编程 贪吃蛇 (40)
- transforms.resize (33)
- redisson trylock (35)
- 卸载node (35)
- np.reshape (33)
- torch.arange (34)
- npm 源 (35)
- vue3 deep (35)
- win10 ssh (35)
- vue foreach (34)
- idea设置编码为utf8 (35)
- vue 数组添加元素 (34)
- std find (34)
- tablefield注解用途 (35)
- python str转json (34)
- java websocket客户端 (34)
- tensor.view (34)
- java jackson (34)
- vmware17pro最新密钥 (34)
- mysql单表最大数据量 (35)