MyBatis学习笔记:表字段名与实体类属性名不一致的解决方法
来源:互联网 发布:数据存储管理软件 编辑:程序博客网 时间:2024/05/20 17:40
MyBatis学习笔记:解决字段名与实体类的属性名称不一致的情况
在上篇博文中,如果我们的实体类属性名与表的字段名完全一致,则在Person.xml中可以看到如下的代码:
<select id="queryById" parameterType="int" resultType="com.wrh.entity.Person"> SELECT * FROM PERSON WHERE ID=#{id} </select>
并在PersonTest.java文件中利用如下的代码,即可以查到数据库中id=100的Person信息
@Test public void queryById(){ sqlSession = MybatisUtil.getSqlSession(); int id = 100; try{ Person person = sqlSession.selectOne("mapper.Person.queryById",id); System.out.println(person.getUserName()); }catch (Exception e){ e.printStackTrace(); }finally { MybatisUtil.closeSession(sqlSession); } }
但是,如果我们数据库Person表中的字段名不是id、name等字段,而时p_id、p_name等字段,则上面的代码就不能正常工作了。
基于此,本篇博文将介绍下这种情况如何进行数据的查询等操作。
例子
第一步:建立一个Student表
Student表有三个字段,为:s_id、s_name、s_age,并插入了一条数据为后面测试做准备,具体如下:
第二步:定义一个实体类Student
Student类的代码如下
package com.wrh.entity; /** * @Author:wojiushimogui * @Description: * @Date:Created by 下午1:19 on 2017/9/3. */ public class Student { private int id; private String name; private int age; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Student{" + "id=" + id + ", name='" + name + '\'' + ", age=" + age + '}'; } }
第三步:编写sql的xml映射文件StudentMapper.xml
具体内容如下:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="mapper.StudentMapper"> <select id="queryById" parameterType="int" resultType="com.wrh.entity.Student"> SELECT * FROM student WHERE s_id=#{id} </select> <select id="queryById2" parameterType="int" resultType="com.wrh.entity.Student"> SELECT s_id id,s_name name,s_age age FROM student WHERE s_id = #{id} </select> <select id="queryById3" parameterType="int" resultMap="resultStudentMap"> SELECT * FROM student WHERE s_id = #{id} </select> <resultMap id="resultStudentMap" type="com.wrh.entity.Student"> <id property="id" column="s_id"/> <result property="name" column="s_name"/> <result property="age" column="s_age"/> </resultMap> </mapper>
第四步:将sql映射文件StudentMapper.xml在mybatis-config.xml进行注册
<mappers> <mapper resource="mapper/StudentMapper.xml"/> </mappers>
第五步:测试
package com.wrh; import com.wrh.entity.Student; import com.wrh.utils.MybatisUtil; import org.apache.ibatis.session.SqlSession; import org.junit.Test; /** * Created by wuranghao on 2017/7/16. */ public class StudentTest { SqlSession sqlSession ; @Test public void queryById(){ sqlSession = MybatisUtil.getSqlSession(); int id = 1; try{ Student student = sqlSession.selectOne("mapper.StudentMapper.queryById",id); System.out.println(student);//null }catch (Exception e){ e.printStackTrace(); }finally { MybatisUtil.closeSession(sqlSession); } } @Test public void queryById2(){ sqlSession = MybatisUtil.getSqlSession(); int id = 1; try{ Student student = sqlSession.selectOne("mapper.StudentMapper.queryById2",id); System.out.println(student);//Student{id=1, name='wojiushimogui', age=18} }catch (Exception e){ e.printStackTrace(); }finally { MybatisUtil.closeSession(sqlSession); } } @Test public void queryById3(){ sqlSession = MybatisUtil.getSqlSession(); int id = 1; try{ Student student = sqlSession.selectOne("mapper.StudentMapper.queryById3",id); System.out.println(student);//Student{id=1, name='wojiushimogui', age=18} }catch (Exception e){ e.printStackTrace(); }finally { MybatisUtil.closeSession(sqlSession); } } }
测试结果为
1、执行queryById()方法所查询到的结果为null,这是因为:实体类的属性名和数据库的字段名对应不上,因此无法查询出对应的记录
2、执行queryById2()方法所查询到的结果为:Student{id=1, name='wojiushimogui', age=18}
,查询结果符合期望的原因为:我们将查询得到的字段名都起一个和实体类属性名相同的别名,这样实体类的属性名和查询结果中的字段名就可以一一对应上了。
3、执行queryById3()方法所查询到的结果为:Student{id=1, name='wojiushimogui', age=18}
,查询结果符合期望的原因为:我们通过映射实体类属性名和表的字段名一一对应关系,其中用id属性来映射主键字段,用result属性来映射非主键字段。
形式如下
<select id="queryById3" parameterType="int" resultMap="resultStudentMap"> SELECT * FROM student WHERE s_id = #{id} </select> <resultMap id="resultStudentMap" type="com.wrh.entity.Student"> <id property="id" column="s_id"/> <result property="name" column="s_name"/> <result property="age" column="s_age"/> </resultMap>
总结
当实体类的属性名与表的字段名不一致时,为正确的查找出相应的数据,有如下两种方法:
方法一:通过在查询的sql语句中定义字段名的别名,让字段名的别名和实体类的属性名一致,这样就可以表的字段名和实体类的属性名一一对应上了,这种方式是通过在sql语句中定义别名来解决字段名和属性名的映射关系的。形式如下:
<select id="queryById2" parameterType="int" resultType="com.wrh.entity.Student"> SELECT s_id id,s_name name,s_age age FROM student WHERE s_id = #{id} </select>
方法二: 通过来映射字段名和实体类属性名的一一对应关系。这种方式是使用MyBatis提供的解决方式来解决字段名和属性名的映射关系的。 形式如下:
<resultMap id="resultStudentMap" type="com.wrh.entity.Student"> <id property="id" column="s_id"/> <result property="name" column="s_name"/> <result property="age" column="s_age"/> </resultMap>
参考资料
1、http://www.cnblogs.com/xdp-gacl/p/4264425.html
- MyBatis学习笔记:表字段名与实体类属性名不一致的解决方法
- MyBatis学习笔记(四)表字段名与实体类属性名不相同解决
- 表字段名和实体类属性名不一致的处理
- myBatis学习笔记(3)——实体属性名与表字段名不匹配问题
- mybatis数据库表字段名与实体类属性名不同的冲突之resultMap
- MyBatis表字段名与实体类属性名冲突的解决方式
- mybatis(四)——mybatis解决数据库表字段名与实体类属性名不同的冲突
- 02-MyBatis_当实体属性与表字段名不一致
- MyBatis之实体类属性与表字段不一致的处理
- MyBatis框架解决字段名与实体类属性名不一致的情况
- mybatis学习笔记(三) --- 解决字段名与实体类属性名不相同的冲突
- Mybatis学习笔记-解决字段名与实体类属性名不相同的冲突
- 在Mybatis中,解决数据库字段名与java实体类属性名不一致的三种方式
- MyBatis学习笔记四——解决字段名与实体类属性名不相同的冲突
- MyBatis入门学习教程 解决字段名与实体类属性名不相同的冲突
- MyBatis学习之解决字段名与实体类属性名不相同的冲突
- MyBatis学习——解决字段名与实体类属性名不相同的冲突
- MyBatis-处理字段名与实体类名不一致的情况 -04
- 【笔记】注意力分配的一些模型
- Qt实现图片旋转
- 十进制转换二进制
- 在jdk8环境下使用dubbo-admin
- Docker中Mysql 中文乱码问题
- MyBatis学习笔记:表字段名与实体类属性名不一致的解决方法
- Android开发镜像下载站点
- HYSBZ
- 数据库(2)---完整性
- JZOJ 5344. 【NOIP2017模拟9.3A组】摘果子
- 【初学者】HTML常用组件——轮播组件
- LeetCode(657)Judge Route Circle
- hdu6156 Palindrome Function 数位dp
- HDU