美文网首页程序员
4.1映射器(Mapper) Select标签详解

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

作者: 落叶飞逝的恋 | 来源:发表于2017-08-22 23:49 被阅读1878次

    映射器是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元素,定义普通的列的映射关系。

    相关文章

      网友评论

        本文标题:4.1映射器(Mapper) Select标签详解

        本文链接:https://www.haomeiwen.com/subject/jvmrdxtx.html