1.问题描述:
最近使用ssm框架的时候,遇到一个问题,就是mybatis的mapper.xml在where传入条件查询不出数据,mapper中写的sql语句放在数据库里面去查询是能查询到数据,但是mapper中查询时候,返回的结果为null。
2.其中根据银行名称查询sql语句当传入中文银行名称时,死活查询返回null。于是我在网上查解决方案。
select
<include refid="Base_Column_List" />
from parent_bank where parent_bank_name=#{parentBankName,jdbcType=VARCHAR}
3、解决方案:
以下方案逐一排查、核对。
第一种:修改实体类与数据库字段名相同
我核对了实体类和字段表的字段名称、数据类型都没有问题。
第二种:修改sql查询语句
我在网上查找方法首先看是我的sql在mybatis执行时的sql语句是否有问题,通过网上搜mybatis打印sql方法:
在项目的mybatis-config.xml文件中添加如下代码:
<settings>
<!-- 打印sql日志 -->
<setting name="logImpl" value="STDOUT_LOGGING" />
</settings>
项目打印sql日志代码:
==> Preparing: select ID, PARENT_BANK_ID, PARENT_BANK_NAME, PARENT_BANK_NO, BANK_CODE from parent_bank where parent_bank_name=?
==> Parameters: 中国银行(String)
我把这条sql和条件值复制到数据库执行是可以查到记录。证明mybatis的mapper.xml写的sql正确.
第三种:使用resultMap标签
比如在mapper.xml中使用resultMap标签,将数据库字段和javabean实体类中的名称一一映射,这样即使数据库字段名称和实体类不同,也可以相互匹配到。我的mapper文件名称:ParentBankMapper.xml,代码如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.qingyu.pay.dal.mapper.ParentBankMapper" >
<resultMap id="BaseResultMap" type="com.qingyu.pay.dal.model.ParentBank" >
<!-- column表示数据库表parent_bank的字段名,property表示创建的实体类bean或pojo的属性名称,coloumn与property要一一对应-->
<id column="ID" property="id" jdbcType="BIGINT" />
<result column="PARENT_BANK_ID" property="parentBankId" jdbcType="VARCHAR" />
<result column="PARENT_BANK_NAME" property="parentBankName" jdbcType="VARCHAR" />
<result column="PARENT_BANK_NO" property="parentBankNo" jdbcType="VARCHAR" />
<result column="BANK_CODE" property="bankCode" jdbcType="VARCHAR" />
</resultMap>
<sql id="Base_Column_List" >
ID, PARENT_BANK_ID, PARENT_BANK_NAME, PARENT_BANK_NO, BANK_CODE
</sql>
<select id="selectByName" resultMap="BaseResultMap" parameterType="java.lang.String">
select
<include refid="Base_Column_List" />
from parent_bank where parent_bank_name=#{parentBankName,jdbcType=VARCHAR}
</select>
<select id="selectAll" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from parent_bank
</select>
<select id="selectByParentBankNo" resultMap="BaseResultMap" parameterType="java.lang.String" >
select
<include refid="Base_Column_List" />
from parent_bank where parent_bank_no= #{bankLinked,jdbcType=VARCHAR}
</select>
</mapper>
第四种:设置项目连接数据库datasource或jdbc的编码格式
对项目的db.properties内jdbc.url设置连接编码与数据库的编码一致。代码如下:
?useUnicode=true&characterEncoding=utf8
datasource或者jdbc中的配置url未设置连接数据库的编码格式,编码格式需要在url中声明,并且传入的数据度也应该是相同编码格式的(我就是这个问题导致我找了4个小时才找到解决。以后要注意)。
比如 你创建一张表 使用的是engine innodb charset utf8;那么你的数据源url连接就应该是 jdbc:mysql://(数据库地址+端口)/(数据库名)?useUnicode=true&characterEncoding=utf8(可能还会有别的参数需要指定);
究其原因 还是因版为编码格式的问题,你的"中国银行"到数据库的前,会在myabtis做一些处理,做这些处理的时候,"中国银行"就可能不在是"中国银行"了。所以使用mybatis查询不到,但是在mysql中直接查询是查询得到的。
参考链接:
https://blog.csdn.net/ITBigGod/article/details/82691295
https://www.cnblogs.com/orac/p/6726323.html
https://blog.csdn.net/zahngjialiang/article/details/75453075