解决SpringBoot+Druid+Mybatis Plus 执行MySQL批量插入,更新 报错的问题

8 篇文章 0 订阅
6 篇文章 0 订阅

 

项目实际开发中,使用到了MySQL批量插入的语法,在MySQL中执行成功后,移植到项目时发生了问题,语句如下:

REPLACE INTO table1(
			id,
			works_fusion_id,
			statistics_date,
			chapter_number,
			new_chapter,
			works_hot,
			works_like_number,
			works_read_number,
			works_comment_number,
			works_collection_number
		)
		SELECT
			(SELECT UPPER(REPLACE(result.id, '-', ''))) id,
			result.works_fusion_id,
			STR_TO_DATE(IFNULL(result.statistics_date,'1990-01-01'),'%Y-%m-%d') statistics_date,
			IFNULL(result.chapter_number,0) chapter_number,
			IFNULL(result.new_chapter,'无数据') new_chapter,
			IFNULL(result.works_hot,0) works_hot,
			IFNULL(result.works_like_number,0) works_like_number,
			IFNULL(result.works_read_number,0) works_read_number,
			IFNULL(result.works_comment_number,0) works_comment_number,
			IFNULL(result.works_collection_number,0) works_collection_number
		FROM(
			SELECT
				UUID() id,
				swf.id as works_fusion_id,
				DATE_FORMAT(sdr.update_time,'%Y-%m-%d') statistics_date,
				COUNT(DISTINCTROW sccount.id) chapter_number,
				sci.title new_chapter,
				sum(DISTINCT sdr.works_hot) works_hot,
                sum(DISTINCT sdr.works_read_number) works_read_number,
                sum(DISTINCT sdr.works_like_number) works_like_number,
                sum(DISTINCT sdr.works_comment_number) works_comment_number,
                sum(DISTINCT sdr.works_collection_number) works_collection_number
			FROM table2 swf
			INNER JOIN table3 sw ON sw.works_fusion_id=swf.id
			GROUP BY swf.id
		)result

项目中执行SQL报错内容:

Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@10d97b64] was not registered for synchronization because synchronization is not active
JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@3bbdf835] will not be managed by Spring
==>  Preparing: REPLACE INTO sqa_day_data_statistics( id, works_fusion_id, statistics_date, chapter_number, new_chapter, works_hot, works_like_number, works_read_number, works_comment_number, works_collection_number ) SELECT (SELECT UPPER(REPLACE(result.id, '-', ''))) id, result.works_fusion_id, STR_TO_DATE(IFNULL(result.statistics_date,'1990-01-01'),'%Y-%m-%d') statistics_date, IFNULL(result.chapter_number,0) chapter_number, IFNULL(result.new_chapter,'无数据') new_chapter, IFNULL(result.works_hot,0) works_hot, IFNULL(result.works_like_number,0) works_like_number, IFNULL(result.works_read_number,0) works_read_number, IFNULL(result.works_comment_number,0) works_comment_number, IFNULL(result.works_collection_number,0) works_collection_number FROM( SELECT UUID() id, swf.id as works_fusion_id, DATE_FORMAT(sdr.update_time,'%Y-%m-%d') statistics_date, COUNT(DISTINCTROW sccount.id) chapter_number, sci.title new_chapter, sum(DISTINCT sdr.works_hot) works_hot, sum(DISTINCT sdr.works_read_number) works_read_number, sum(DISTINCT sdr.works_like_number) works_like_number, sum(DISTINCT sdr.works_comment_number) works_comment_number, sum(DISTINCT sdr.works_collection_number) works_collection_number FROM sqa_works_fusion swf INNER JOIN sqa_works sw ON sw.works_fusion_id=swf.id INNER JOIN sqa_data_record sdr ON sdr.works_id=sw.id AND sdr.update_time = ( SELECT MAX(update_time) FROM sqa_data_record WHERE works_id = sdr.works_id ) INNER JOIN sqa_chapter_info sci ON sci.works_id=sw.id AND sci.`no`=( SELECT MAX(`no`) FROM sqa_chapter_info WHERE works_id =sci.works_id ) INNER JOIN sqa_chapter_info sccount on sccount.works_id=sw.id GROUP BY swf.id )result 
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@10d97b64]
2019-06-10 14:25:24.732  INFO 2240 --- [           main] o.s.b.f.xml.XmlBeanDefinitionReader      : Loading XML bean definitions from class path resource [org/springframework/jdbc/support/sql-error-codes.xml]
2019-06-10 14:25:24.758  INFO 2240 --- [           main] o.s.jdbc.support.SQLErrorCodesFactory    : SQLErrorCodes loaded: [DB2, Derby, H2, HSQL, Informix, MS-SQL, MySQL, Oracle, PostgreSQL, Sybase, Hana]

