当前位置: 首页 > article >正文

Java EE 进阶:MyBatis-plus

MyBatis-plus的介绍

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

MyBatis-plus的上手

添加依赖

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

MyBatis-plus的依赖

<dependency>
 <groupId>com.baomidou</groupId>
 <artifactId>mybatis-plus-boot-starter</artifactId>
 <version>3.5.7</version>
 </dependency>

Mysql的依赖 

 <dependency>
 <groupId>com.mysql</groupId>
 <artifactId>mysql-connector-j</artifactId>
 <scope>runtime</scope>
 </dependency>

配置数据库

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类

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

@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接口 

@Mapper
public interface UserInfoMapper extends BaseMapper<UserInfo> {

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

 

CRUD

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

@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来标识实体类对应的表

@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

@TableField("delete_flag")
 private Integer deleteflag;

@TableId

修改属性名id为userId

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

@TableId("id")
 private Integer userId;

 

条件构造器

QueryWrapper

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

Select

SELECT id,username,password,age FROM user_info WHERE age = 18 AND username 
"%min%"
 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 

UPDATE user_info SET delete_flag=? WHERE age < 20
@Test
    void updateByCondition() {

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

Delete

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

 UpdateWrapper

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

UPDATE user_info SET delete_flag=0, age=5 WHERE id IN (1,2,3)
@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);
    }

 

 UPDATE user_info SET age = age+10 WHERE id IN (1,2,3)
@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表达式来引⽤实体类的属性,从⽽避免了硬编码字段名,也提⾼了代码的可读性和可维护性。

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

 LambdaUpdateWrapper

@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

 select id,username,password,age FROM user_info WHERE username = "admin"
 @Select("select * from user_info ${ew.customSqlSegment}")
    List<UserInfo> queryUserByCustom(@Param(Constants.WRAPPER)Wrapper wrapper);
@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 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>
List<UserInfo> queryUserByCustom2(@Param(Constants.WRAPPER)Wrapper<UserInfo> wrapper);
 @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/ 

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


http://www.kler.cn/a/612838.html

相关文章:

  • SQL 复杂查询和性能优化
  • ubuntu 2204键盘按键映射修改
  • nginx部署前端项目(linux、docker)
  • 解锁大语言模型潜力:LangChain,构建AI应用的全新框架
  • Angular由一个bug说起之十五:自定义基于Overlay的Tooltip
  • 数字人分身生成50语种发布会视频技术架构深度解析
  • CTF类题目复现总结-[MRCTF2020]ezmisc 1
  • 网络通信协议浅析:TCP/IP、UDP、HTTP 和 MQTT
  • java项目之基于ssm的亚盛汽车配件销售业绩管理系统(源码+文档)
  • 基于网启PXE服务器的批量定制系统平台(详细版)
  • 推荐系统(十六):基于ESMM的商品召回/推荐系统
  • SpringBoot学习Day1
  • Appium 入门操作指南
  • 地理信息可视化技术大全【WebGIS 技术文档大全】
  • Nginx多域名HTTPS配置全攻略:从证书生成到客户端安装
  • 【矩阵快速幂】P2100 凌乱的地下室|省选-
  • UE4学习笔记 FPS游戏制作31 显示计分板
  • 31天Python入门——第16天:模块与库详解
  • 正则表达式-笔记
  • ArayTS:一个功能强大的 TypeScript 工具库