• MYBATIS-PLUS入门使用、踩坑记录


    转载:

    mybatis-plus入门使用、踩坑记录 - 灰信网(软件开发博客聚合)

    首先引入MYBATIS-PLUS依赖:

    SPRING BOOT项目:

    1. <dependency>
    2. <groupId>com.baomidou</groupId>
    3. <artifactId>mybatis-plus-boot-starter</artifactId>
    4. <version>3.2.0</version>
    5. </dependency>

    SPRING MVC项目:

    1. <dependency>
    2. <groupId>com.baomidou</groupId>
    3. <artifactId>mybatis-plus</artifactId>
    4. <version>3.2.0</version>
    5. </dependency>

    配置:

    SPRING BOOT 工程:

    @MapperScan("com.xxx.mapper")

    SPRING MVC 工程:

    • 配置 MapperScan
    1. <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    2. <property name="basePackage" value="com.baomidou.mybatisplus.samples.quickstart.mapper"/>
    3. </bean>
    • 调整 SqlSessionFactory 为 MyBatis-Plus 的 SqlSessionFactory
    1. <bean id="sqlSessionFactory" class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean">
    2. <property name="dataSource" ref="dataSource"/>
    3. </bean>

     引入:EXTENDS BASEMAPPER

     还有扩展的server方法及实现,可以自己点进去看下

    需要用到就对应service继承即可,示例:

    1. public interface UserService extends BaseService<User> {
    2. }
    3. public class UserServiceImpl extends BaseServiceImpl, User> implements UserService {
    4. }

    坑一:出现 INVALID BOUND STATEMENT (NOT FOUND) 异常

    • 未去除原有mybatis-spring-boot-starter依赖,导致冲突
    • mapper文件夹未扫描到,加入@MapperScan

    坑二:CAUSED BY: JAVA.SQL.SQLINTEGRITYCONSTRAINTVIOLATIONEXCEPTION: COLUMN 'XXX' CANNOT BE NULL

    这个问题很明显是字段不能是空,必须使用selective方法进行插入。一开始怀疑mybatis-plus的插入语句(就只一个insert)是全量插入

    后来查找mapper文件找到了问题所在。之前用的mybatis框架自动生成的mapper.xml代码中的insert语句为全量插入,本地写了同名的xml会优先使用本地的SQL进行查询。

    解决:删除所有mybatis生成的SQL语句,避免与mybatis-plus的底层SQL冲突

    坑三:主键随机自增,导致ID超范围问题 COULD NOT SET PROPERTY 'ID' OF 'CLASS COM.XXX.USER' WITH VALUE '1037678924715731598' CAUSE: JAVA.LANG.ILLEGALARGUMENTEXCEPTION: ARGUMENT TYPE MISMATCH

    如果没有指定ID生成策略,mybatis-plus默认是使用自己随机的ID生成策略,会生成一个比较大的数,可能会大小溢出。

    解决:在实体类ID字段上加上注解 @TableId(type = IdType.AUTO),使用数据库的自增策略。如果自增主键很多都是id,可以写一个基础的BasePO,在这个类里面指定id的生成策略,其它表对应实体类继承即可,如下:

    1. public class BasePO {
    2. @TableId(type= IdType.AUTO)
    3. private Long id;
    4. }

      

    下面是IdType其它类型介绍

    坑四:关键字冲突问题 CAUSE: JAVA.SQL.SQLSYNTAXERROREXCEPTION: YOU HAVE AN ERROR IN YOUR SQL SYNTAX; CHECK THE MANUAL THAT CORRESPONDS TO YOUR MYSQL SERVER VERSION FOR THE RIGHT SYNTAX TO USE NEAR 'ORDER WHERE ID=1

    当你的数据库表名是order、group等之类的关键字时,对该表的操作则会报错.

    解决:在表对应的实体上增加注解 @TableName("`order`"),使用``指定表名即可

  • 相关阅读:
    4. HTTPS通信(握手)过程
    java毕业设计汽车出租平台源码+lw文档+mybatis+系统+mysql数据库+调试
    【毕业设计】22-基于单片机的智能温度计的系统设计(原理图工程+仿真工程+源代码+仿真视频+答辩论文+答辩PPT)
    直播协议 python 常见直播协议
    zookeeper应用之leader选举
    记一次SQL注入的收获
    Python生成正态分布的随机数
    安卓系统手机便签app使用哪一款?
    汽车安全气囊设计?Abaqus/Part特殊建模方法-附案例step-by-step教学
    重磅!OpenAI发布GPT-4o,非常惊艳语音版ChatGPT!
  • 原文地址:https://blog.csdn.net/Smilelfq/article/details/132840153