【Java EE进阶 --- SpringBoot】Mybatis - plus 操作数据库

🚀 欢迎来到我的CSDN博客:Optimistic _ chen

一名热爱技术与分享的全栈开发者,在这里记录成长,专注分享编程技术与实战经验,助力你的技术成长之路,与你共同进步!


🚀我的专栏推荐

专栏 内容特色 适合人群
🔥C语言从入门到精通 系统讲解基础语法、指针、内存管理、项目实战 零基础新手、考研党、复习
🔥Java基础语法 系统解释了基础语法、类与对象、继承 Java初学者
🔥Java核心技术 面向对象、集合框架、多线程、网络编程、新特性解析 有一定语法基础的开发者
🔥Java EE 进阶实战 Servlet、JSP、SpringBoot、MyBatis、项目案例拆解 想快速入门Java Web开发的同学
🔥Java数据结构与算法 图解数据结构、LeetCode刷题解析、大厂面试算法题 面试备战、算法爱好者、计算机专业学生

🚀我的承诺:

✅ 文章配套代码:每篇技术文章都提供完整的可运行代码示例

✅ 持续更新:专栏内容定期更新,紧跟技术趋势

✅ 答疑交流:欢迎在文章评论区留言讨论,我会及时回复(支持互粉)


🚀 关注我,解锁更多技术干货!
⏳ 每天进步一点点,未来惊艳所有人!✍️ 持续更新中,记得⭐收藏关注⭐不迷路 ✨

📌 标签:#技术博客#编程学习#Java#C语言#算法#程序员

文章目录

Mybatis - plus介绍

从名字就能看出来,Mybatis - plus是Mybatis的增强版,在Mybatis的基础上只做增强,为简化开发,提高效率。

Maven添加依赖,注意Spring Boot和Mybatis-plus对应版本。

还需要配置数据库相关信息

java 复制代码
spring:
  application:
    name: mybatis-plus-demo

  datasource:
    url: jdbc:mysql://localhost:3306/mybatis_test?useSSL=false&useUnicode=true&characterEncoding=utf-8
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver
mybatis-plus:
  configuration: #配置日志
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  mapper-locations: "classpath*:/mapper/**.xml"

准备工作

创建实体类UserInfo:

java 复制代码
import 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接口类:
注意:Myatis-plus提供了一个基础的BaseMapper接口,已经实现了单表的CRUD,我们只需要继承这个BaseMapper即可。

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

接下来可以在src目录下的test类进行测试(直接去测试类写CRUD,就可以直接运行):

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

    @Test
    void insert() {
        UserInfo userInfo = new UserInfo();
        userInfo.setUsername("admin");
        userInfo.setPassword("admin");
        userInfo.setAge(12);
        userInfoMapper.insert(userInfo);
    }
}

MyBatis-Plus操作

我们可以看到,继承的BaseMapper类中是泛型,UserInfo接口继承后就是数据库相对应的实体类。MyBatis-Plus会根据这个实体类来推断表的信息。

注解操作

默认情况下:

  1. 表名:实体类的 驼峰表示 转化为 蛇形表示 为表名
  2. 字段:根据实体类的属性名 转化为蛇形表示作为字段名

但是有的时候并不是遵循这种规则:

@TableName

修改实体类名,假如我们把类名不按照默认情况命名,就会出现报错:表示数据库不存在.所以需要@TableName 来表示实体类对应的表。

@TableField

修改属性名deleteFlag为deleteflag,重新测试;

日志中发现据属性名转换后的字段名为:deleteflag。

@TableId

通过@TableId注解来指定对应主键。

注意:
如果属性名和字段名不⼀致,需要在@TableId 指明对应的字段名
属性名和字段⼀致的情况下,直接加@TableId 注解就可以.

条件构造器

MyBatis-Plus 提供了⼀套强⼤的条件构造器(Wrapper),⽤于构建复杂的数据库查询条件. * Wrapper类允许开发者以链式调⽤的⽅式构造查询条件,⽆需编写繁琐的SQL语句,从⽽提⾼开发效率并减少SQL注⼊的⻛险***

更加详细的内容,推荐大家去官网查看条件构造器

AbstractWrapper 提供了所有Wrapper类共有的方法和属性,所有的 QueryWrapper、UpdateWrapper、LambdaQueryWrapper 和 LambdaUpdateWrapper 都继承自 AbstractWrapper。

QueryWrapper

⽤于构造查询条件,但是不局限于查询语句,修改等都可以使用QueryWrapper

mapper接口:

java 复制代码
 @Select("SELECT id,username,password,age FROM user_info WHERE age = 18 AND username \n" +"\"%min%\"")
    List<UserInfo> QueryWrapper();

测试

