MyBatis学习笔记:表字段名与实体类属性名不一致的解决方法

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

具体内容如下:

    
    

    <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>

        "resultStudentMap" type="com.wrh.entity.Student">
            property="id" column="s_id"/>
            property="name" column="s_name"/>
            property="age" column="s_age"/>
        

总结

当实体类的属性名与表的字段名不一致时,为正确的查找出相应的数据,有如下两种方法:

方法一:通过在查询的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提供的解决方式来解决字段名和属性名的映射关系的。 形式如下:

        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"/>
           

参考资料

1、http://www.cnblogs.com/xdp-gacl/p/4264425.html

你可能感兴趣的:(mybatis,mybatis,字段名,属性名,不一致)