ssm项目使用Mybatis动态拼接sql语句,生成的sql中文全部显示为???的问题(配置文件sql语句中文解析问题)
2017-10-28 11:31
1291 查看
场景再现
有一个表,现在要查询表中一个字符型字段是否含有一些关键字。例:表中有个字段 tag;现在要判断的是这个 tag 是否包含关键字,关键字的个数是不确定的,所以要用动态sql语句进行拼接,筛选出至少包含一个关键字的 tag
需求理解
设 tag 字段的值为 ‘abcdef admin root’关键词集: {‘abc’, ‘admin’, ‘mysql’, ‘fuzz’}
结果: ‘abcdef admin root’满足筛选条件
分析:tag 字段的值含有给定的关键词集中的 ‘abc’, ‘admin’
代码实现
相关的表结构如下:create table `conferenceinfo` ( `id` bigint(20) not null auto_increment, `cnname` varchar(128) default null, `enname` varchar(128) default null, `tag` varchar(250) default null, `location` varchar(64) default null, `sponsor` varchar(128) default null, `startdate` date default null, `enddate` date default null, `deadline` date default null, `acceptance` date default null, `website` varchar(128) default null, `isclassify` int(11) default '0', primary key (`id`) ) engine=innodb auto_increment=1238 default charset=utf8
项目中使用mybatis自动扫描配置装载dao接口,配置文件中的 sql 语句如下:
<!-- 使用动态 sql 语句进行拼接, locate()函数查找 tag 是否包含关键字--> <select id="queryLatestConcernedConferenceInfo" resultType="ConferenceInfo"> select id, cnName, enName, location, sponsor, startdate, enddate, website, deadline, acceptance, tag from ConferenceInfo <where> <![CDATA[ startdate >= #{time} and startdate <= #{endtime}]]> <if test="#{tags}.size > 0"> and ( <!-- 注意:采用的map传递sql参数,service层使用map.put("tags",list)把list放入map, foreach标签中的collection的值要与map中放入list的key值一样 --> <foreach collection="tags" item="t" separator=" "> <![CDATA[ locate(#{t},tag) > 0 or ]]> </foreach> 0 ) </if> </where> order by startdate <if test=" #{offset}!=null and #{number} != null"> limit #{offset}, #{number} </if> </select>
直接在命令行下运行sql语句可以查找到数据,但项目中怎么都查不到任何数据,查看mysql执行日志后发现原来执行的sql语句如下:
select id, cnName, enName, location, sponsor, startdate, enddate, website, deadline, acceptance, tag from ConferenceInfo WHERE startdate >= '2017-10-28 09:50:04.88' and startdate <= '2017-10-30 09:50:04.88' and ( locate(' Computing & Technology',tag) > 0 or locate('?????',tag) > 0 or 0 ) order by startdate limit 0, 8
明明没有传入
?????参数,而且第一个参数
Computing & Technology就是查询参数,而第二个参数原本是一个中文字符串,现在变成了
?????,大概知道是因为出现了中文乱码,但是项目中添加了字符编码过滤器,web层应该不会出现中文乱码,那么乱码可能就出现在数据库层了,搜了一下发现这个问题果然出现在数据库层 参考链接
查看下数据库连接配置,内容如下:
jdbc.driver = com.mysql.jdbc.Driver jdbc.url = jdbc:mysql://localhost:3306/pythondb jdbc.user = root jdbc.password = ********
问题就出现在
jdbc.url上,需要为url指定字符集和编码后mybatis数据库操作就不会出现中文乱码问题,需要在url后面加上
?useUnicode=true&characterEncoding=utf-8
修改后的properties配置文件如下:
jdbc.driver = com.mysql.jdbc.Driver jdbc.url = jdbc:mysql://localhost cd69 :3306/pythondb?useUnicode=true&characterEncoding=utf-8 jdbc.user = root jdbc.password = ********
执行查询语句后再查看mysql执行日志,内容如下:
select id, cnName, enName, location, sponsor, startdate, enddate, website, deadline, acceptance, tag from ConferenceInfo WHERE startdate >= '2017-10-28 10:02:55.099' and startdate <= '2017-10-30 10:02:55.102' and ( locate('计算机应用技术',tag) > 0 or locate('计算机软件',tag) > 0 or locate('计算机通信',tag) > 0 or 0 ) order by startdate limit 0, 8
相关文章推荐
- IT咨询顾问:一次吐血的项目救火 java或判断优化小技巧 asp.net core Session的测试使用心得 【.NET架构】BIM软件架构02:Web管控平台后台架构 NetCore入门篇:(十一)NetCore项目读取配置文件appsettings.json 使用LINQ生成Where的SQL语句 js_jquery_创建cookie有效期问题_时区问题
- mysql导入导出数据中文乱码解决方法小结(1、navicat导入问题已解决,创建连接后修改连接属性,选择高级->将使用Mysql字符集复选框去掉,下拉框选择GBK->导入sql文件OK;2、phpmyadmin显示乱码的问题也解决,两步:1.将sql文件以utf8的字符集编码另存,2.将文件中sql语句中的字段字符集编码改成utf8,导入OK)
- 关于mybatis插件tk.mybatis生成的动态sql语句字段不加``的问题
- Mybatis在控制台显示sql语句配置文件
- 解决ssm环境下配置log4j打印mybatis的sql语句无效的问题
- ibatis/mybatis显示sql语句 log4j.properties配置文件
- 工作总结 1 sql写法 insert into select from 2 vs中 obj文件和bin文件 3 npoi 模板copy CopySheet 最好先全部Copy完后 再根据生成sheet写数据 4 sheet.CopyRow(rowsindex, rowsindex + x); 5 npoi 复制模板如果出现单元格显示问题
- 使用Rocker模板引擎解决动态拼接SQL语句的问题
- mybatis使用注解替代xml配置,动态生成Sql
- MyBatis 和 ibatis的动态SQL语句配置符号,不兼容大于号、小于号等特殊符号问题 X
- springmvc 项目完整示例04 整合mybatis mybatis所需要的jar包 mybatis配置文件 sql语句 mybatis应用
- WebStorm使用问题(一) git管理项目后,目录上文件全部显示为红色
- 记一次大坑:SpringBoot+Mybatis项目中,配置文件中的修改了SQL语句后不生效
- mybatis想要在控制台显示sql语句配置文件
- mybatis显示sql语句 log4j.properties配置文件
- 创建maven项目,将该配置文件运行即可生成 sql 语句
- Python 3下使用Matplotlib工具画图,中文显示乱码的问题解决(修改配置文件)
- MyBatis 和 ibatis的动态SQL语句配置符号,不兼容大于号、小于号等特殊符号问题
- 【Maven+SSM】Mybatis基础使用及动态SQL拼接根据对象查询数据
- mybatis+0+null--------------mybatis中stutas==0是sql动态语句拼接问题