注意:一般情况Mybatis-plus会根据@TableField生成别名,但是当指定了QueryWrapper的select属性后就仅仅是属性而没有别名了。

解决办法:

  1. 实体类属性名和字段名保持一致
  2. 自定义SQL
  3. 使用LambdaQueryWrapper实现

UpdateWrapper

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

mapper接口:

java 复制代码
    @Update("UPDATE user_info SET delete_flag=0, age=5 WHERE id IN (1,2,3)")
    List<UserInfo> updateByUpdateWrapper();

介绍一些方法的缩写:

  • lt :"less than" 的缩写,表⽰⼩于(<).
  • le :"lessthanorequalto"的缩写,表⽰⼩于等于(<=)
  • ge :"greaterthanorequalto"的缩写,表⽰⼤于等于(>=).
  • gt :"greaterthan"的缩写,表⽰⼤于(>).
  • eq :"equals"的缩写,表⽰等于(=).
  • ne :"notequals"的缩写,表⽰不等于.(!=)

Lambda( )Wrapper

QueryWrapper和UpdateWrapper存在⼀个问题,就是需要写死字段名,如果字段名发⽣变更,测试可能会出现问题

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

LambdaQueryWrapper
java 复制代码
@Test
    void LambdaQueryWrapper(){
        QueryWrapper<UserInfo> userInfoQueryWrapper=new QueryWrapper<UserInfo>();
        userInfoQueryWrapper.lambda()
                .select(UserInfo::getId,UserInfo::getUsername,UserInfo::getPassword,UserInfo::getAge)
                .eq(UserInfo::getAge,1);
        userInfoMapper.selectList(userInfoQueryWrapper).forEach(System.out::println);
    }
LambdaUpdateWrapper
java 复制代码
@Test
    void LambdaUpdateWrapper(){
        UpdateWrapper<UserInfo> updateWrapper = new UpdateWrapper<UserInfo>();
        updateWrapper.lambda()
                .set(UserInfo::getDeleteflag,0)
                .set(UserInfo::getAge,5)
                .in(UserInfo::getId, List.of(1,2,3));
        userInfoMapper.update(updateWrapper);
    }

自定义SQL

自定义意味着我们不用BaseMapper类的方法。

如果MyBatis-Plus提供的操作不能满⾜我们的实际需求,MyBatis-Plus也提供了⾃定义SQL的功能,我们可以利⽤Wrapper构造查询条件,再结合Mapper编写SQL(Mybatis-plus版本不得低于3.0.7)

mapper接口:

java 复制代码
@Select("select id,username,password,age from user_info ${ew.customSqlSegment}")
    List<UserInfo> selectUserInfoByCondition(@Param(Constants.WRAPPER) QueryWrapper<UserInfo> queryWrapper);

测试:

java 复制代码
    @Test
    void selectUserInfoByCondition() {
        QueryWrapper<UserInfo> queryWrapper= new QueryWrapper<>();
        //where age < 20
        queryWrapper.lt("age",20);
        //@Select("select id,username,password,age from user_info ${ew.customSqlSegment}")
        //@Select("select id,username,password,age from user_info where age < 20")
        userInfoMapper.selectUserInfoByCondition(queryWrapper).forEach(System.out::println);
    }

避免了SQL注入的风险。

完结撒花!🎉

如果这篇博客对你有帮助,不妨点个赞支持一下吧!👍
你的鼓励是我创作的最大动力~

想获取更多干货? 欢迎关注我的专栏 → optimistic_chen

📌 收藏本文,下次需要时不迷路!

我们下期再见!💫 持续更新中......


悄悄说:点击主页有更多精彩内容哦~ 😊

相关推荐
凉、介4 小时前
ARM 总线技术 —— AMBA 入门
arm开发·笔记·学习
日更嵌入式的打工仔4 小时前
嵌入式入门:APP+BSP+HAL 三层分级架构浅析
笔记·单片机·嵌入式硬件·学习
FJW0208144 小时前
关系型数据库大王Mysql——DDL语句操作示例
数据库·mysql
言之。4 小时前
Chroma 开源的 AI 应用搜索与检索数据库(即向量数据库)
数据库·人工智能·开源
来旺4 小时前
互联网大厂Java面试全解析及三轮问答专项
java·数据库·spring boot·安全·缓存·微服务·面试
詩句☾⋆᭄南笙4 小时前
Mybatis一对一、一对多
java·mybatis·resulttype·resultmap·一对多·一对一
长桥夜波4 小时前
【第十八周】机器学习笔记07
人工智能·笔记·机器学习
摇滚侠4 小时前
Spring Boot 3零基础教程,yml文件中配置和类的属性绑定,笔记15
spring boot·redis·笔记
thginWalker4 小时前
使用Spring Boot构建消息通信层
spring boot