qq_24210923
2021-09-22 11:38
采纳率: 100%
浏览 190
已结题

mysql8.0 with as在navicat中可以使用,但是在mybatis却报错

navicat 运行sql:
WITH a AS ( SELECT * FROM s_sn ) SELECT

  • FROM
    a

结果:

OK
时间: 0.001s

img

mybatis里写的sql:

img

结果执行查询时报异常:

The error occurred while executing a query

SQL: WITH a AS ( SELECT * FROM s_sn ) SELECT * FROM a

Cause: java.sql.SQLException: sql injection violation, syntax error: syntax error, error in :'WITH a AS ( SELECT * FROM s_sn',expect WITH, actual WITH WITH : WITH a AS ( SELECT * FROM s_sn ) SELECT * FROM a

数据库连接配置
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&allowMultiQueries=true
jdbc.username=root
jdbc.password=1234

mybatis-config.xml

<?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="true" />

        <!-- 当启用时,有延迟加载属性的对象在被调用时将会完全加载任意属性。否则,每种属性将会按需要加载。 -->
        <setting name="aggressiveLazyLoading" value="true" />

        <!-- 是否允许单条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" />

    </settings>

    <!-- 类型别名 -->
    <typeAliases>


    </typeAliases>

</configuration>


spring-jdbc.xml 数据库连接池配置:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:jdbc="http://www.springframework.org/schema/jdbc"
    xmlns:jee="http://www.springframework.org/schema/jee"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:util="http://www.springframework.org/schema/util"
    xmlns:task="http://www.springframework.org/schema/task"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
        http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-4.0.xsd
        http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-4.0.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd
        http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.0.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd">

    <!-- 自动扫描 -->
    <!-- <context:component-scan base-package="com.ws.**.modules" /> -->
    <!-- <bean class="com.common.utils.SpringContextHolder" lazy-init="false" 
        /> -->
    <!-- 引入配置文件 -->
    <!-- <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
        <property name="location" value="classpath:conf/global.properties" /> </bean> -->

    <!-- 数据源配置, 使用 阿里的durid 数据库连接池,支持web界面监控,显示慢sql等特点 -->
    <bean id="dataSource"
        class="com.alibaba.druid.pool.DruidDataSource" init-method="init"
        destroy-method="close">
        <!-- 数据源驱动类可不写,Druid默认会自动根据URL识别DriverClass -->
        <property name="driverClassName" value="${jdbc.driver}" />

        <!-- 基本属性 url、user、password -->
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />

        <!-- 配置初始化大小、最小、最大 -->
        <property name="initialSize" value="${jdbc.pool.init}" />
        <property name="minIdle" value="${jdbc.pool.minIdle}" />
        <property name="maxActive" value="${jdbc.pool.maxActive}" />

        <!-- 配置获取连接等待超时的时间 -->
        <property name="maxWait" value="60000" />

        <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
        <property name="timeBetweenEvictionRunsMillis" value="60000" />

        <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
        <property name="minEvictableIdleTimeMillis" value="300000" />

        <property name="validationQuery" value="${jdbc.testSql}" />
        <property name="testWhileIdle" value="true" />
        <property name="testOnBorrow" value="false" />
        <property name="testOnReturn" value="false" />

        <!-- 打开PSCache,并且指定每个连接上PSCache的大小(Oracle使用) <property name="poolPreparedStatements" 
            value="true" /> <property name="maxPoolPreparedStatementPerConnectionSize" 
            value="20" /> -->

        <!-- 配置监控统计拦截的filters ,proxyFilters基于组合,两种都写是组合 -->
        <!-- <property name="filters" value="stat,wall" /> -->
        <property name="proxyFilters">
            <list>
                <ref bean="stat-filter" />
                <ref bean="wall-filter" />
                <ref bean="log-filter" />
            </list>
        </property>
    </bean>
    <!-- druid防火墙过滤器 -->
    <bean id="wall-filter" class="com.alibaba.druid.wall.WallFilter">
        <property name="config" ref="wall-config" />
    </bean>
    <!--配置druid允许批量执行配置,默认为false禁止 -->
    <bean id="wall-config" class="com.alibaba.druid.wall.WallConfig">
        <property name="multiStatementAllow" value="true" />
    </bean>
    <!-- sql监控 -->
    <bean id="stat-filter"
        class="com.alibaba.druid.filter.stat.StatFilter">
        <!-- SQL合并配置 -->
        <property name="mergeSql" value="true" />
        <!-- 慢SQL执行时间 设定 -->
        <property name="slowSqlMillis" value="2000" />
        <!-- 慢SQL记录输出 -->
        <property name="logSlowSql" value="true" />
    </bean>
    <!-- 配置输出日志 -->
    <bean id="log-filter"
        class="com.alibaba.druid.filter.logging.Log4jFilter">
        <!-- 是否显示结果集 -->
        <property name="resultSetLogEnabled" value="false" />
        <!--输出可执行的SQL -->
        <property name="statementExecutableSqlLogEnable" value="true" />
    </bean>
    <!-- 配置druid对spring监控 -->
    <bean id="druid-stat-interceptor"
        class="com.alibaba.druid.support.spring.stat.DruidStatInterceptor" />
    <bean id="druid-stat-pointcut"
        class="org.springframework.aop.support.JdkRegexpMethodPointcut"
        scope="prototype">
        <property name="patterns">
            <list>
                <value>org.db.impl.*</value>
                <value>org.db.dao.*</value>
            </list>
        </property>
    </bean>
    <aop:config>
        <aop:advisor advice-ref="druid-stat-interceptor"
            pointcut-ref="druid-stat-pointcut" order="4" />
    </aop:config>


    <!-- spring和MyBatis完美整合,不需要mybatis的配置映射文件 -->
    <bean id="sqlSessionFactory"
        class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="typeAliasesPackage"
            value="org.service.model" />
        <property name="mapperLocations"
            value="classpath*:mybatis/mysql/my/*.xml"></property>
        <property name="configLocation"
            value="classpath:mybatis-config.xml"></property>
    </bean>



    <!-- DAO接口所在包名,Spring会自动查找其下的类 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="org.db.dao" />
        <property name="sqlSessionFactoryBeanName"
            value="sqlSessionFactory"></property>
    </bean>

    <!-- (事务管理)transaction manager, use JtaTransactionManager for global tx -->
    <bean id="transactionManager"
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>
    <!-- 开启事务控制的注解支持 -->
    <!-- 有特定地方使用 注解,两种注解是有序的,可以按照写的顺序和order两种方式来指定 -->
    <tx:annotation-driven
        transaction-manager="transactionManager" order="2" />
    <!-- 配置事务传播特性 事物的隔离级别:mysql:默认repeatable-read,sqlserver默认read_commit,oracle只有两种,默认为read_commit -->
    <tx:advice id="txAdvice"
        transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="upd*" propagation="REQUIRED"
                isolation="READ_COMMITTED" rollback-for="Exception" />
            <tx:method name="add*" propagation="REQUIRED"
                isolation="READ_COMMITTED" rollback-for="Exception" />
            <tx:method name="del*" propagation="REQUIRED"
                isolation="READ_COMMITTED" rollback-for="Exception" />
            <tx:method name="edit*" propagation="REQUIRED"
                isolation="READ_COMMITTED" rollback-for="Exception" />
            <!-- <tx:method name="get*" propagation="SUPPORTS" isolation="READ_COMMITTED" 
                read-only="true"/> -->
            <tx:method name="*" propagation="SUPPORTS" read-only="true"
                rollback-for="Exception" />
        </tx:attributes>
    </tx:advice>

    <!-- 配置参与事务的类 -->
    <aop:config>
        <aop:advisor
            pointcut="execution(* org.db.impl.*.*(..))" advice-ref="txAdvice"
            order="1" />
    </aop:config>

    <!-- 指定自动搜索Bean组件、自动搜索切面类 -->
    <context:component-scan base-package="org.aspect">
        <context:include-filter type="annotation"
                                expression="org.aspectj.lang.annotation.Aspect"/>
    </context:component-scan>
    <!-- 启动@AspectJ支持 -->
    <aop:aspectj-autoproxy/>
    <!-- 操作日志切面类 -->
    <bean id="logAspect" class="org.aspect.LogAspect">
    </bean>

    <!-- add by yezk 操作日志AOP配置 -->
    <aop:config>
    <!--ref 指向 操作日志切面类 -->
        <aop:aspect id="log" ref="logAspect">
            <!--过滤的业务方法 upd/del/add/modify/remove/issue/edit/upload/import/reset-->
            <aop:pointcut id="logPointcut" expression="execution(* org.db.impl.*.upd*(..))||execution(* org.db.impl.*.del*(..))||execution(* org.db.impl.*.add*(..))||execution(* org.db.impl.*.modify*(..))||execution(* org.db.impl.*.remove*(..))||execution(* org.db.impl.*.issue*(..))||execution(* org.db.impl.*.edit*(..))||execution(* org.db.impl.*.upload*(..))||execution(* org.db.impl.*.import*(..))||execution(* org.db.impl.*.reset*(..))"/>
            <!--执行业务方法前需要执行的方法before() -->
            <aop:before method="before" pointcut-ref="logPointcut"/>
            <!--执行业务方法后需要执行的方法after() -->
            <aop:after method="after" pointcut-ref="logPointcut"/>
            <!--执行业务方法最后成功需要执行的方法afterReturning() -->
            <aop:after-returning method="afterReturning" pointcut-ref="logPointcut" returning="returnValue"/>
            <!--执行业务方法抛出异常需要执行的方法afterThrowing() -->
            <aop:after-throwing method="afterThrowing" pointcut-ref="logPointcut" throwing="ex"/>
        </aop:aspect>
    </aop:config>

    <!-- <aop:config proxy-target-class="true"> <aop:pointcut expression="execution(* 
        org.bom.db.impl.*.*(..))" id="transcationPointcut" /> <aop:advisor advice-ref="txAdvice" 
        pointcut-ref="transcationPointcut" order="1"/> </aop:config> -->

    <!-- 监控接口调用是否出错,错误信息落地 。 切面类,实现代理的功能,如果不配置则不会代理 -->
    <!-- <bean id="systemLogAop" class="com.ws.web.system.SystemLogAop"></bean> -->
    <!-- 配置aop代理 -->
    <!-- <aop:config> 切面,引入切面类对象 myAspectHelp <aop:aspect id="systemLog" ref="systemLogAop" 
        order="3"> 配置切入点 <aop:pointcut id="logAopPointCut" expression="execution(* 
        com.ws.web.impl..*(..))" /> 配置通知 <aop:after-throwing method="exceptionAdvice" 
        pointcut-ref="logAopPointCut" throwing="ex"/> </aop:aspect> </aop:config> -->

</beans>



现在我自己还没找到解决方法,如果这个问题解决了,以后复杂sql就好写了。
请知道怎么解决的大~佬帮忙看看怎么解决,先谢谢了

  • 写回答
  • 好问题 提建议
  • 追加酬金
  • 关注问题
  • 邀请回答

2条回答 默认 最新

相关推荐 更多相似问题