• MyBatis数据持久化(六)resultMap使用


    resultMap是MyBatis最强大也是最重要的特性,使用它我们可以將查询结果或者sql输入条件和一个HashMap的key进行映射,大大简化了sql查询条件的输入,而且使得数据的查询变得非常灵活。
    考虑前面的例子,我们从user表中查询出一条数据,查询sql语句配置如下:

        <select id="queryUserInfoByName" parameterType="string"  resultType="user">
            select * from User where username = #{username}
        </select>

    我们必须新建一个映射类com.mybatis.domain.User,它属性和数据库中的每一个字段对应,resultType指定为com.mybatis.domain.User类型,这样才能从数据库中获取每个字段的内容,这种操作是比较繁琐的,而且有时候我们并不需要查询结果中所有的字段。

    在实际使用过程中我们几乎不采用上面这种方式,而是使用resultMap將查询结果映射成一个HashMap,key与数据库字段名建立映射,value为从数据库中查询出的结果,接下来对上面的查询方法进行改写:

        <resultMap type="hashmap"  id="queryUserInfoByNameResult">
            <result property="username" column="username"/>
            <result property="password" column="password"/>
            <result property="phone" column="phone"/>
        </resultMap>
        <select id="queryUserInfoByNameV1" parameterType="hashmap"  resultMap="queryUserInfoByNameResult">
            select * from User where username = #{username}
        </select>

    select标签中有一个resultMap属性,指定一个id为queryUserInfoByNameResult的映射,我们在resultMap标签中定义该映射,property指定hashmap的key,column为映射的数据库字段名。

    然后新建一个测试类com.mybatis.exam4.ResultMap,testResultMap为测试方法:

    package com.mybatis.exam4;
    
    import java.io.IOException;
    import java.io.Reader;
    import java.util.HashMap;
    import org.apache.ibatis.io.Resources;
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    
    public class ResultMap {
        private Reader reader = null;
        private SqlSessionFactory sessionFactory  = null;
        private SqlSession session = null;
        @Before
        public void before()
        {
            try {
                reader = Resources.getResourceAsReader("SqlMapConfig.xml");
                sessionFactory = new SqlSessionFactoryBuilder().build(reader);
                //创建一个数据库会话
                 session = sessionFactory.openSession();  
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    
        @Test
        @SuppressWarnings({ "rawtypes", "unchecked" })
        public void testResultMap()
        {
    
            HashMap map = new HashMap();
            map.put("username", "小王");
            HashMap userInfoMap = (HashMap)session.selectOne("User.queryUserInfoByNameV1",map);
            System.out.println("username: " + userInfoMap.get("username"));
            System.out.println("password: " + userInfoMap.get("password"));
            System.out.println("phone: " + userInfoMap.get("phone"));
        }
    
        @After
        public void after()
        {
            if(null != session)
            {
                session.close();
            }
        }
    }
    

    在testResultMap方法中,由于parameterType指定参数类型为hashmap,所以selectOne方法的第二个参数必须为HashMap对象。这里我们new了一个HashMap对象,map对象中的key对应的值会传到sql语句相应的占位符中。

    查询结果返回一个HashMap对象,我们可以使用get方法获取数据库查询结果。

    打开Outline视图,在testResultMap方法上点击右键Debug As->Junit Test,运行结果为:

    username: 小王
    password: 123456a
    phone: 13535999538
    

    博文源码:https://github.com/rongbo-j/mybatis-blog

  • 相关阅读:
    @SerializedName注解
    信号量与互斥锁
    MySQL分配角色权限
    PO、VO、DAO、BO、POJO
    Java工程为什么要加一个biz层
    Java学习之强引用,弱引用,软引用 与 JVM
    深入Activity,Activity启动模式LaunchMode完全解析
    活体检测
    遥感图像数据集
    NNIE(待尝试)
  • 原文地址:https://www.cnblogs.com/lanzhi/p/6468723.html
Copyright © 2020-2023  润新知