昨天,在使用muybatis做模糊查询时,遇到了一个特别坑的问题:使用mybatis做模糊查询搜索不到数据,但是用sql语句在navicate里面查是可以查出结果的。
问题具体描述:
sql语句在navicate中可以查出结果:
我的ProjectMapper.xml
:
到底是什么问题?该怎么解决呢?在此,我将网上我看到的方法做一个总结:
1、字符编码导致的错误
原因:jdbc的url没有添加utf-8的编码设置。
解决:
url=jdbc:mysql:///company?characterEncoding=utf-8&&useUnicode=true&serverTimezone=UTC&zeroDateTimeBehavior=CONVERT_TO_NULL
2、实体类对象与sql语句没有映射
原因:实体类对象与sql语句的字段不一致。
解决:
- 若只是_与大写字母的差别,如
user_name
与userName
,那么,在配置文件中开启驼峰命名自动映射即可。 - 若是字段的不一致,可以在
mapper.xml
语句里通过as
别名的方式将它们之间映射起来。例如:select project_id as id from project
,其中project_id
为数据库里面表的字段,id
为project
类中的属性。
3、$与#的用法问题
原因:#
与$
的区别最大在于:#{} 传入值时,sql解析后,参数是自带引号的;而${}穿传入值,sql解析后,参数是不带引号的。
解决:将上图中mapper.xml的#
改成$
。
我项目中url上编码是正确的,sql语句与实体类之间是一致的,采用了第3种方式解决了问题。但是,我看网上说可以可以这样写:
<select id="getProjectBy" parameterType="map" resultType="com.lenovocloud.package_manager.vo.ProjectVO">
select id,`name`,version,`type`,user_id as userId,user_name as userName,ctime,mtime from project
<where>
<if test="condition.name!=null">
and `name` like concat("%",#{condition.name},"%")
</if>
<if test="condition.type!=null">
and `type` like concat("%",#{condition.type},"%")
</if>
</where>
order by ctime desc
</select>
但我的不行,这样还是会失效,也不知道为什么。