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

阅读全文
0 0
原创粉丝点击