【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操作
- 注解操作
- @TableName
- @TableField
- @TableId
- 条件构造器
- QueryWrapper
- UpdateWrapper
- Lambda( )Wrapper
- LambdaQueryWrapper
- LambdaUpdateWrapper
- 自定义SQL
- 完结撒花!🎉
Mybatis - plus介绍
从名字就能看出来,Mybatis - plus是Mybatis的增强版,在Mybatis的基础上只做增强,为简化开发,提高效率。
Maven添加依赖,注意Spring Boot和Mybatis-plus对应版本。
还需要配置数据库相关信息
spring:application:name: mybatis-plus-demodatasource:url: jdbc:mysql://localhost:3306/mybatis_test?useSSL=false&useUnicode=true&characterEncoding=utf-8username: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Driver
mybatis-plus:configuration: #配置日志log-impl: org.apache.ibatis.logging.stdout.StdOutImplmapper-locations: "classpath*:/mapper/**.xml"
准备工作
创建实体类UserInfo:
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即可。
@Mapper
public interface UserInfoMapper extends BaseMapper<UserInfo> {}
接下来可以在src目录下的test类进行测试(直接去测试类写CRUD,就可以直接运行):
@SpringBootTest
class UserInfoMapperTest {@Autowiredprivate UserInfoMapper userInfoMapper;@Testvoid 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接口:
@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接口:
@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
@Testvoid 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
@Testvoid 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接口:
@Select("select id,username,password,age from user_info ${ew.customSqlSegment}")List<UserInfo> selectUserInfoByCondition(@Param(Constants.WRAPPER) QueryWrapper<UserInfo> queryWrapper);
测试:
@Testvoid selectUserInfoByCondition() {QueryWrapper<UserInfo> queryWrapper= new QueryWrapper<>();//where age < 20queryWrapper.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
📌 收藏本文,下次需要时不迷路!
我们下期再见!💫 持续更新中……
悄悄说:点击主页有更多精彩内容哦~ 😊