org.springframework.jdbc.UncategorizedSQLException: 
### Error updating database.  Cause: java.sql.SQLException: sql injection violation, syntax error: syntax error, expect RPAREN, actual IDENTIFIER pos 949, line 29, column 23, token IDENTIFIER sccount : REPLACE INTO sqa_day_data_statistics(
			id,
			works_fusion_id,
			statistics_date,
			chapter_number,
			new_chapter,
			works_hot,
			works_like_number,
			works_read_number,
			works_comment_number,
			works_collection_number
		)
		SELECT
			(SELECT UPPER(REPLACE(result.id, '-', ''))) id,
			result.works_fusion_id,
			STR_TO_DATE(IFNULL(result.statistics_date,'1990-01-01'),'%Y-%m-%d') statistics_date,
			IFNULL(result.chapter_number,0) chapter_number,
			IFNULL(result.new_chapter,'无数据') new_chapter,
			IFNULL(result.works_hot,0) works_hot,
			IFNULL(result.works_like_number,0) works_like_number,
			IFNULL(result.works_read_number,0) works_read_number,
			IFNULL(result.works_comment_number,0) works_comment_number,
			IFNULL(result.works_collection_number,0) works_collection_number
		FROM(
			SELECT
				UUID() id,
				swf.id as works_fusion_id,
				DATE_FORMAT(sdr.update_time,'%Y-%m-%d') statistics_date,
				COUNT(DISTINCTROW sccount.id) chapter_number,
				sci.title new_chapter,
				sum(DISTINCT sdr.works_hot) works_hot,
                sum(DISTINCT sdr.works_read_number) works_read_number,
                sum(DISTINCT sdr.works_like_number) works_like_number,
                sum(DISTINCT sdr.works_comment_number) works_comment_number,
                sum(DISTINCT sdr.works_collection_number) works_collection_number
			FROM sqa_works_fusion swf
			INNER JOIN sqa_works sw ON sw.works_fusion_id=swf.id
			INNER JOIN sqa_data_record sdr ON sdr.works_id=sw.id AND sdr.update_time = (
				SELECT MAX(update_time) FROM sqa_data_record WHERE works_id = sdr.works_id
			)
			INNER JOIN sqa_chapter_info sci ON sci.works_id=sw.id AND sci.`no`=(
				SELECT MAX(`no`) FROM sqa_chapter_info WHERE works_id =sci.works_id
			)
			INNER JOIN sqa_chapter_info sccount on sccount.works_id=sw.id
			GROUP BY swf.id
		)result
