4.1映射器(Mapper) Select标签详解

映射器是MyBatis最强大的工具,也是我们使用MyBatis时用得最多的工具,因此熟练掌握它十分必要。

MyBatis官方映射器详解

1.映射器的主要元素

  • 1.cache

给定命名空间的缓存配置

  • 2.cache-ref

其他命名空间缓存配置的引用

  • 3.resultMap

用来描述从数据库结果集中来加载对象,也是最复杂最强大的

  • 4.sql

可被其他语句引用的可重用语句块

  • 5.增删改查

insert\delete\update\select

  • 6.parameterMap(参数映射关系)

2.select元素

select元素帮助我们从数据库中读出数据,把结果集组装成我们需要的pojo对象。

2.1 select元素的配置属性

  • 1.id(必填)

命名空间的唯一标识,可以在通过此id来引用它。并且与mapper的namespace进行组合成包中唯一的标识,提供给MyBatis调用,如果不唯一,则会报错。

  • 2.parameterMap(废弃
  • 3.parameterType(可选)

传入SQL语句的参数类型。可以是类型的完全限定名,也可以是自定义的typeAliases别名。

  • 4.resultType

定义类的全路径,在允许自动匹配的情况下,结果集将通过JavaBean的规范映射。也可以使用别名。但是不能与resultMap一起使用。

  • 5.resultMap

它是映射集的引用,将执行强大的映射功能,我们可以使用resultType或者resultMap其中的一个。但是通过resultMap我们可以自定义映射规范。

  • 6.flushCache

boolean属性,默认值为false。它的作用是在调用SQL后,要求MyBatis清空之前查询的本地缓存和二级缓存。

  • 7.useCache

boolean属性,默认值为true。启动二级缓存的开关,要求MyBatis将此次结果缓存。

  • 8.timeout

设置超时时间,等超时的时候将抛出异常。单位为秒。

  • 9.fetchSize

获取记录总条数设定

  • 10.statementType

枚举属性,三个枚举值:statement、preparedstatement、callablestatement。默认值为preparedstatement。告诉MyBatis使用哪个JDBC的statement工作。

  • 11.resultSetType

这是对JDBC的resultSet接口而言。两个属性:Forward_only(游标允许向前访问)、Scroll_sensitive(双向滚动,但是不及时更新,就是如果数据库里的数据修改过,并不在resultSet总反应出来)、Scroll_insensitive(双向滚动,及时跟踪数据库的更新,以便更新resultSet数据)

  • 12.databseId

设置数据库厂商的标识。

  • 13.resultOrdered

boolean属性,默认值为false。这个设置仅仅适用嵌套结果集select语句。

  • 14.resultSets(很少使用)

适合于多个结果集的情况,它将列出执行SQL后每个结果集的名称,每个名称之间用逗号分隔。

2.2 小例子

  • 1.创建表
CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(45) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;
  • 2.创建POJO
public class User {
    private int id;

    private String name;

    private int age;

    //省略getter、setter
    
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

  • 3.定义Dao接口定义
package dao;

import model.User;

public interface IUserDao {
    /**
     * 通过主键查询用户
     * @param id
     * @return
     */
    User getUserById(int id);
}

  • 4.定义User对应的Mapper文件
<?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="dao.IUserDao">
    <select id="getUserById" parameterType="int" resultType="model.User">
        select * from user where id=#{id};
    </select>
</mapper>

这个语句被称作getUserById,接受一个int或者Integer类型参数。返回model.User类型对象。

2.3 自动映射POJO属性

从上面的小例子,可以看到,我们数据库定义的列名与POJO的属性名称是一样的。那么,MyBatis会帮助我们自动将数据库的列名与POJO属性映射起来。(PS:因为MyBatis.xml里面的setting属性里面的autoMappingBehavior的默认值是Partial)

2.4 传递多个参数方式

上面的例子,我们的查询的参数只有一个,我们可以在select标签内定义查询参数类型。但是如果超过2个以及2个以上,就需要换种方式处理。

  • 1.使用注解方式传参

使用MyBatis的参数注解@Param(org.apache.ibatis.annotations.Param)来实现。使用此方式的好处就是无需在mapper的select标签内定义请求参数的类型。

public interface IUserDao {
    /**
     * 通过主键查询用户
     * @param id
     * @return
     */
    User getUserById(@Param("id") int id);
}
<?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="dao.IUserDao">
    <select id="getUserById" resultType="model.User">
        select * from user where id=#{id};
    </select>
</mapper>

缺点:如果参数超过5个,甚至以上。这时候,就显的比较麻烦,就可以换成JavaBean传递参数

  • 2.使用JavaBean传递参数

MyBatis允许组织一个JavaBean,通过简单的setter和getter方法设置参数,这样就可以提高的代码的可读性。

以重写上面的例子。请求参数还是User类型

public interface IUserDao {
    /**
     * 通过主键查询用户
     * @param user
     * @return
     */
    User getUserById(User user);
}

<?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="dao.IUserDao">
    <select id="getUserById" parameterType="model.User" resultType="model.User">
        select * from user where id=#{id};
    </select>
</mapper>

2.5 resultMap映射结果集

有些时候,我们通过resultType不能完全处理一些复杂的映射属性。这时候就需要手动设置映射关系。那么就通过resultMap设置。

注意:resultType与resultMap不能一起使用。

只需要修改mapper.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="dao.IUserDao">
    <resultMap id="userResultMap" type="model.User">
        <id property="id" column="id"></id>
        <result property="name" column="name"></result>
        <result property="age" column="age"></result>
    </resultMap>

    <select id="getUserById" parameterType="model.User" resultMap="userResultMap">
        select * from user where id=#{id};
    </select>
</mapper>

resultMap标签的id,代表定义了唯一一个的resultMap。

resultMap标签的type,代表最终数据库需要映射到哪个POJO上。

id元素,代表的使用哪个属性作为其主键。

result元素,定义普通的列的映射关系。

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

推荐阅读更多精彩内容