navicat 运行sql:
WITH a AS ( SELECT * FROM s_sn ) SELECT
- FROM
a
结果:
OK
时间: 0.001s
mybatis里写的sql:
结果执行查询时报异常:
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就好写了。
请知道怎么解决的大~佬帮忙看看怎么解决,先谢谢了