### The error may exist in file [/Users/yangxiaohui/HmProject/hm-spss/target/classes/mapper/spss/SqaDayDataStatisticsMapper.xml]
### The error may involve com.hm.spss.mapper.spss.SqaDayDataStatisticsMapper.insertWorksDayDataList
### The error occurred while executing an update
### SQL: REPLACE INTO sqa_day_data_statistics(    id,    works_fusion_id,    statistics_date,    chapter_number,    new_chapter,    works_hot,    works_like_number,    works_read_number,    works_comment_number,    works_collection_number   )   SELECT    (SELECT UPPER(REPLACE(result.id, '-', ''))) id,    result.works_fusion_id,    STR_TO_DATE(IFNULL(result.statistics_date,'1990-01-01'),'%Y-%m-%d') statistics_date,    IFNULL(result.chapter_number,0) chapter_number,    IFNULL(result.new_chapter,'无数据') new_chapter,    IFNULL(result.works_hot,0) works_hot,    IFNULL(result.works_like_number,0) works_like_number,    IFNULL(result.works_read_number,0) works_read_number,    IFNULL(result.works_comment_number,0) works_comment_number,    IFNULL(result.works_collection_number,0) works_collection_number   FROM(    SELECT     UUID() id,     swf.id as works_fusion_id,     DATE_FORMAT(sdr.update_time,'%Y-%m-%d') statistics_date,     COUNT(DISTINCTROW sccount.id) chapter_number,     sci.title new_chapter,     sum(DISTINCT sdr.works_hot) works_hot,                 sum(DISTINCT sdr.works_read_number) works_read_number,                 sum(DISTINCT sdr.works_like_number) works_like_number,                 sum(DISTINCT sdr.works_comment_number) works_comment_number,                 sum(DISTINCT sdr.works_collection_number) works_collection_number    FROM sqa_works_fusion swf    INNER JOIN sqa_works sw ON sw.works_fusion_id=swf.id    INNER JOIN sqa_data_record sdr ON sdr.works_id=sw.id AND sdr.update_time = (     SELECT MAX(update_time) FROM sqa_data_record WHERE works_id = sdr.works_id    )    INNER JOIN sqa_chapter_info sci ON sci.works_id=sw.id AND sci.`no`=(     SELECT MAX(`no`) FROM sqa_chapter_info WHERE works_id =sci.works_id    )    INNER JOIN sqa_chapter_info sccount on sccount.works_id=sw.id    GROUP BY swf.id   )result
### Cause: java.sql.SQLException: sql injection violation, syntax error: syntax error, expect RPAREN, actual IDENTIFIER pos 949, line 29, column 23, token IDENTIFIER sccount : REPLACE INTO sqa_day_data_statistics(
			id,
			works_fusion_id,
			statistics_date,
			chapter_number,
			new_chapter,
			works_hot,
			works_like_number,
			works_read_number,
			works_comment_number,
			works_collection_number
		)
		SELECT
			(SELECT UPPER(REPLACE(result.id, '-', ''))) id,
			result.works_fusion_id,
			STR_TO_DATE(IFNULL(result.statistics_date,'1990-01-01'),'%Y-%m-%d') statistics_date,
			IFNULL(result.chapter_number,0) chapter_number,
			IFNULL(result.new_chapter,'无数据') new_chapter,
			IFNULL(result.works_hot,0) works_hot,
			IFNULL(result.works_like_number,0) works_like_number,
			IFNULL(result.works_read_number,0) works_read_number,
			IFNULL(result.works_comment_number,0) works_comment_number,
			IFNULL(result.works_collection_number,0) works_collection_number
		FROM(
			SELECT
				UUID() id,
				swf.id as works_fusion_id,
				DATE_FORMAT(sdr.update_time,'%Y-%m-%d') statistics_date,
				COUNT(DISTINCTROW sccount.id) chapter_number,
				sci.title new_chapter,
				sum(DISTINCT sdr.works_hot) works_hot,
                sum(DISTINCT sdr.works_read_number) works_read_number,
                sum(DISTINCT sdr.works_like_number) works_like_number,
                sum(DISTINCT sdr.works_comment_number) works_comment_number,
                sum(DISTINCT sdr.works_collection_number) works_collection_number
			FROM sqa_works_fusion swf
			INNER JOIN sqa_works sw ON sw.works_fusion_id=swf.id
			INNER JOIN sqa_data_record sdr ON sdr.works_id=sw.id AND sdr.update_time = (
				SELECT MAX(update_time) FROM sqa_data_record WHERE works_id = sdr.works_id
			)
			INNER JOIN sqa_chapter_info sci ON sci.works_id=sw.id AND sci.`no`=(
				SELECT MAX(`no`) FROM sqa_chapter_info WHERE works_id =sci.works_id
			)
			INNER JOIN sqa_chapter_info sccount on sccount.works_id=sw.id
			GROUP BY swf.id
		)result
