Java EE 进阶:MyBatis-plus

MyBatis-plus的介绍

MyBatis-plus是MyBatis的增强工具,在MyBatis的基础上做出加强,只要MyBatis有的功能MyBatis-plus都有。

MyBatis-plus的上手

添加依赖

在我们创建项目的时候,我们需要添加MyBatis-plus和mysql的依赖

MyBatis-plus的依赖

java 复制代码
<dependency>
 <groupId>com.baomidou</groupId>
 <artifactId>mybatis-plus-boot-starter</artifactId>
 <version>3.5.7</version>
 </dependency>

Mysql的依赖

ruby 复制代码
 <dependency>
 <groupId>com.mysql</groupId>
 <artifactId>mysql-connector-j</artifactId>
 <scope>runtime</scope>
 </dependency>

配置数据库

java 复制代码
spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/mybatis_test?characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
    username: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver

mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  mapper-locations: "classpath*:/mapper/**.xml" # Mapper.xml

首先我们创建UserInfo类

实体类中的属性和表中的字段要一一对应。

java 复制代码
@Data
@TableName("user_info")
public class UserInfo {

    @TableId("id" )
    private Integer id;
    @TableField("username")
    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接口

java 复制代码
@Mapper
public interface UserInfoMapper extends BaseMapper<UserInfo> {

MyBatis-plus提供一个基础的BaseMapper接口,已经实现了单表的增删改查,我们自己的Mapper接口只需要继承这个BaseMapper接口,就可以实现单表的增删改查了

CRUD

我们来简单的测试一下MyBatis-plus的CRUD

java 复制代码
@SpringBootTest
class UserInfoMapperTest {
    @Autowired
    private UserInfoMapper userInfoMapper;

    @Test
    void select() {
        userInfoMapper.selectById(1);
    }

    @Test
    void update() {
        UserInfo userInfo = new UserInfo();
        userInfo.setId(1);
        userInfo.setAge(12);
        userInfo.setPassword("5556666");
        userInfoMapper.updateById(userInfo);
    }

    @Test
    void insert() {
        UserInfo userInfo = new UserInfo();
        userInfo.setId(27);
        userInfo.setAge(3);
        userInfo.setPassword("3");
        userInfo.setUsername("123333");
        userInfoMapper.insert(userInfo);

    }

