补充 1 MyBatis 使用过程中, 返回值类型可能是 Map, 不一定是实体类
返回查询结果也可以是一个 Map, 不一定是实体类
(1)mybatis 会先将查询结果返回为一个 map, 字段名作为 key, 字段值作为 value, 保存在 map 中, 后面再转化为实体类
(2) 如果不写实体类, 就返回一个 Map, 想得到其中的字段值, 需要调用 map.get() 方法来获取值, 缺点就是需要先知道字段名
EmpMapper.xml 中配置:
- <!-- 返回 map 类型的结果 -->
- <!-- 也可以将返回结果简写成 map,map 即为 java.util.Map -->
- <select id="findOne" parameterType="int" resultType="java.util.Map">
- SELECT * FROM T_TABLE WHERE ID=#{id}
- </select>
测试代码:
- /**
- * 查询结果为 map 类型, 不返回实体类, 返回 java.util.Map
- */
- @Test
- public void test4() {
- Map map=session.selectOne("clyang.findOne", 4);
- System.out.println(map);
- //oracle 数据库会将字段名自动变成大写, 如果要取值需要写成大写
- System.out.println(map.get("NAME"));// 使用 Map 的 get 方法得到属性值
- session.close();
- }
测试结果:
补充 2 解决数据库字段名和实体类属性名不一致
(1) 使用别名, 将查询后的字段名改别名, 别名跟实体类的名字一样
(2) 使用 resultMap 解决
新的实体类, 属性名跟表的字段名都不一样:
- public class NewEmployee {
- private int empID;
- private String empName;
- private int empAge;
- public int getEmpID() {
- return empID;
- }
- public void setEmpID(int empID) {
- this.empID = empID;
- }
- public String getEmpName() {
- return empName;
- }
- public void setEmpName(String empName) {
- this.empName = empName;
- }
- public int getEmpAge() {
- return empAge;
- }
- public void setEmpAge(int empAge) {
- this.empAge = empAge;
- }
- @Override
- public String toString() {
- return "NewEmployee [empID=" + empID + ", empName=" + empName + ", empAge=" + empAge + "]";
- }
EmpMapper.xml 中配置, resultType 需改成 resultMap, 并配置 resultMap, 告诉返回的字段值如何一一对应到新的实体类:
- <!-- 使用 resultMap 解决表的字段名和实体类的属性名不一致的情况 -->
- <resultMap id="resultMapID" type="entity.NewEmployee">
- <result property="empID" column="id" />
- <result property="empName" column="name" />
- <result property="empAge" column="age" />
- </resultMap>
- <select id="findOneByNewEmp" parameterType="int" resultMap="resultMapID">
- SELECT * FROM T_TABLE WHERE ID=#{id}
- </select>
测试代码:
- /**
- * 当数据表的字段名和实体类不一致时, 查询的返回结果为 null
- * 可以修改返回结果的别名, 让别名和实体类的属性名一致, 或者配置文件中配置 resultMap, 即可解决
- */
- @Test
- public void test5() {
- NewEmployee emp=new NewEmployee();
- emp=session.selectOne("clyang.findOneByNewEmp", 4);
- System.out.println(emp);
- session.close();
- }
测试结果:
来源: http://www.bubuko.com/infodetail-2946005.html