; uncategorized SQLException for SQL []; SQL state [null]; error code [0]; sql injection violation, syntax error: syntax error, expect RPAREN, actual IDENTIFIER pos 949, line 29, column 23, token IDENTIFIER sccount : REPLACE INTO sqa_day_data_statistics(
			id,
			works_fusion_id,
			statistics_date,
			chapter_number,
			new_chapter,
			works_hot,
			works_like_number,
			works_read_number,
			works_comment_number,
			works_collection_number
		)
		SELECT
			(SELECT UPPER(REPLACE(result.id, '-', ''))) id,
			result.works_fusion_id,
			STR_TO_DATE(IFNULL(result.statistics_date,'1990-01-01'),'%Y-%m-%d') statistics_date,
			IFNULL(result.chapter_number,0) chapter_number,
			IFNULL(result.new_chapter,'无数据') new_chapter,
			IFNULL(result.works_hot,0) works_hot,
			IFNULL(result.works_like_number,0) works_like_number,
			IFNULL(result.works_read_number,0) works_read_number,
			IFNULL(result.works_comment_number,0) works_comment_number,
			IFNULL(result.works_collection_number,0) works_collection_number
		FROM(
			SELECT
				UUID() id,
				swf.id as works_fusion_id,
				DATE_FORMAT(sdr.update_time,'%Y-%m-%d') statistics_date,
				COUNT(DISTINCTROW sccount.id) chapter_number,
				sci.title new_chapter,
				sum(DISTINCT sdr.works_hot) works_hot,
                sum(DISTINCT sdr.works_read_number) works_read_number,
                sum(DISTINCT sdr.works_like_number) works_like_number,
                sum(DISTINCT sdr.works_comment_number) works_comment_number,
                sum(DISTINCT sdr.works_collection_number) works_collection_number
			FROM sqa_works_fusion swf
			INNER JOIN sqa_works sw ON sw.works_fusion_id=swf.id
			INNER JOIN sqa_data_record sdr ON sdr.works_id=sw.id AND sdr.update_time = (
				SELECT MAX(update_time) FROM sqa_data_record WHERE works_id = sdr.works_id
			)
			INNER JOIN sqa_chapter_info sci ON sci.works_id=sw.id AND sci.`no`=(
				SELECT MAX(`no`) FROM sqa_chapter_info WHERE works_id =sci.works_id
			)
			INNER JOIN sqa_chapter_info sccount on sccount.works_id=sw.id
			GROUP BY swf.id
		)result; nested exception is java.sql.SQLException: sql injection violation, syntax error: syntax error, expect RPAREN, actual IDENTIFIER pos 949, line 29, column 23, token IDENTIFIER sccount : REPLACE INTO sqa_day_data_statistics(
			id,
			works_fusion_id,
			statistics_date,
			chapter_number,
			new_chapter,
			works_hot,
			works_like_number,
			works_read_number,
			works_comment_number,
			works_collection_number
		)
		SELECT
			(SELECT UPPER(REPLACE(result.id, '-', ''))) id,
			result.works_fusion_id,
			STR_TO_DATE(IFNULL(result.statistics_date,'1990-01-01'),'%Y-%m-%d') statistics_date,
			IFNULL(result.chapter_number,0) chapter_number,
			IFNULL(result.new_chapter,'无数据') new_chapter,
			IFNULL(result.works_hot,0) works_hot,
			IFNULL(result.works_like_number,0) works_like_number,
			IFNULL(result.works_read_number,0) works_read_number,
			IFNULL(result.works_comment_number,0) works_comment_number,
			IFNULL(result.works_collection_number,0) works_collection_number
		FROM(
			SELECT
				UUID() id,
				swf.id as works_fusion_id,
				DATE_FORMAT(sdr.update_time,'%Y-%m-%d') statistics_date,
				COUNT(DISTINCTROW sccount.id) chapter_number,
				sci.title new_chapter,
				sum(DISTINCT sdr.works_hot) works_hot,
                sum(DISTINCT sdr.works_read_number) works_read_number,
                sum(DISTINCT sdr.works_like_number) works_like_number,
                sum(DISTINCT sdr.works_comment_number) works_comment_number,
                sum(DISTINCT sdr.works_collection_number) works_collection_number
			FROM sqa_works_fusion swf
			INNER JOIN sqa_works sw ON sw.works_fusion_id=swf.id
			INNER JOIN sqa_data_record sdr ON sdr.works_id=sw.id AND sdr.update_time = (
				SELECT MAX(update_time) FROM sqa_data_record WHERE works_id = sdr.works_id
			)
			INNER JOIN sqa_chapter_info sci ON sci.works_id=sw.id AND sci.`no`=(
				SELECT MAX(`no`) FROM sqa_chapter_info WHERE works_id =sci.works_id
			)
			INNER JOIN sqa_chapter_info sccount on sccount.works_id=sw.id
			GROUP BY swf.id
		)result

	at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:90)
	at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:82)
	at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:82)
	at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:73)
	at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:446)
	at com.sun.proxy.$Proxy92.insert(Unknown Source)
	at org.mybatis.spring.SqlSessionTemplate.insert(SqlSessionTemplate.java:278)
	at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:64)
	at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:61)
	at com.sun.proxy.$Proxy109.insertWorksDayDataList(Unknown Source)
	at com.hm.spss.RlTemplateApplicationTests.testsql(RlTemplateApplicationTests.java:70)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75)
	at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)
	at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:252)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:94)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
	at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
	at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:191)
	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
	at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
	at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
	at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
	at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
