MyBatis数据库字段和实体对象属性名不一致的解决方案
数据库和对象的属性名不一致是很常见的问题,这个时候依从表字段到对象属性名的按名称匹配映射已经搞不定这个了,下面是几种解决方案。
1. 开启驼峰转换
如果数据库中的字段名与对象只是简单的不一致的话,比如名字是一样的,只是分隔方式不一样,在数据库中使用了下划线分隔,而在对象中使用了驼峰分隔,如果都是这样子的话倒不是特别麻烦,只需要在mybatis的配置文件中开启驼峰转换即可。
<setting name="mapUnderscoreToCamelCase" value="true"/>
2. 在SQL查询语句中使用别名来适配
还有一种情况就是绝大部分情况下都是可以适配得上的,但是只有几列适配不上,这个时候定义单独的ResultMap感觉有点不值当(事实上,从可维护性上来考虑定义ResultMap绝对是首选),所以我们就在查询数据的时候在SQL语句中使用别名来使数据库列名能够适配得上对象的属性名。
比如在数据库中用户名列叫做username,在对象中用户名叫做name,由于种种原因我们不能去修改这两个名字了但是还要让它们能够对应得起来,下面是一种可能的解决方案:
<select id="loadById" parameterType="string" resultType="user">
SELECT id, username AS name, passwd FROM t_user WHERE id=#{id}
</select>
甚至在指定别名的时候还可以在别名中包含点符号来导航,比如使用role.name来指定注入到user对象的role属性的name属性中,下面是一个简单的例子:
<select id="load" parameterType="long" resultType="org.cc11001100.mybatis.domain.User">
SELECT
t1.id, username, passwd,
t3.id AS 'role.id',
t3.name AS 'role.name'
FROM
t_user AS t1
JOIN t_user_role AS t2 ON t1.id=t2.user_id
JOIN t_role AS t3 ON t3.id=t2.role_id
WHERE
t1.id=#{id};
</select>
3. 自定义ResultMap
最后,实在是不一致得比较离谱,基本上大部分的数据库字段和对象的名字都是不对应的,这种情况下定义一个ResultMap来解决这个问题绝对是上策。
<select id="loadById" parameterType="string" resultMap="userResultMap">
SELECT * FROM t_user WHERE id=#{id}
</select>
然后在resultMap标签中配置不同字段的映射:
<resultMap id="userMap" type="org.cc11001100.mybatis.domain.User" autoMapping="true">
<id column="id" property="id"/>
<result column="username" property="name"/>
</resultMap>
resultMap标签有个属性叫做autoMapping,当指定为true的时候表示没有手动使用id或者result标签指定映射的属性就自动映射,这样将这个属性置为true,就可以只指定表字段名称与对象属性名不匹配的字段,大大减少了工作量。
.
MyBatis数据库字段和实体对象属性名不一致的解决方案的更多相关文章
- KO ------- 表中字段名和实体类属性名不一致
-----------------------siwuxie095 KO ------- 表中字段名和实体类属性名不一致 如果数据库表中的字段名和实体类的属性名不一致,那么在查询时, 相应字段的结果就 ...
- json字符串转java对象,json中字段名称与对象属性名称不一致
json字符串转java对象,json字段名称与对象属性名称不一致可以在对象属性上添加注解@SerializedName解决
- MyBatis:当表字段名和实体类属性名不一致
第一种解决方法:在sql中使用别名 <select id="getRoleList" resultType="com.ttpfx.domain.Role" ...
- Mybatis中resultMap的作用-解决实体类属性名和数据库字段不一致
解决实体类属性名和数据库字段不一致
- MyBatis学习总结(四)——解决字段名与实体类属性名不相同的冲突(转载)
本文转载自:http://www.cnblogs.com/jpf-java/p/6013307.html 在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同的,下面来演示一下这 ...
- MyBatis入门学习教程-解决字段名与实体类属性名不相同的冲突
在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同的,下面来演示一下这种情况下的如何解决字段名与实体类属性名不相同的冲突. 一.准备演示需要使用的表和数据 CREATE TAB ...
- MyBatis学习总结(四)——解决字段名与实体类属性名不相同的冲突
在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同的,下面来演示一下这种情况下的如何解决字段名与实体类属性名不相同的冲突. 一.准备演示需要使用的表和数据 CREATE TAB ...
- MyBatis——解决字段名与实体类属性名不相同的冲突
原文:http://www.cnblogs.com/xdp-gacl/p/4264425.html 在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同的,下面来演示一下这种情况 ...
- MyBatis学习总结_04_解决字段名与实体类属性名不相同的冲突
一.准备演示需要使用的表和数据 CREATE TABLE orders( order_id INT PRIMARY KEY AUTO_INCREMENT, order_no VARCHAR(20), ...
随机推荐
- PHP面向对象之重载
重载技术overloading 重载的基本概念 重载在“通常面向对象语言”中的含义: 是指,在一个类(对象)中,有多个名字相同但形参不同的方法的现象: 类似这样: class C{ functio ...
- Hibernate学习--hibernate延迟加载原理-动态代理(阿里电面)
在正式说hibernate延迟加载时,先说说一个比较奇怪的现象吧:hibernate中,在many-to-one时,如果我们设置了延迟加载,会发现我们在eclipse的调试框中查看one对应对象时,它 ...
- [九]SpringBoot 之 定时任务
代码: package me.shijunjie.config; import org.springframework.context.annotation.Configuration; import ...
- Luogu4897 【模板】最小割树
没事干写一发模板. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib& ...
- Codeforces709
A Kolya is going to make fresh orange juice. He has n oranges of sizes a1, a2, ..., an. Kolya will p ...
- Wifi密码破解实战
原文链接地址:http://www.freebuf.com/articles/wireless/127261.html https://www.baidu.com/?tn=98012088_4_dg& ...
- LINUX内核分析第四周——扒开系统调用的三层皮
LINUX内核分析第四周--扒开系统调用的三层皮 李雪琦 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course ...
- sz与rz命令
一般来说,linux服务器大多是通过ssh客户端来进行远程的登陆和管理的,使用ssh登陆linux主机以后,如何能够快速的和本地机器进行文件的交互呢,也就是上传和下载文件到服务器和本地: 与ssh ...
- [雅礼集训 2017 Day1]市场
link 试题分析 可以容易发现此题维护的是一个数据结构,支持区间加,区间除,区间查询最大值.其实就是在$\log$级复杂度内维护除法操作. 我们发现当除数很大或者此串序列大小差不多时,我们令$a_i ...
- 【贪心】【P5078】Tweetuzki 爱军训
Description Tweetuzki 所在的班级有 \(n\) 名学生,座号从 \(1\) 到 \(n\).有一次,教官命令班上的 \(n\) 名学生按照座号顺序从左到右排成一排站好军姿,其中 ...