一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第3天,点击查看活动详情。
起初一直使用的是Mybatis,通常小到简单的select语句都要写个Mapper或xml才可以实现。现在有了Mybatis-Plus插件,是真的挺香的。晚上睡不着觉,顺手把最近使用到的点记录下来。
一、MyBatis-Plus
首先是,What&Why。
1、MyBatis
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。——引自MyBatis的官网
介绍中清楚的写到MyBatis需要通过创建XML或注解的方式去配置,非常的繁琐,如下。
<select id="selectPerson" parameterType="int" resultType="hashmap">
SELECT * FROM PERSON WHERE ID = #{id}
</select>
如果是习惯了之前使用JPA的方式开发的朋友会怀念JPA中简短的操作,只需要在Repository中继承JpaRepository就可以实现简单的增删改查的功能,而这些在MyBatis-Plus中实现了。
2、MyBatis-Plus
MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。——引自MyBatis-Plus官网
介绍中有几个点需要注意,一个是增强不做改变,一个是简化开发。
增强不做改变是因为引入之后不会使得之前搭配MyBatis设置的xml或mapper的开发方式出现错误;
简化开发是启动自动注入基本的CRUD、支持Lambda形式调用,甚至还有对sql性能的监测等等,都是让人非常激动的特性。相信懒汉总是有办法让自己吃饱。
二、搭配请求场景的一些使用
💡 不推荐直接不分层的形式将dao层的东西直接写到controller中,以下仅仅是示例。-
MyBatis的初始化,详细见官网
-
对于一个字段的多个值进行搜索
/** * 例如以一个或多个基金名称来搜索数据 * @Param:List * @Return:List */ @GetMapping("/funds") public List<FundInfo> getFundInfoByName(@RequestBody List<String> fundNameList){ List<FundInfo> fundList = fundInfoMapper.selectBatchIds(fundNameList); return fundInfoList; } -
模糊搜索
/** * 例如对基金名称、基金编号进行模糊搜索,可考虑默认返回的数据条数Limit,使用场景下拉选择 * @Param:String * @Return:List */ @GetMapping("/fund/{name}") public List<FundToday> getFundInfoByNameOrCode(@PathVariable("name") String fundName){ // 创建一个MyBatis-Plus的SQL构造器 QueryWrapper queryWrapper = new QueryWrapper<FundToday>(); // like用来做模糊匹配 queryWrapper.like("name",fundName); // or这边简单明了 queryWrapper.or(); queryWrapper.like("fund_code",fundName); // 关于order的顺序调用这块比较不那么灵活,要可变配置的话可以看一下其他的方法 queryWrapper.orderByDesc("fund_code"); // 最后加上对条数的限制 queryWrapper.last("limit 5"); return fundTodayMapper.selectList(queryWrapper); } -
分页查询(简单实现)
首先要创建一个configuration配置类
/** * @author : Jkevin * @version 1.0 * @date : 2022/4/17 下午5:52 * @describtion: */ @Configuration public class MybatisPlusConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); return interceptor; } }其次才是创建对应的逻辑
/** * @Author JKevin * @Description: 分页查询功能 * @Date 2022/4/17 * @Param * @return **/ @PostMapping("/fund/all") public IPage<FundToday> getAllFundInfo(@RequestBody FundPageDTO fundPageDTO){ QueryWrapper<FundToday> wrapper = new QueryWrapper<>(); // 在此处可以写前端传入的condition查询条件部分内容 if ( StringUtils.isNotEmpty(fundPageDTO.getFilter()) ){ wrapper.like("name",fundPageDTO.getFilter()); wrapper.or(); wrapper.like("fund_code",fundPageDTO.getFilter()); } // 此处是为了前台表格可以实现顺序、逆序的切换 if ( StringUtils.isNotEmpty(fundPageDTO.getFilterName()) && StringUtils.isNotEmpty(fundPageDTO.getFilterType().toString())){ // orderBy 会更加灵活 wrapper.orderBy(true,fundPageDTO.getFilterType(),fundPageDTO.getFilterName()); } // 可以选择直接返回page或者是转换为list返回 Page<FundToday> page = new Page<>(fundPageDTO.getCurrent(),fundPageDTO.getSize()); IPage<FundToday> fundTodayIPage = fundTodayMapper.selectPage(page,wrapper); return fundTodayIPage; } -
简单的增删改查
// 查 @GetMapping("/user/{userId}") public List<Possession> findPossessionsByUserId(@PathVariable("userId") String userId){ QueryWrapper queryWrapper = new QueryWrapper(); queryWrapper.eq("userId",userId); return possessionMapper.selectList(queryWrapper); } // 增 @PostMapping public int addPossession(@RequestBody Possession possession){ return possessionMapper.insert(possession); } // 删 @DeleteMapping public int deletePossession( @RequestParam("id") int id ,@RequestParam("userId") String userId){ QueryWrapper queryWrapper = new QueryWrapper(); queryWrapper.eq("id",id); queryWrapper.eq("userId",userId); return possessionMapper.delete(queryWrapper); } // 改 @PutMapping public int updatePossession(@RequestBody Possession possession){ QueryWrapper queryWrapper = new QueryWrapper(); queryWrapper.eq("id",possession.getId()); queryWrapper.eq("userId",possession.getUserId()); return possessionMapper.update(possession,queryWrapper); } -
其他的例子可以看:官网示例地址 ,或者去查找对应需求的博客,不建议直接食用官网介绍,个人比较愚钝看不太明白🫠。
三、总结
写到总结的时候又是瘫了半天才开始写的,感觉自己写了很多大家都懂的东西,最多的还是对自己的近期的学习总结。如果有帮助到大家是极好的。
其实总结知识并输出的时间比学习的时间会多出好多,可能一天学习的量能输出四五个散装的知识点,有时候你在coding的时候,可能不用去看API文档就可以预料到该作者应该会怎么写,尝试去利用联想进行coding,这个可能就是一个很大的进步了。
Take care guys,Keep Moving。