MyBatis Plus分页插件使用问题

MyBatis Plus分页插件使用问题

一、问题描述

项目中遇到SQL报错抛异常,报错内容如下。

[Code: 1248, SQL State: 42000] Every derived table must have its own alias

查看报错的SQL如下:

SELECT * FROM (
 SELECT TMP_PAGE.*, ROWNUM ROW_ID FROM ......

很明显,ROWNUM是属于Oracle的语法,而把出错的语句放到Oracle环境下执行是没有问题的。而放在MySQL下才会有问题。而问题的根源在于MyBatis Plus分页插件所使用的方言导致的。因为MyBatis的子查询并不需要别名(alias)。当然,即使手动把SQL语句加上别名,执行SQL也依然会报其他错误,因为MySQL没有ROWNUM的概念。通常情况下,都会根据Every derived table must have its own alias到网上找解决方案,结果无一例外的提示需要给表加别名。

二、解决方案

配置mybatis-config.xml文件,找到

<plugins> <plugin interceptor="com.github.pagehelper.PageInterceptor"> <!-- 设置数据库类型 Oracle,Mysql,MariaDB,SQLite,Hsqldb,PostgreSQL六种数据库--> <property name="helperDialect" value="oracle"/> </plugin> </plugins>

 

value=“oracle”改为value=“mysql”

<?xml version="1.0" encoding="UTF-8"?>
​
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
​
​
    <!-- 全局参数 -->
    <settings>
        <!-- 使全局的映射器启用或禁用缓存。 -->
        <setting name="cacheEnabled" value="true"/>
    
        <!-- 全局启用或禁用延迟加载。当禁用时,所有关联对象都会即时加载。 -->
        <setting name="lazyLoadingEnabled" value="false"/>
    
        <!-- 当启用时,有延迟加载属性的对象在被调用时将会完全加载任意属性。否则,每种属性将会按需要加载。 -->
        <setting name="aggressiveLazyLoading" value="false"/>
    
        <!-- 是否允许单条sql 返回多个数据集  (取决于驱动的兼容性) default:true -->
        <setting name="multipleResultSetsEnabled" value="true"/>
    
        <!-- 是否可以使用列的别名 (取决于驱动的兼容性) default:true -->
        <setting name="useColumnLabel" value="true"/>
    
        <!-- 允许JDBC 生成主键。需要驱动器支持。如果设为了true,这个设置将强制使用被生成的主键,有一些驱动器不兼容不过仍然可以执行。  default:false  -->
        <setting name="useGeneratedKeys" value="false"/>
    
        <!-- 指定 MyBatis 如何自动映射 数据基表的列 NONE:不隐射 PARTIAL:部分  FULL:全部  -->
        <setting name="autoMappingBehavior" value="PARTIAL"/>
    
        <!-- 这是默认的执行类型  (SIMPLE: 简单; REUSE: 执行器可能重复使用prepared statements语句;BATCH: 执行器可以重复执行语句和批量更新)  -->
        <setting name="defaultExecutorType" value="SIMPLE"/>
    
        <!-- 使用驼峰命名法转换字段。 -->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    
        <!-- 设置本地缓存范围 session:就会有数据的共享  statement:语句范围 (这样就不会有数据的共享 ) defalut:session -->
        <setting name="localCacheScope" value="SESSION"/>
    
        <!-- 设置但JDBC类型为空时,某些驱动程序 要指定值,default:OTHER,插入空值时不需要指定类型 -->
        <setting name="jdbcTypeForNull" value="NULL"/>
        <!-- mybatis sql打印到log4j文件-->
        <setting name="logImpl" value="LOG4J"/>
    </settings>
    <!-- 类型别名
      <typeAliases>
         <typeAlias alias="Page" type="com.grgbanking.atmc.model.VersionMain"/>
      </typeAliases>
​
-->
    <!--     插件配置-->
    <!--
    <plugins>
        <plugin interceptor="com.grgbanking.common.persistence.interceptor.PaginationInterceptor"/>
    </plugins>
     -->
    <plugins>
        <plugin interceptor="com.github.pagehelper.PageInterceptor">
            <!-- 设置数据库类型 Oracle,Mysql,MariaDB,SQLite,Hsqldb,PostgreSQL六种数据库-->
            <property name="helperDialect" value="oracle"/>
        </plugin>
    </plugins>
​
​
    <databaseIdProvider type="DB_VENDOR">
        <property name="MySQL" value="mysql"/>
        <property name="Oracle" value="oracle" />
        <property name="SQL Server" value="sqlserver"/>
        <property name="DB2" value="DB2" />
    </databaseIdProvider>
​
</configuration>
 
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Mybatis Plus是一个Mybatis的增强工具,在Mybatis的基础上只做增强不做改变,为简化开发、提高效率而生。Mybatis Plus提供了一个内置的分页插件PaginationInnerInterceptor,可以方便地实现分页功能。 以下是使用Mybatis Plus分页插件的步骤: 1.在pom.xml文件中添加Mybatis Plus的依赖: ```xml <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.2</version> </dependency> ``` 2.在MyBatis的配置文件中添加分页插件: ```xml <!-- Mybatis Plus分页插件 --> <plugins> <plugin interceptor="com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor"> <!-- 数据库类型 --> <property name="DbType" value="mysql"/> </plugin> </plugins> ``` 3.在Mapper接口中定义分页方法: ```java public interface UserMapper extends BaseMapper<User> { /** * 分页查询用户列表 * @param page 分页参数 * @return 用户列表 */ IPage<User> selectUserPage(Page<User> page); } ``` 4.在Service中调用Mapper接口的分页方法: ```java @Service public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService { @Override public IPage<User> selectUserPage(Page<User> page) { return baseMapper.selectUserPage(page); } } ``` 5.在Controller中调用Service的分页方法: ```java @RestController @RequestMapping("/user") public class UserController { @Autowired private UserService userService; @GetMapping("/list") public IPage<User> getUserList(@RequestParam(defaultValue = "1") Integer pageNum, @RequestParam(defaultValue = "10") Integer pageSize) { Page<User> page = new Page<>(pageNum, pageSize); return userService.selectUserPage(page); } } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值