Caused by: java.sql.SQLException: sql injection violation, syntax error: syntax error, expect RPAREN, actual IDENTIFIER pos 949, line 29, column 23, token IDENTIFIER sccount : REPLACE INTO sqa_day_data_statistics(
			id,
			works_fusion_id,
			statistics_date,
			chapter_number,
			new_chapter,
			works_hot,
			works_like_number,
			works_read_number,
			works_comment_number,
			works_collection_number
		)
		SELECT
			(SELECT UPPER(REPLACE(result.id, '-', ''))) id,
			result.works_fusion_id,
			STR_TO_DATE(IFNULL(result.statistics_date,'1990-01-01'),'%Y-%m-%d') statistics_date,
			IFNULL(result.chapter_number,0) chapter_number,
			IFNULL(result.new_chapter,'无数据') new_chapter,
			IFNULL(result.works_hot,0) works_hot,
			IFNULL(result.works_like_number,0) works_like_number,
			IFNULL(result.works_read_number,0) works_read_number,
			IFNULL(result.works_comment_number,0) works_comment_number,
			IFNULL(result.works_collection_number,0) works_collection_number
		FROM(
			SELECT
				UUID() id,
				swf.id as works_fusion_id,
				DATE_FORMAT(sdr.update_time,'%Y-%m-%d') statistics_date,
				COUNT(DISTINCTROW sccount.id) chapter_number,
				sci.title new_chapter,
				sum(DISTINCT sdr.works_hot) works_hot,
                sum(DISTINCT sdr.works_read_number) works_read_number,
                sum(DISTINCT sdr.works_like_number) works_like_number,
                sum(DISTINCT sdr.works_comment_number) works_comment_number,
                sum(DISTINCT sdr.works_collection_number) works_collection_number
			FROM sqa_works_fusion swf
			INNER JOIN sqa_works sw ON sw.works_fusion_id=swf.id
			INNER JOIN sqa_data_record sdr ON sdr.works_id=sw.id AND sdr.update_time = (
				SELECT MAX(update_time) FROM sqa_data_record WHERE works_id = sdr.works_id
			)
			INNER JOIN sqa_chapter_info sci ON sci.works_id=sw.id AND sci.`no`=(
				SELECT MAX(`no`) FROM sqa_chapter_info WHERE works_id =sci.works_id
			)
			INNER JOIN sqa_chapter_info sccount on sccount.works_id=sw.id
			GROUP BY swf.id
		)result
	at com.alibaba.druid.wall.WallFilter.checkInternal(WallFilter.java:806)
	at com.alibaba.druid.wall.WallFilter.connection_prepareStatement(WallFilter.java:259)
	at com.alibaba.druid.filter.FilterChainImpl.connection_prepareStatement(FilterChainImpl.java:568)
	at com.alibaba.druid.filter.FilterAdapter.connection_prepareStatement(FilterAdapter.java:930)
	at com.alibaba.druid.filter.FilterEventAdapter.connection_prepareStatement(FilterEventAdapter.java:122)
	at com.alibaba.druid.filter.FilterChainImpl.connection_prepareStatement(FilterChainImpl.java:568)
	at com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl.prepareStatement(ConnectionProxyImpl.java:341)
	at com.alibaba.druid.pool.DruidPooledConnection.prepareStatement(DruidPooledConnection.java:349)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.apache.ibatis.logging.jdbc.ConnectionLogger.invoke(ConnectionLogger.java:55)
	at com.sun.proxy.$Proxy137.prepareStatement(Unknown Source)
	at org.apache.ibatis.executor.statement.PreparedStatementHandler.instantiateStatement(PreparedStatementHandler.java:86)
	at org.apache.ibatis.executor.statement.BaseStatementHandler.prepare(BaseStatementHandler.java:88)
	at org.apache.ibatis.executor.statement.RoutingStatementHandler.prepare(RoutingStatementHandler.java:59)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:63)
	at com.sun.proxy.$Proxy136.prepare(Unknown Source)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.apache.ibatis.plugin.Invocation.proceed(Invocation.java:49)
	at com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor.intercept(PaginationInterceptor.java:132)
	at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)
	at com.sun.proxy.$Proxy136.prepare(Unknown Source)
	at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:86)
	at org.apache.ibatis.executor.SimpleExecutor.doUpdate(SimpleExecutor.java:49)
	at org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:117)
	at org.apache.ibatis.executor.CachingExecutor.update(CachingExecutor.java:76)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:198)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.insert(DefaultSqlSession.java:185)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:433)
	... 34 more
