Mybatis select resultMap 详解

首先来介绍 select 元素

id
它和 Mapper 的命名空间组合起来是唯一的,提供给 MyBatis 调用。
如果命名空间和 id 组合起来不唯一,会抛出异常。

parameterType
传入参数的类型;可以给出类全名,也可以给出类别名,使用别名必须是 MyBatis 内部定义或自定义的;
基本数据类型:int , String , long , date(不知是 sql.date 还是 util.date);
复杂数据类型:类 和 Map;
可以选择 JavaBean,Map 等复杂的参数类型传递给 SQL。

resultType
从这条语句中返回的期望类型的类的完全限定名或别名。
注意如果是集合情形,那应该是集合可以包含的类型,而不能是集合本身。
使用 resultType 或 resultMap,但不能同时使用
定义类的全路径,在允许自动匹配的情况下,结果集将通过 JavaBean 的规范映射;
或者定义为 int,double,float 等参数...
也可以使用别名,但是要符合别名规范,不能和 resultMap 同时使用。
它是我们常用的参数之一,比如我们总计总条数
就可以把它的值设为 int。

resultMap
外部 resultMap 的命名引用。使用 resultMap 或 resultType,但不能同时使用;
它是映射集的引用,将执行强大的映射功能,我们可以使用 resultType 或者 resultMap 其中的一个,resultMap 可以给予我们自定义映射规则的机会
它是 MyBatis 最复杂的元素,可以配置映射规则,级联,typeHandler等

flushCache
它的作用是在调用 SQL 后,是否要求 MyBatis 清空之前查询的本地缓存和二级缓存

true/false,默认为false

useCache
启动二级缓存开关,是否要求 MyBatis 将此次结果缓存

true/false,默认为true

timeout
设置超时时间,超时之后抛出异常,秒
默认值为数据库厂商提供的 JDBC 驱动所设置的秒数

fetchSize
获取记录的总条数设定
默认值是数据库厂商提供的 JDBC 驱动所设的条数

示例:
xml 配置文件中

<select id="selectByPrimaryKey" resultMap="BaseResultMap"
        parameterType="java.lang.Integer">
        select
        <include refid="Base_Column_List" />
        from e_user
        where id = #{id,jdbcType=INTEGER}
    </select>

mapper 接口响应方法:

EUser selectByPrimaryKey(Integer id);

测试代码:

@Test
    // 测试自动映射
    public void testAutoMapping() throws IOException {
        // 2.获取sqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        // 3.获取对应mapper
        EUserMapper mapper = sqlSession.getMapper(EUserMapper.class);
        // 4.执行查询语句并返回结果
        EUser user = mapper.selectByPrimaryKey(1);
        System.out.println(user);
    }

这里多说一点,传递多个参数时候需要注意的,请先看示例:

以下传递多个参数的时候,三种不同的方式。
一个是 map 传递参数,一个是注解直接传递参数,一个是用应用 java bean 传递。

