mybatis表结构与model无法对应(数据库有值却返回为null)

本文探讨了在使用MyBatis框架时,由于数据库字段与Java实体类属性命名不一致导致的部分字段值为null的问题,并给出了正确的解决方案。

背景

mapper文件添加一个根据条件随机取值的select方法,返回的记录的id是对的,但是有几个字段打印的结果是null,可是数据库里面明明是有值的呀!

测试代码

    public static void main(String[] args) {
        Name name = new Name();
        name.setNameLength(1);
        NameMapper mapper = MbSqlSessionFactory.getSession().getMapper(NameMapper.class);
        System.out.println(mapper.random(name));
    }

打印结果:

Name [Hash = 1860944798, id=347, nameLength=null, serialVersionUID=1]

xml文件配置

<select id="random" resultType="com.ppmoney.qa.source.model.Name">
  select
    <include refid="Base_Column_List" />
    from name
    <trim prefix="where " suffix="" suffixOverrides="and">
      <if test="id != null">
        id=#{id,jdbcType=INTEGER} and
      </if>
      <if test="nameLength != null">
        name_length=#{nameLength,jdbcType=INTEGER} and
      </if>
      <!--  部分字段省略  -->
    </trim>
    order by random() limit 1
 </select>

原因

数据库表结构某几个字段是下划线格式,比如
name_length
而model类属性是nameLength

class Name{
 public String nameLength;
 // 其他省略
}

显然,mybatis会将数据库查出来的结果与Name这个model类做比对,如果一致则认为是同一个字段,如果不一致则认为不是同一个字段。
假如刚好查出的记录是name_length=1(其他字段省略),很显然Name这个类里面是没有name_length这个属性的。所以数据库记录映射成 Name实例后 ,nameLength=null.

正确写法:
BaseResultMap - mybatis文件开头定义的数据库字段与类属性映射…

  <select id="random" resultMap="BaseResultMap">
 // 其他省略
 </select>

问题解决。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值