Mybatis 查询 返回值中只有id有值,其他都是null;

最近在重温mybatis, 但是在做练习的时候发现一个问题;

查询,简单的查询,返回之后发现结果中,只有id被映射了值,其他属性都是null; 很纳闷,为什么一个简单的测试会出现这种问题;

一开始以为是自己代码或者SQL写的有问题;结果都没有问题 SQL在数据库执行是有值的

ok,问题定位到了映射,

提前剧透 .是因为下划线和驼峰的原因,无法正确映射,详细解释看下面

查看xml,最开始是这样写的 ↓↓↓↓↓↓↓

1. 采用的resultType  原因就出现在这里      

<!-- 查询关联角色 -->
    <select id="selectRoles" resultType="com.zl.box.bootmybaits.model.Role" parameterType="int">
        select r.* from role r left join user_role u on r.ID = u.RID where u.UID= #{id}
    </select>

为何原因出现在resultType呢,  看下面实体类与数据库表结构

public class Role implements Serializable {

    /**
     * 编号
     */  
    private Integer id;

    /**
     * 角色名称
     */   
    private String roleName;

    /**
     * 角色描述
     */
    private String roleDesc;

    ....省略get/set方法
}

数据库中是采用下划线连接单词的,而实体类中是采用的驼峰规则;这就导致了 SQL 中r.*  明明返回了值 但是无法正确映射的问题;

所以以后遇到相同问题的小伙伴,采用resultMap吧,做一下映射关联,这样就可以解决问题了

缺点: 对于resultType 不生效,配置xml 相对来说比较麻烦

解决方式一如下:

--resultMap:

    <resultMap id="BaseResultMap" type="com.zl.box.bootmybaits.model.Role">
        <id column="ID" property="id" jdbcType="INTEGER"/>
        <result column="ROLE_NAME" property="roleName" jdbcType="VARCHAR"/>
        <result column="ROLE_DESC" property="roleDesc" jdbcType="VARCHAR"/>
    </resultMap>


--SQL 
    <!-- 查询关联角色 -->
    <select id="findRoleByUid" resultMap="BaseResultMap" parameterType="int">
        select r.* from role r left join user_role u on r.ID = u.RID where u.UID= #{uid}
    </select>

然后就OK了;

方式二: 通过配置开启驼峰映射。具体参考官方文档:

https://mybatis.org/mybatis-3/zh/configuration.html#settings

开启驼峰与下划线转换

# yml 方式

mybatis:
    configuration:
        map-underscore-to-camel-case: true


# properties方式

mybatis.configuration.map-underscore-to-camel-case=true 


# 在mybatis的配置文件,如mybatis-config.xml中进行配置:

前置条件: 在yml/properties 文件中配置
mybatis.config-location=classpath:mybatis/mybatis-config.xml


<configuration>
    <!-- 开启驼峰映射 ,为自定义的SQL语句服务-->
    <!--设置启用数据库字段下划线映射到java对象的驼峰式命名属性,默认为false-->  
    <settings>
      <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
 
</configuration>

方式三:那就是,不要写成r.*, 

select r.* from role

写成r.id id, r.role_name roleName, r.role_desc  roleDesc 即可 

select r.ID id,r.ROLE_DESC roleDesc, r.ROLE_NAME roleName from role r

Ok  最终的检验成果: 都成功的返回了值

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值