Mapper的XML文件(一)

Mysql映射文件元素

  MyBatis的真正强大在于它的映射语句,也是它的魔力所在,由于它的异常强大,映射器的XML文件就显得相对简单,如果拿它跟具有相同功能的JDBC代码进行对比,你会立即发现省掉了将近95%的代码,MyBatis就是针对SQL构建的,并且比普通的方法做的更好。
  SQL映射文件有很少的几个顶级元素(按照他么应该被定义的顺序):

  • cache 给定命名空间的缓存配置;
  • cache-ref 其他命名空间缓存配置的引用;
  • resultMap是最复杂也是最强大的元素,用来描述如何从数据库结果集中来加载对象;
  • parameterMap 已废弃,老式风格的参数映射,内联参数时首选,这个元素可能在将来被移除,这个不会记录;
  • sql 可被其他语句引用的可重复语句块;
  • insert 映射插入语句;
  • update 映射更新语句;
  • delete 映射删除语句;
  • select 映射查询语句;

select

  查询语句是MyBatis中最常用的元素之一,光能把数据存到数据库中,价值不大,如果还能冲讯取出来才有用,多数应用也都是查询比修改要频繁,对每个插入、更新或者删除操作,通常对应多个查询操作。这是MyBatis的基本原则之一,也是将焦点和努力放到查询和结果映射的原因。简单查询的select元素是非常简单的,比如:

    <select id="selectPerson" parameterType="int" resultType="hashmap">
        SELECT * FROM PERSON WHERE ID = #{id}
    </select>

  这个语句被称作selectPerson,接受一个int(Integer)类型参数,并返回一个HashMap类型的对象,其中的键是列名,值便是结果行中的对应值。
注意:参数符号:

    #{id}

这就告诉MyBatis创建一个预处理语句参数,通过JDBC,这样的一个参数在SQL中会由一个”?”来标示,并被传递到一个新的预处理语句中,就像这样:

    //Similar JDBC code,NOT MyBatis...
    String selectPerson = "SELECT * FROM PERSON WHERE ID=?";
    PreparedStatement ps = conn.preparedStatement(selectPerson);
    ps,setInt(1,id);

当然,这需要很多单独的JDBC的代码来提取结果并将它们映射到对象实例中,这就是MyBatis节省你时间的地方,我们需要深入了解参数和结果映射,细节部分我们下面来了解。
  select元素有很多属性允许你配置,来决定每条语句的作用细节。

    <select
        id="selectPerson"
        parameterType="int"
        parameterMap="deprecated"
        resultType="hashmap"
        resultMap="personResultMap"
        flushCache="false"
        useCache="true"
        timeout="10000"
        fetchSize="256"
        statementType="PREPARED"
        resultSetType="FORWARD_ONLY">

注:如果图片不清楚,可以拖动至新页面打开图片。
select中的配置元素

insert、update和delete

  数据变更语句:insert、update和delete的实现非常接近:

    <insert
        id="insertAuthor"
        parameterType="domain.blog.Author"
        flushCache="true"
        statementType="PREPARED"
        keyProperty=""
        keyColumn=""
        useGeneratedKeys=""
        timeout="20" >

    <update
        id="updateAuthor"
        parameterType="domain.blog.Author"
        flushCache="true"
        statementType="PREPARED"
        timeout="20" >

    <delete
        id="deleteAuthor"
        parameterType="domain.blog.Author"
        flushCache="true"
        statementType="PREPARED"
        timeout="20" >

insert/update
  下面就是insert、update和delete语句的示例:

    <insert id="insertAuthor">
        INSERT INTO Author
            (id,username,password,email,bio)
        VALUES
            (#{id},#{username},#{password},#{email},#{bio})
    </insert>

    <update id="updateAuthor">
        UPDATE Author SET
            username = #{username},
            password = #{password},
            email = #{email},
            bio = #{bio}
        WHERE
            id = #{id}
    </update>

    <delete id="deleteAuthor">
        DELETE FROM 
            Author
        WHERE 
            id=#{id}

  如前所述,插入语句的配置规则更加丰富,在插入语句里面有一些额外的属性和子元素用来处理主键的生成,而且有多种生成方式。
  首先,如果你的数据库支持自动生成主键的字段(比如:MySQL和SQL Server),那么你可以设置useGeneratedKeys = "true",然后再把keyProperty 设置到目标属性上就OK了,例如:如果上面的Author表已经对id使用了自动生成的列类型,那么语句可以修改为:

    <insert id = "id" useGeneratedKeys="ture" keyProperty = "id">
        INSERT INTO Author
            (username,password,email,bil)
        VALUES
            (#{username},#{password},#{emial},#{bio})
    </insert>

  对于不支持自动生成类型的数据库或可能不支持自动生成主键JDBC驱动来说,MyBatis有另外一种方法来生成主键。
  这里有一个简单(甚至很傻)的示例,它可以生成一个随机ID(你最好不要这么做,但这里展示了MyBatis处理问题的灵活性及其所关心的广度):

    <insert id = "insertAuthor">
        <selectKey keyProperty = "id" resultType = "int" order = "BEFORE">
            SELECT CAST(RANDOM()*1000000 AS INTRGER) a FROM SYSTEM.SYSDUMMY1
        </selectKey>

        INSERT INTO Author
            (id,username,password,email,bio,favourite_section)
        VALUES
            (#{id},#{username},#{password},#{email},#{bio},#{favouriteSection,jdbcType=VARCHAR})
    </insert>

  在上面的示例中,selectKey元素将会首先运行,Author的id会被设置,然后插入语句会被调用,这给你了一个和数据库中来处理自动生成主键类似的行为,避免了使java代码变得负载。
  selectKey元素描述如下:

    <selectKey
        keyProperty="id"
        resultType="int"
        order="BEFORE"
        statementType="PREPARED" >

selectKey

sql

  这个元素可以被用来定义可重用的SQL代码段,可以包含在其他语句中,它可以被静态地(在加载参数) 参数化. 不同的属性值通过包含的实例变化. 比如:

    <sql id = "userColumns"> ${alias}.id,${alias}.username,${alias}.password </sql>

这个SQL片段可以被包含在其他语句中,例如:

    <select id = "selectUsers" resultType = "map">
        SELECT
            <include refild = "userColumns"> <property name = "alias" value = "t1" /> </include>
            <include refild = "userColumns"> <property name = "alias" value = "t2" /> </include>
        FROM some_tavle t1
            cross join some_table t2
    </select>

属性值可以用于包含的refid属性或者包含的字句里面的属性值,例如:

    <sql id = "sometable">
        ${prefox} Table
    </sql>

    <sql id = "someinclude">
        from
            <include refid = "${include_target}" />
    </sql>
<select id = "select" resultType="map">
    select 
        field1,field2,field3
        <include refid = "someinclude">
            <property name="prefix" value="some"/>
            <porperty name= "include_target" value="sometable"/>
        </include>
</select>

未完待续……

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

苦修的木鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值