04. 解决数据库列名与java属性对应关系
我们在使用mybatis框架的时候,在查询语句中,如果数据库列名与最后接收结构的java对象的属性名不同,就不会把结果值传输进去。
比如:
数据库列名 | java属性名 |
---|---|
id | id |
user_name | userName |
password | password |
reg_time | regTime |
下面解决方式都是利用这张表。
解决这种名称不匹配一共有3种方式:
1、方法一:利用列别名
我们在sql的映射文件中,使用select的时候,可以给名称不同的列起一个列别名。
<select id="findById" parameterType="int" resultMap="userResult">
select
id,
user_name userName,
password,
reg_time regTime
from t_user
where id = #{id}
</select>
当然,如果每个select都使用这样写法,这样可能会出现很多重复的sql代码。
我们也可以利用sql标签将重复代码提取出来,然后使用include在需要的地方使用,相当于把代码粘贴过去的。
<!-- 把重复的sql代码可以提炼出来,通过定义别名把sql列名和java属性对应 -->
<sql id="selectResult">
id,user_name userName,password,reg_time regTime
</sql>
<select id="findById" parameterType="int" resultMap="userResult">
select <include refid="selectResult"></include> from t_user where id = #{id}
</select>
2、方法二:属性匹配映射
我们在sql映射文件中,利用resultMap标签将数据库列名和java中的属性名进行映射绑定。
<resultMap type="UserPo" id="userResult">
<id property="id" column="id"/>
<result property="userName" column="user_name"/>
<result property="password" column="password"/>
<result property="regTime" column="reg_time"/>
</resultMap>
然后需要在查询语句中,将结果的接收方式改为resultMap="userResult",其中值为上述定义resultMap标签的id。
<select id="findById" parameterType="int" resultMap="userResult">
select id,user_name,password,reg_time from t_user where id = #{id}
</select>
3、方法三:开启类型自动匹配
这种方式需要严格按照命名规范,数据库中的列,应该是单词和单词之间利用下划线连接,java中的属性应该是小驼峰的命名规范。
比如:user_name ----> userName
开启类型自动匹配后,会自动进行转换。
如何开启?
在全局配置文件mybatis-config.xml中,添加
<!-- 设置类型自动转换 -->
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
注意:
在xml文件中,需要注意标签的位置,因为xml文件中有严格的规范。
settings标签在properties标签的下面,如果没有properties标签,就在configuration标签里面的第一条。