ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

JavaEE进阶:mybatis-plus使用

JavaEE进阶:mybatis-plus使用 一.MyBatis-Plus介绍MyBatis-Plus (简称 MP) 是一个 MyBatis 的增强工具在 MyBatis 的基础上只做增强不做改变为简化开发。提高效率而生特性:润物无声只做增强不做改变引入它不会对现有工程产生影响如丝般顺滑.效率至上只需简单配置即可快速进行单表 CRUD 操作从而节省大量时间.丰富功能代码生成、自动分页、逻辑删除、自动填充、拦截器等功能一应俱全.广泛认可连续 5 年获得开源中国年度最佳开源项目殊荣Github 累计 16K Star.支持数据库:PostgreSQL, MySQL, MariaDB, Oracle, SQL Server, OceanBase, H2, DB2... (任何能使用 MyBatis 进行增删改查并且支持标准 SQL 的数据库应该都在 MyBatis-Plus 的支持范围内)二.快速上手2.1 准备工作2.1.1 数据准备创建用户表,并创建对应实体类User执行下面MySQL代码:-- 创建数据库 DROP DATABASE IF EXISTS mybatis_test; CREATE DATABASE mybatis_test DEFAULT CHARACTER SET utf8mb4; -- 使用数据库 USE mybatis_test; -- 创建表[用户表] DROP TABLE IF EXISTS user_info; CREATE TABLE user_info ( id INT ( 11 ) NOT NULL AUTO_INCREMENT, username VARCHAR ( 127 ) NOT NULL, password VARCHAR ( 127 ) NOT NULL, age TINYINT ( 4 ) NOT NULL, gender TINYINT ( 4 ) DEFAULT 0 COMMENT 1-男 2-女 0-默认, phone VARCHAR ( 15 ) DEFAULT NULL, delete_flag TINYINT ( 4 ) DEFAULT 0 COMMENT 0-正常, 1-删除, create_time DATETIME DEFAULT now(), update_time DATETIME DEFAULT now(), PRIMARY KEY ( id ) ) ENGINE INNODB DEFAULT CHARSET utf8mb4; -- 添加用户信息 INSERT INTO mybatis_test.user_info( username, password, age, gender, phone ) VALUES ( admin, admin, 18, 1, 18612340001 ); INSERT INTO mybatis_test.user_info( username, password, age, gender, phone ) VALUES ( zhangsan, zhangsan, 18, 1, 18612340002 ); INSERT INTO mybatis_test.user_info( username, password, age, gender, phone ) VALUES ( lisi, lisi, 18, 1, 18612340003 ); INSERT INTO mybatis_test.user_info( username, password, age, gender, phone ) VALUES ( wangwu, wangwu, 18, 1, 18612340004 );2.1.2 项目准备创建springboot项目并添加MyBatis-Plus和MySQL依赖,配置数据库连接信息.配置数据库:2.2 编码创建实体类UserInfoimport lombok.Data; import java.util.Date; Data public class UserInfo { private Integer id; private String username; private String password; private Integer age; private Integer gender; private String phone; private Integer deleteFlag; private Date createTime; private Date updateTime; }编写Mapper接口类MybatisPlus提供了⼀个基础的 BaseMapper 接口已经实现了单表的CRUD,我们⾃定义的 Mapper只需要继承这个BaseMapper,就无需自己实现单表CRUD了运行测试用例测试正常三.MyBatis-Plus复杂操作3.1 常见注解在上面的程序中,mybatis-plus是如何知道我们想操作的是哪张表呢?看我们的mapper代码:我们在继承BaseMapper的时候,指定了一个泛型类,这个泛型类就是与数据库相对应的实体类.Mybatis-Plus会根据这个实体类来推断表信息.默认情况下表名实体类的驼峰表示法转换成蛇形表示法 (下划线分割), 比如 UserInfo - user_info字段根据实体类的属性名 转换为蛇形表示法作为字段名。比如 deleteFlag - delete_flag主键默认为 id3.1.1 TableNameTableName的作用就是用来标识实体类对应的表,参数填对应的数据库表名我们把实体类UserInfo改为Userinfo,重新运行程序看看程序报错显示badSQL,说这个表名不存在在Userinfo实体类上加入TableName注解,再次运行程序运行成功3.1.2 TableField我们把属性名deleteFlag改为deleteflag,再次运行测试方法.我们可以通过日志看到,说deleteflag不存在这个列,这是因为根据转换规则,属性名全小写转换过去就是deleteflag,所以跟数据库中的列delete_flag对不上.这时候我们用TableField来标识对应字段名.再次运行程序成功运行3.1.3 TableId将属性名id改为userId,重新运行程序.我们可以通过TableId来指定主键.运行成功3.2 打印日志我们可以在配置中添加配置日志.从而查看SQL语句的参数结果等信息3.3 条件构造器入门程序里的使用都是简单的 CRUD在实际的应用场景中我们还需要使用更复杂的操作MyBatis-Plus 也给我们提供了相应的支持。MyBatis-Plus 提供了一套强大的条件构造器 (Wrapper)用于构建复杂的数据库查询条件。Wrapper 类允许开发者以链式调用的方式构造查询条件无需编写繁琐的 SQL 语句从而提高开发效率并减少 SQL 注入的风险。以下是主要的 Wrapper 类及其功能AbstractWrapper这是一个抽象基类提供了所有 Wrapper 类共有的方法和属性。详细参考官网介绍条件构造器QueryWrapper用于构造查询条件在 AbstractWrapper 的基础上拓展了一个 select 方法允许指定查询字段。UpdateWrapper用于构造更新条件可以在更新数据时指定条件。LambdaQueryWrapper基于 Lambda 表达式的查询条件构造器它通过 Lambda 表达式来引用实体类的属性从而避免了硬编码字段名。LambdaUpdateWrapper基于 Lambda 表达式的更新条件构造器它允许你使用 Lambda 表达式来指定更新字段和条件同样避免了硬编码字段名的问题。3.3.1 QueryWrapperQueryWrapper并不只用于查询语句,无论是修改,删除,查询,都可以使用ueryWrapper来构建查询条 件.这里我们举个例子,完成下列查询语句:SELECT id,username,password,age FROM user_info WHERE age 18 AND username LIKE %min%这个是测试代码:Test void testQueryWrapper(){ //构造查询条件 QueryWrapperUserInfo UserInfoQueryWrapper new QueryWrapperUserInfo() .select(id,age,username, password) .eq(age,18) .like(username,%min%); //查询 ListUserInfo userInfos userInfoMapper.selectList(UserInfoQueryWrapper); userInfos.forEach(System.out::println); }结果:注意: 默认情况下 Mybatis-Plus 会根据TableField生成别名当指定了 QueryWrapper 的 select 属性后就仅仅是属性值而没有了别名查询出来的结果会对应不上解决办法:自己写自定义 SQL实体类名和字段名保持一致不指定 QueryWrapper 的 select 字段使用 LambdaQueryWrapper 实现其中1和4会在下面讲解:完成下列更新语句:UPDATE user_info SET delete_flag? WHERE age 20当前数据库测试代码:执行代码,看看结果,显示有四条结果更新:查看数据库,结果正确:完成下列删除SQL语句:DELETE FROM user_info WHERE age 21执行测试代码:刷新数据库,该数据已删除3.3.2 UpdateWrapper完成下列SQL语句:UPDATE user_info SET delete_flag0, age5 WHERE id IN (1,2,3)测试代码:执行完查看数据库,结果正确:基于SQL语句更新:UPDATE user_info SET age age10 WHERE id IN (1,2,3)测试代码:执行代码观察数据库,结果无误:3.3.3 LambdaQueryWrapperQueryWrapper 和 UpdateWrapper 存在一个问题就是需要写死字段名如果字段名发生变更可能会因为测试不到位酿成事故。MyBatis-Plus 给我们提供了一种基于 Lambda 表达式的条件构造器它通过 Lambda 表达式来引用实体类的属性从而避免了硬编码字段名也提高了代码的可读性和可维护性3.3.4 LambdaUpdateWrapper和LambdaQueryWrapper用法一样:Test void LambdaUpdateWrapper(){ UpdateWrapperUserInfo updateWrapper new UpdateWrapperUserInfo(); updateWrapper.lambda() .set(UserInfo::getAge, 18) .eq(UserInfo::getTableId, 1); userInfoMapper.update(updateWrapper); }3.4 自定义SQL在实际的开发中,MyBatis-Plus提供的操作不能满足我们的实际需求,MyBatis-Plus也提供了自定义 SQL的功能,我们可以利用Wrapper构造查询条件,再结合Mapper编写SQL代码示例:完成下列SQL语句:select id,username,password,age FROM user_info WHERE username admin测试代码:运行代码:注意事项:参数命名: 在自定义 SQL 时传递 Wrapper 对象作为参数时参数名必须为ew或者使用注解Param(Constants.WRAPPER)明确指定参数为 Wrapper 对象。使用${ew.customSqlSegment}: 在 SQL 语句中使用${ew.customSqlSegment}来引用 Wrapper 对象生成的 SQL 片段。不支持基于 entity 的 where 语句: 自定义 SQL 时Wrapper 对象不会基于实体类自动生成 where 子句你需要手动编写完整的 SQL 语句。四.总结1.MyBatis-Plus 是 MyBatis 的增强工具在 MyBatis 的基础上只做增强不做改变可以用更少的代码实现数据库表的 CRUD让我们的开发变得更加简单。2.MyBatis-Plus 支持自定义 SQL版本不低于 3.0.7传递 Wrapper 对象作为参数时参数名必须为 ew在 SQL 语句中使用${ew.customSqlSegment}来引用 Wrapper 对象生成的 SQL 片段。
返回列表