Caused by: com.alibaba.druid.sql.parser.ParserException: syntax error, expect RPAREN, actual IDENTIFIER pos 949, line 29, column 23, token IDENTIFIER sccount
	at com.alibaba.druid.sql.parser.SQLExprParser.accept(SQLExprParser.java:2742)
	at com.alibaba.druid.sql.parser.SQLExprParser.parseAggregateExpr(SQLExprParser.java:1520)
	at com.alibaba.druid.sql.parser.SQLExprParser.methodRest(SQLExprParser.java:1124)
	at com.alibaba.druid.sql.parser.SQLExprParser.parseSelectItem(SQLExprParser.java:3339)
	at com.alibaba.druid.sql.parser.SQLSelectParser.parseSelectList(SQLSelectParser.java:675)
	at com.alibaba.druid.sql.dialect.mysql.parser.MySqlSelectParser.query(MySqlSelectParser.java:181)
	at com.alibaba.druid.sql.parser.SQLSelectParser.query(SQLSelectParser.java:236)
	at com.alibaba.druid.sql.parser.SQLSelectParser.select(SQLSelectParser.java:88)
	at com.alibaba.druid.sql.dialect.mysql.parser.MySqlSelectParser.parseTableSource(MySqlSelectParser.java:246)
	at com.alibaba.druid.sql.dialect.mysql.parser.MySqlSelectParser.parseFrom(MySqlSelectParser.java:89)
	at com.alibaba.druid.sql.dialect.mysql.parser.MySqlSelectParser.query(MySqlSelectParser.java:193)
	at com.alibaba.druid.sql.parser.SQLSelectParser.query(SQLSelectParser.java:236)
	at com.alibaba.druid.sql.parser.SQLSelectParser.select(SQLSelectParser.java:88)
	at com.alibaba.druid.sql.parser.SQLExprParser.primary(SQLExprParser.java:655)
	at com.alibaba.druid.sql.dialect.mysql.parser.MySqlExprParser.primary(MySqlExprParser.java:198)
	at com.alibaba.druid.sql.parser.SQLExprParser.expr(SQLExprParser.java:154)
	at com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser.parseReplace(MySqlStatementParser.java:2332)
	at com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser.parseStatementListDialect(MySqlStatementParser.java:900)
	at com.alibaba.druid.sql.parser.SQLStatementParser.parseStatementList(SQLStatementParser.java:517)
	at com.alibaba.druid.sql.parser.SQLStatementParser.parseStatementList(SQLStatementParser.java:182)
	at com.alibaba.druid.wall.WallProvider.checkInternal(WallProvider.java:624)
	at com.alibaba.druid.wall.WallProvider.check(WallProvider.java:578)
	at com.alibaba.druid.wall.WallFilter.checkInternal(WallFilter.java:793)
	... 75 more

 

