美文网首页程序猿
mybatis-plus插件使用的一些问题

mybatis-plus插件使用的一些问题

作者: syncwt | 来源:发表于2016-12-05 17:00 被阅读42645次

    介绍

    mybatis-plus是国内大牛在Mybatis3的基础上做了一些封装,简化了一些操作(分页,自动生成实体块等)。是快速开发一个不错的工具插件。

    Mybatis 增强工具包 - 只做增强不做改变,简化CRUD操作

    优点

    纯正血统:完全继承原生 Mybatis 的所有特性
    最少依赖:仅仅依赖Mybatis以及Mybatis-Spring
    性能损耗小:启动即会自动注入基本CURD ,性能无损耗,直接面向对象操作
    自动热加载:Mapper对应的xml可以热加载,大大减少重启Web服务器时间,提升开发效率
    自动生成代码:包含自动生成代码类以及Maven插件,通过少量配置,即可快速生成Mybatis对应的xml、mapper、entity、service、serviceimpl层代码,减少开发时间
    自定义操作:支持自定义Sql注入,实现个性化操作
    自定义转义规则:支持数据库关键词(例如:order、key等)自动转义,支持自定义关键词
    多种主键策略:支持多达4种主键策略,可自由配置,若无将会自动填充,更有充满黑科技的分布式全局唯一ID生成器
    无缝分页插件:基于Mybatis物理分页,无需关心具体操作,等同于编写基本selectList查询
    性能分析:自带Sql性能分析插件,开发测试时,能有效解决慢查询
    全局拦截:提供全表delete、update操作智能分析阻断
    避免Sql注入:内置Sql注入内容剥离器,预防Sql注入攻击

    我的感受

    我们项目是spring-boot + mybatis-plus,官方也有一个这样的Demo,在搭建一些比较套路的工程还是很节约时间的,它自动生成代码的插件可以生成 Entity.mapper,Entity.java,EntityVo.java,EntityBusinessController.java,EntityService.java,IEntityMapper.java等一系列Spring mvc文件架构,大大节约了开发时间。但是就JDBCUtil来说,它还是比较单薄的,只提供了基本的增删查改,用起来可能没有自己写的工具类好用,但这些都可以根据自己习惯和数据结构封装进去的。另外就是作者定义的一套规则我们需要注意一下,否则可能在开发过程中要话费额外的时间去找bug。

    遇到的问题

    返回的list只有数据库字段不含大写的属性

    通常生成的mapper.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.test.domain.po.IFundAccountMapper">
    
        <!-- 通用查询结果列-->
        <resultMap id="TestEntityMap" type="com.test.domain.po.FundAccount">
            <id column="id" property="id"/>
            <result column="user_id" property="userId"/>
            <result column="realname" property="realname"/>
        </resultMap>
    
        <select id="selectObjPage" resultType="TestEntity">
            SELECT * FROM fund_account
        </select>
    
    </mapper>
    

    我们发现在控制层去调用.selectObjPage方法时,返回值只有idrealname有信息,找了一下发现是返回值的原因。我们在实体类中做了数据绑定
    Entity.java

    package com.senthink.www.micat.domain.po;
    
    import com.baomidou.mybatisplus.annotations.IdType;
    import com.baomidou.mybatisplus.annotations.TableField;
    import com.baomidou.mybatisplus.annotations.TableId;
    import com.baomidou.mybatisplus.annotations.TableName;
    
    
    @TableName("fund_account")
    public class TestEntity {
    
        @TableId(type = IdType.AUTO)
        private Integer id;
    
        @TableField(value = "user_id")
        private String userId;
    
        private String realname;
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getUserId() {
            return userId;
        }
    
        public void setUserId(String userId) {
            this.userId = userId;
        }
    
        public String getRealname() {
            return realname;
        }
    
        public void setRealname(String realname) {
            this.realname = realname;
        }
    }
    

    而实体的数据绑定是通过mapper.xml中
    <resultMap id="TestEntityMap" type="com.test.domain.po.FundAccount">
    来完成连接的。所以,当你想返回TestEntity实体类型的时候必须要返回的是这个定义的resultMap,即把
    <select id="selectObjPage" resultType="TestEntity">修改为
    <select id="selectObjPage" resultMap="TestEntityMap">即可。

    setDbColumnUnderline导致的字段不一致

    mybatis-plus的setDbColumnUnderline设置使得数据库字段强行按照java实体的骆驼式命名法大写字母前转化为下划线加小写的命名规范。
    TestEntity中的userId在拼装sql语句时自动对应为userId,所以这就要求你实体命名和数据库字段名必须满足这个规则,若出现不满足规则的命名,如
    passwordMD5,将被编译为password_m_d5这样就会报sql错误了。
    解决办法:

    • 按照规范命名,对未规范的命名全部修改
    • 设置不用其下划线命名法,在MybatisPlusConfig.java中设置
    MybatisSqlSessionFactoryBean mybatisPlus = new MybatisSqlSessionFactoryBean();
    mybatisPlus.setDbColumnUnderline(true);
    
    

    相关文章

      网友评论

      • 罗曼蒂克:分页查询结果 Page 存入 Redis 再取出来的时候会报错
      • bf2770eeec88:不错不错,收藏了。

        推荐下,分库分表中间件 Sharding-JDBC 源码解析 17 篇:http://www.yunai.me/categories/Sharding-JDBC/?jianshu&401


      • 靖凡:Invalid bound statement (not found): com.mybatisPlus.chao.dao.SysPermissionMapper.selectPage

        springboot项目配置mybatisPlus 不能用plus的方法,老是提示不合法的statement 不知道怎么回事????包括selectById(),selectOr Update 和selectPage() 都是不可以用的!!!!why,,求解
        乄逃跑的木偶:我之前也遇到过这种情况,出错的方法有很多种,我遇到的是没有扫描到mapper接口
      • buttre:大兄弟,最后设置驼峰命名和下划线命名法转化那儿有点儿出入,官方文档是这么来的:
        GlobalConfiguration gc = new GlobalConfiguration();
        gc.setDbType("oracle");
        gc.setIdType(IdType.INPUT.getKey());
        gc.setKeyGenerator(new OracleKeyGenerator());
        gc.setDbColumnUnderline(true);
        mybatisPlus.setGlobalConfig(gc);
        syncwt:谢谢你的提示,意思还是设置行元素的下划线,配制方法和封装方式有关系,这个应该问题不大的,看懂了就好:smile:

      本文标题:mybatis-plus插件使用的一些问题

      本文链接:https://www.haomeiwen.com/subject/ovxlmttx.html