最近在重温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 最终的检验成果: 都成功的返回了值