mybatis的mapper.xml查询不出数据,结果一直为null问题解决方案

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://blog.csdn.net/cangxuyi2957/article/details/100962348?utm_medium=distribute.pc_relevant.none-task-blog-baidujs-5

https://www.cnblogs.com/orac/p/6726323.html

https://blog.csdn.net/zahngjialiang/article/details/75453075

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值