<select id="selectByEmailAndSex1" resultMap="BaseResultMap"
        parameterType="map">
        select
        <include refid="Base_Column_List" />
        from t_user a
        where a.email like CONCAT('%', #{email}, '%') and
        a.sex =
        #{sex}
    </select>

    <select id="selectByEmailAndSex2" resultMap="BaseResultMap">
        select
        <include refid="Base_Column_List" />
        from t_user a
        where a.email like CONCAT('%', #{email}, '%') and
        a.sex =
        #{sex}
    </select>

    <select id="selectByEmailAndSex3" resultMap="BaseResultMap"
        parameterType="com.enjoylearning.mybatis.entity.EmailSexBean">
        select
        <include refid="Base_Column_List" />
        from t_user a
        where a.email like CONCAT('%', #{email}, '%') and
        a.sex =
        #{sex}
    </select>

mapper java 代码和测试代码:

List<TUser> selectByEmailAndSex1(Map<String, Object> param);
    
List<TUser> selectByEmailAndSex2(@Param("email")String email,@Param("sex")Byte sex);
    
List<TUser> selectByEmailAndSex3(EmailSexBean esb);


// 多参数查询
@Test
public void testManyParamQuery() {
    // 2.获取sqlSession
    SqlSession sqlSession = sqlSessionFactory.openSession();
    // 3.获取对应mapper
    EUserMapper mapper = sqlSession.getMapper(EUserMapper.class);

    String email = "qq.com";
    Byte sex = 1;

    // 第一种方式使用map
    Map<String, Object> params = new HashMap<String, Object>();
    params.put("email", email);
    params.put("sex", sex);
    List<EUser> list1 = mapper.selectByEmailAndSex1(params);
    System.out.println(list1.size());

    // 第二种方式直接使用参数
    List<EUser> list2 = mapper.selectByEmailAndSex2(email, sex);
    System.out.println(list2.size());

    // 第三种方式用对象
    EmailSexBean esb = new EmailSexBean();
    esb.setEmail(email);
    esb.setSex(sex);
    List<EUser> list3 = mapper.selectByEmailAndSex3(esb);
    System.out.println(list3.size());
    }

三种方式比较:
使用map传递参数;可读性差,导致可维护性和可扩展性差,杜绝使用;
使用注解传递参数;直观明了,当参数较少一般小于5个的时候,建议使用;
使用Java Bean的方式传递参数;当参数大于5个的时候,建议使用;

resultMap 元素 属性

resultMap 元素是 MyBatis 中最重要最强大的元素。它可以让你从 90% 的 JDBC ResultSets 数据提取代码中解放出来,在对复杂语句进行联合映射的时候,它很可能可以代替数千行的同等功能的代码。

ResultMap 的设计思想是,简单的语句不需要明确的结果映射,而复杂一点的语句只需要描述它们的关系就行了。

id
当前命名空间中的一个唯一标识,用于标识一个 result map.

type
类的完全限定名, 或者一个类型别名 (内置的别名可以参考上面的表格).

autoMapping
如果设置这个属性,MyBatis 将会为这个 ResultMap 开启或者关闭自动映射。这个属性会覆盖全局的属性
autoMappingBehavior。默认值为:unset。

<resultMap id="BaseResultMap" type="EUser">
        <!-- <constructor> <idArg column="id" javaType="int"/> <arg column="user_name" 
            javaType="String"/> </constructor> -->
        <id column="id" property="id" />
        <result column="user_name" property="userName" />
        <result column="real_name" property="realName" />
        <result column="sex" property="sex" />
        <result column="mobile" property="mobile" />
        <result column="email" property="email" />
        <result column="note" property="note" />
    </resultMap>

resultMap 元素 子元素

constructor 用于在实例化类时,注入结果到构造方法中。
-idArg ID 参数;标记出作为 ID 的结果可以帮助提高整体性能。
-arg 将被注入到构造方法的一个普通结果。

id – 一个 ID 结果;标记出作为 ID 的结果可以帮助提高整体性能
result – 注入到字段或 JavaBean 属性的普通结果

association – 一个复杂类型的关联;许多结果将包装成这种类型
嵌套结果映射 – 关联可以指定为一个 resultMap 元素,或者引用一个

collection – 一个复杂类型的集合
•嵌套结果映射 – 集合可以指定为一个 resultMap 元素,或者引用一个

discriminator – 使用结果值来决定使用哪个 resultMap
-case – 基于某些值的结果映射
嵌套结果映射 一个 case 也是一个映射它本身的结果,因此可以包含很多相 同的元素,或者它可以参照一个外部的 resultMap

id & result

id 和 result 都将一个列的值映射到一个简单数据类型(字符串,整型,双精度浮点数,日期等)的属性或字段。
两者之间的唯一不同是, id 表示的结果将是对象的标识属性,这会在比较对象实例时用到。 这样可以提高整体的性能,尤其是缓存和嵌套结果映射(也就是联合映射)的时候。

property
POJO 中映射到列结果的字段或者属性。如果 POJO 的属性匹配的是存在的,和给定 SQL 列名(column 元素)相同的,那么 MyBatis 就会自动映射;

column
SQL 中的列名,或者是列的别名。一般情况下,这和 传递给 resultSet.getString(columnName) 方法的参数一样。

javaType
配置的 Java 的类;

jdbcType
配置的数据库的类型;

typeHandler
类型处理器,使用这个属性,你可以覆盖默 认的类型处理器。这个属性值是一个类型处理 器实现类的完全限定名,或者是类型别名。

constructor

一个pojo不存在没有参数的构造方法,就需要使用 constructor。
为了通过名称来引用构造方法参数,你可以添加 @Param 注解,指定参数名称的前提下,以任意顺序编写 arg 元素。

欢迎大家关注,vx公众号同名

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容