后来查阅Druid的文档以及网上的一些资料发现,Druid对于这种语法,会识别为两个语句  即:REPLACE INTO xxx 为一句  后面的 SELECT ... 也是一句独立的SQL,而Druid默认的过滤器 `WallFilter` 里默认会拦截多条SQL一起执行的情况,并抛出异常。

解决方案:配置Druid拦截器,开启 是否允许一次执行多条语句的配置:

 

package com.hm.spss.config;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import com.alibaba.druid.wall.WallConfig;
import com.alibaba.druid.wall.WallFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;

/**
 * @Description:
 */
@Configuration
public class DruidDBConfig {
    @Bean
    public ServletRegistrationBean druidServlet() {
        ServletRegistrationBean reg = new ServletRegistrationBean();
        reg.setServlet(new StatViewServlet());
        reg.addUrlMappings("/druid/*");
        //reg.addInitParameter("allow", "127.0.0.1"); //白名单
        reg.addInitParameter("resetEnable","false");
        return reg;
    }
    @Bean
    public FilterRegistrationBean filterRegistrationBean() {
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
        filterRegistrationBean.setFilter(new WebStatFilter());
        Map<String, String> initParams = new HashMap<String, String>();
        //设置忽略请求

        initParams.put("exclusions", "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*");
        filterRegistrationBean.setInitParameters(initParams);
        filterRegistrationBean.addInitParameter("profileEnable", "true");
        filterRegistrationBean.addInitParameter("principalCookieName","USER_COOKIE");
        filterRegistrationBean.addInitParameter("principalSessionName","");
        filterRegistrationBean.addInitParameter("aopPatterns","com.example.demo.service");
        filterRegistrationBean.addUrlPatterns("/*");
        return filterRegistrationBean;
    }

    // 配置事物管理器
    @Bean
    public DataSourceTransactionManager transactionManager(){
        return new DataSourceTransactionManager(new DruidDataSource());
    }

    @Bean
    public WallFilter wallFilter(){
        WallFilter wallFilter = new WallFilter();
        wallFilter.setConfig(wallConfig());
        return wallFilter;
    }