    @Test
    void delete() {
        userInfoMapper.deleteById(8);
}

@TableName

修改实体类名UserInfo为Userinfo

我们可以用@TableName来标识实体类对应的表

java 复制代码
@Data
 @TableName("user_info")
 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;
 }

@TableField

修改属性名deleteFlag为deleteflag

java 复制代码
@TableField("delete_flag")
 private Integer deleteflag;

@TableId

修改属性名id为userId

我们可以通过@TableId来指定对应的主键

java 复制代码
@TableId("id")
 private Integer userId;

条件构造器

QueryWrapper

⽤于构造查询条件,在AbstractWrapper的基础上拓展了⼀个select⽅法,允许指定查询字段,QueryWrapper并不只用于查询语句,无论是修改,删除,查询都可以使用QueryWrapper来构造条件

Select

sql 复制代码
SELECT id,username,password,age FROM user_info WHERE age = 18 AND username 
"%min%"
java 复制代码
 void selectByCondition() {
        QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<UserInfo>()
                .select("username", "password", "id", "age")
                .eq("age", 18)
                .like("username", "min");
        List<UserInfo> userInfos = userInfoMapper.selectList(queryWrapper);
        userInfos.forEach(x -> System.out.println(x));

    }

Update

sql 复制代码
UPDATE user_info SET delete_flag=? WHERE age < 20
java 复制代码
@Test
    void updateByCondition() {

        UserInfo userInfo = new UserInfo();
        userInfo.setDeleteFlag(1);
        QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<UserInfo>()
                .lt("age", 20);
        userInfoMapper.update(userInfo, queryWrapper);
    }

Delete

sql 复制代码
 DELETE FROM user_info WHERE age = 18
java 复制代码
@Test
    void deleteByCondition(){
        QueryWrapper<UserInfo> queryWrapper =new QueryWrapper<UserInfo>()
                .eq("age",18);
        userInfoMapper.delete(queryWrapper);
    }

UpdateWrapper

对于更新,我们也可以直接使⽤UpdateWrapper,在不创建实体对象的情况下,直接设置更新字段和条件

sql 复制代码
UPDATE user_info SET delete_flag=0, age=5 WHERE id IN (1,2,3)
java 复制代码
@Test
    void updateByCondition2(){
        UpdateWrapper<UserInfo> updateWrapper=new UpdateWrapper<UserInfo>()
                .set("delete_flag",0)
                .set("age",5)
                .in("id",List.of(1,2,3));
        userInfoMapper.update(updateWrapper);
    }
sql 复制代码
 UPDATE user_info SET age = age+10 WHERE id IN (1,2,3)
java 复制代码
@Test
    void updateByCondition3(){
        UpdateWrapper<UserInfo> updateWrapper=new UpdateWrapper<UserInfo>()
                .setSql("age=age+10")
                .in("id",List.of(1,2,3));
        userInfoMapper.update(updateWrapper);
    }

LambdaQueryWrapper

QueryWrapper和UpdateWrapper存在⼀个问题,就是需要写死字段名,如果字段名发⽣变更,可能会 因为测试不到位酿成事故。

MyBatis-Plus 给我们提供了⼀种基于Lambda表达式的条件构造器,它通过Lambda表达式来引⽤实体类的属性,从⽽避免了硬编码字段名,也提⾼了代码的可读性和可维护性。

java 复制代码
@Test
    void selectByLambdaCondition() {
        QueryWrapper<UserInfo> queryWrapper=new QueryWrapper<UserInfo>();
        queryWrapper.lambda()
                .select(UserInfo::getUsername,UserInfo::getPassword)
                .eq(UserInfo::getAge,18);
        userInfoMapper.selectList(queryWrapper);
    }

LambdaUpdateWrapper

java 复制代码
@Test
    void updateByLambdaCondition(){
        UpdateWrapper<UserInfo> updateWrapper=new UpdateWrapper<UserInfo>();
        updateWrapper.lambda()
                .set(UserInfo::getUsername,"123")
                .set(UserInfo::getAge,12)
                .in(UserInfo::getId,List.of(1,2,3));
        userInfoMapper.update(updateWrapper);
    }

⾃定义SQL

在实际的开发中,MyBatis-plus提供的操作不能满足我们的实际需求,MyBatis-plus也提供了自定义SQL的功能,我们可以用Wrapper构造查询条件,结合Mapper编写SQL

sql 复制代码
 select id,username,password,age FROM user_info WHERE username = "admin"
java 复制代码
 @Select("select * from user_info ${ew.customSqlSegment}")
    List<UserInfo> queryUserByCustom(@Param(Constants.WRAPPER)Wrapper wrapper);
java 复制代码
@Test
 void testQueryUserByCustom(){
 QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<UserInfo>()
 .eq("username","admin");
 userInfoMapper.queryUserByCustom(queryWrapper).forEach(System.out::println);
 }

注:

参数命名:在⾃定义SQL时,传递Wrapper对象作为参数时,参数名必须为 ew 或者使⽤注解 ${ew.customSqlSegment},明确指定参数为Wrapper对象

使用 {ew.customSqlSegment} :在SQL语句中,使⽤ {ew.customSqlSegment}来引⽤Wrapper对象⽣成的SQL⽚段.

不⽀持基于entity的where语句:⾃定义SQL时,Wrapper对象不会基于实体类⾃动⽣成 where⼦句,你需要⼿动编写完整的SQL语句

MyBatis-plus也支持xml的方式

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.blame.mybatisplus.mapper.UserInfoMapper">

    <select id="queryUserByCustom2" resultType="com.blame.mybatisplus.model.UserInfo">
        select id,username,password,age FROM user_info ${ew.customSqlSegment}
    </select>

</mapper>
java 复制代码
List<UserInfo> queryUserByCustom2(@Param(Constants.WRAPPER)Wrapper<UserInfo> wrapper);
java 复制代码
 @Test
    void testQueryUserByCustom2(){
        QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<UserInfo>()
                .eq("username","admin");
        userInfoMapper.queryUserByCustom2(queryWrapper).forEach(System.out::println);
    }

如果需要查看更多关于MyBatis-plus 的资料,点击

简介 | MyBatis-Plushttps://baomidou.com/introduce/

希望能对大家有所帮助!!!!!

相关推荐
hqxstudying12 分钟前
Java创建型模式---原型模式
java·开发语言·设计模式·代码规范
Dcs31 分钟前
VSCode等多款主流 IDE 爆出安全漏洞!插件“伪装认证”可执行恶意命令!
java
保持学习ing37 分钟前
day1--项目搭建and内容管理模块
java·数据库·后端·docker·虚拟机
京东云开发者1 小时前
Java的SPI机制详解
java
超级小忍1 小时前
服务端向客户端主动推送数据的几种方法(Spring Boot 环境)
java·spring boot·后端
程序无bug1 小时前
Spring IoC注解式开发无敌详细(细节丰富)
java·后端
小莫分享1 小时前
Java Lombok 入门
java
程序无bug1 小时前
Spring 对于事务上的应用的详细说明
java·后端
食亨技术团队1 小时前
被忽略的 SAAS 生命线:操作日志有多重要
java·后端
苦学编程的谢2 小时前
Maven
java·maven·intellij-idea