【MySql】结合请求场景的Mybatis-Plus应用

536 阅读4分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 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中,以下仅仅是示例。
  1. MyBatis的初始化,详细见官网

  2. 对于一个字段的多个值进行搜索

    /**
     * 例如以一个或多个基金名称来搜索数据
     * @Param:List
     * @Return:List
     */
    @GetMapping("/funds")
    public List<FundInfo> getFundInfoByName(@RequestBody List<String> fundNameList){
    		List<FundInfo> fundList = fundInfoMapper.selectBatchIds(fundNameList);
    		return fundInfoList;
    }
    
  3. 模糊搜索

    /**
     * 例如对基金名称、基金编号进行模糊搜索,可考虑默认返回的数据条数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);
    }
    
  4. 分页查询(简单实现)

    首先要创建一个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;
    }
    
  5. 简单的增删改查

    // 查
    @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);
    }
    
  6. 其他的例子可以看:官网示例地址 ,或者去查找对应需求的博客,不建议直接食用官网介绍,个人比较愚钝看不太明白🫠。

三、总结

写到总结的时候又是瘫了半天才开始写的,感觉自己写了很多大家都懂的东西,最多的还是对自己的近期的学习总结。如果有帮助到大家是极好的。

其实总结知识并输出的时间比学习的时间会多出好多,可能一天学习的量能输出四五个散装的知识点,有时候你在coding的时候,可能不用去看API文档就可以预料到该作者应该会怎么写,尝试去利用联想进行coding,这个可能就是一个很大的进步了。

Take care guys,Keep Moving。