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/

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

相关推荐
xyliiiiiL1 小时前
从责任链模式聊到aware接口
java·开发语言
码农老起4 小时前
与Aspose.pdf类似的jar库分享
java·pdf·jar
程序猿小D4 小时前
第三百八十九节 JavaFX教程 - JavaFX WebEngine
java·eclipse·intellij-idea·vr·javafx
self-discipline6346 小时前
【Java】Java核心知识点与相应面试技巧(七)——类与对象(二)
java·开发语言·面试
潘多编程6 小时前
SpringBoot分布式项目订单管理实战:Mybatis最佳实践全解
spring boot·分布式·mybatis
wei3872452326 小时前
java笔记02
java·开发语言·笔记
zjj5877 小时前
Docker使用ubuntu
java·docker·eureka
士别三日&&当刮目相看7 小时前
JAVA学习*简单的代理模式
java·学习·代理模式
要天天开心啊7 小时前
MyBatis第二天笔记
笔记·tomcat·mybatis
ShareBeHappy_Qin8 小时前
设计模式——设计模式理念
java·设计模式