    @Bean
    public WallConfig wallConfig(){
        WallConfig wallConfig = new WallConfig();
        wallConfig.setMultiStatementAllow(true);//允许一次执行多条语句
        wallConfig.setNoneBaseStatementAllow(true);//是否允许非以上基本语句的其他语句
        wallConfig.setStrictSyntaxCheck(false);//是否进行严格的语法检测
        return wallConfig;
    }



}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在Spring Boot项目中使用MyBatis Plus和Druid多数据源的步骤如下: 1. 添加依赖 在`pom.xml`文件中添加以下依赖: ```xml <!-- MyBatis Plus --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.3.1</version> </dependency> <!-- Druid --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.2.6</version> </dependency> ``` 2. 配置Druid数据源 在`application.yml`中添加Druid数据源的配置: ```yaml spring: datasource: # 主数据源 druid: url: jdbc:mysql://localhost:3306/main_db?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8 username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver # Druid配置 initialSize: 5 minIdle: 5 maxActive: 20 testOnBorrow: false testOnReturn: false testWhileIdle: true timeBetweenEvictionRunsMillis: 60000 validationQuery: SELECT 1 FROM DUAL # 从数据源 druid2: url: jdbc:mysql://localhost:3306/sub_db?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8 username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver # Druid配置 initialSize: 5 minIdle: 5 maxActive: 20 testOnBorrow: false testOnReturn: false testWhileIdle: true timeBetweenEvictionRunsMillis: 60000 validationQuery: SELECT 1 FROM DUAL ``` 3. 配置MyBatis Plus 在`application.yml`中添加MyBatis Plus的配置: ```yaml mybatis-plus: # 主数据源配置 mapper-locations: classpath:mapper/main/*.xml type-aliases-package: com.example.main.entity global-config: db-config: id-type: auto field-strategy: not_empty logic-delete-value: 1 logic-not-delete-value: 0 configuration: map-underscore-to-camel-case: true log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 从数据源配置 multi-datasource: main: mapper-locations: classpath:mapper/main/*.xml type-aliases-package: com.example.main.entity sub: mapper-locations: classpath:mapper/sub/*.xml type-aliases-package: com.example.sub.entity ``` 4. 配置数据源路由 在`com.example.config`包下创建`DynamicDataSourceConfig`类,用于配置数据源路由: ```java @Configuration public class DynamicDataSourceConfig { @Bean @ConfigurationProperties("spring.datasource.druid") public DataSource mainDataSource() { return DruidDataSourceBuilder.create().build(); } @Bean @ConfigurationProperties("spring.datasource.druid2") public DataSource subDataSource() { return DruidDataSourceBuilder.create().build(); } @Bean public DataSource dynamicDataSource() { DynamicDataSource dynamicDataSource = new DynamicDataSource(); Map<Object, Object> dataSourceMap = new HashMap<>(2); dataSourceMap.put("main", mainDataSource()); dataSourceMap.put("sub", subDataSource()); // 将主数据源作为默认数据源 dynamicDataSource.setDefaultTargetDataSource(mainDataSource()); dynamicDataSource.setTargetDataSources(dataSourceMap); return dynamicDataSource; } @Bean public SqlSessionFactory sqlSessionFactory() throws Exception { MybatisSqlSessionFactoryBean sqlSessionFactoryBean = new MybatisSqlSessionFactoryBean(); sqlSessionFactoryBean.setDataSource(dynamicDataSource()); sqlSessionFactoryBean.setTypeAliasesPackage("com.example.main.entity"); sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/main/*.xml")); return sqlSessionFactoryBean.getObject(); } @Bean public SqlSessionTemplate sqlSessionTemplate() throws Exception { return new SqlSessionTemplate(sqlSessionFactory()); } } ``` 5. 配置数据源切换 在`com.example.config`包下创建`DynamicDataSource`类,用于实现数据源切换: ```java public class DynamicDataSource extends AbstractRoutingDataSource { @Override protected Object determineCurrentLookupKey() { return DataSourceContextHolder.getDataSource(); } } ``` 在`com.example.config`包下创建`DataSourceContextHolder`类,用于存储当前数据源: ```java public class DataSourceContextHolder { private static final ThreadLocal<String> DATASOURCE_CONTEXT_HOLDER = new ThreadLocal<>(); public static void setDataSource(String dataSource) { DATASOURCE_CONTEXT_HOLDER.set(dataSource); } public static String getDataSource() { return DATASOURCE_CONTEXT_HOLDER.get(); } public static void clearDataSource() { DATASOURCE_CONTEXT_HOLDER.remove(); } } ``` 在`com.example.aop`包下创建`DataSourceAspect`类,用于切换数据源: ```java @Aspect @Component public class DataSourceAspect { @Pointcut("@annotation(com.example.annotation.DataSource)") public void dataSourcePointCut() { } @Before("dataSourcePointCut()") public void before(JoinPoint joinPoint) { MethodSignature signature = (MethodSignature) joinPoint.getSignature(); DataSource dataSource = signature.getMethod().getAnnotation(DataSource.class); if (dataSource != null) { String value = dataSource.value(); DataSourceContextHolder.setDataSource(value); } } @After("dataSourcePointCut()") public void after(JoinPoint joinPoint) { DataSourceContextHolder.clearDataSource(); } } ``` 6. 使用多数据源 在需要使用从数据源的方法上加上`@DataSource("sub")`注解,如: ```java @Service public class UserServiceImpl implements UserService { @Autowired private UserMapper userMapper; @Override public List<User> listUsers() { DataSourceContextHolder.setDataSource("sub"); List<User> users = userMapper.selectList(null); DataSourceContextHolder.clearDataSource(); return users; } } ``` 这样就完成了Spring Boot项目中使用MyBatis Plus和Druid多数据源的配置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清晨先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值