MyBatis简介

发现了一遍博客,讲解MyBatis框架讲解的非常详细、清楚。
博客链接

下面是摘取的一些内容:

整体设计

(1)加载配置并初始化

  触发条件:加载配置文件

  配置来源于两个地方,一处是配置文件,一处是Java代码的注解,将SQL的配置信息加载成为一个个MappedStatement对象(包括了传入参数映射配置、执行的SQL语句、结果映射配置),存储在内存中。     

(2)接收调用请求

  触发条件:调用Mybatis提供的API

  传入参数:为SQL的ID和传入参数对象

  处理过程:将请求传递给下层的请求处理层进行处理。          

(3)处理操作请求

   触发条件:API接口层传递请求过来

   传入参数:为SQL的ID和传入参数对象

   处理过程:

    (A)根据SQL的ID查找对应的MappedStatement对象。

    (B)根据传入参数对象解析MappedStatement对象,得到最终要执行的SQL和执行传入参数。

    (C)获取数据库连接,根据得到的最终SQL语句和执行传入参数到数据库执行,并得到执行结果。

    (D)根据MappedStatement对象中的结果映射配置对得到的执行结果进行转换处理,并得到最终的处理结果。

    (E)释放连接资源。       

(4)返回处理结果

将最终的处理结果返回。

接下来讲解MyBatis框架的Mapper.XML文件

1.SQL映射文件的顶级元素:

1.1 cache – 配置给定命名空间的缓存

1.2 cache-ref – 从其他命名空间引用缓存配置

1.3 resultMap – 最复杂,也是最有力量的元素,用来描述如何从数据库结果集中来加载你的对象

1.4 sql – 可以重用的SQL块,也可以被其他语句引用

1.5 insert – 映射插入语句

1.6 update – 映射更新语句

1.7 delete – 映射删除语句

1.8 select – 映射查询语句

2.select,查询语句是使用MyBatis时最常用的元素之一。

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

参数解释:

id 在命名空间中唯一的标识符,可以被用来引用这条语句。

parameterType 将会传入这条语句的参数类的完全限定名或别名。

parameterMap 这是引用外部 parameterMap 的已经被废弃的方法。使用内联参数映射和 parameterType 属性。

resultType 从这条语句中返回的期望类型的类的完全限定名或别名。注意集合情形,那应该是集合可以包含的类型,而不能是集合本身。使用 resultType 或 resultMap,但不能同时使用。

resultMap 命名引用外部的 resultMap。返回 map 是 MyBatis 最具力量的特性, 对其有一个很好的理解的话, 许多复杂映射的情形就能被解决了。使用 resultMap 或 resultType,但不能同时使用。

flushCache 将其设置为 true,不论语句什么时候被带哦用,都会导致缓存被清空。默认值:false。

useCache 将其设置为 true, 将会导致本条语句的结果被缓存。默认值: true。

timeout 这个设置驱动程序等待数据库返回请求结果,并抛出异常时间的最大等待值。默认不设置(驱动自行处理)

fetchSize 这是暗示驱动程序每次批量返回的结果行数。默认不设置(驱动自行处理)。

statementType STA TEMENT,PREPARED 或 CALLABLE 的一种。这会让 MyBatis 使用选择使用 Statement,PreparedStatement 或 CallableStatement。默认值:PREPARED。

resultSetType FORWARD_ONLY|SCROLL_SENSITIVE|SCROLL_INSENSITIVE 中的一种。默认是不设置(驱动自行处理)。

3.insert, update and delete

数据变更语句 insert,update 和 delete 在它们的实现中非常相似:

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

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

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

参数解释:

id 在命名空间中唯一的标识符,可以被用来引用这条语句。

parameterType 将会传入这条语句的参数类的完全限定名或别名。

parameterMap 这是引用外部 parameterMap 的已经被废弃的方法。使用内联参数映射和 parameterType 属性。

flushCache 将其设置为 true,不论语句什么时候被带哦用,都会导致缓存被清空。默认值:false。

timeout 这个设置驱动程序等待数据库返回请求结果, 并抛出异常时间的最大等待值。默认不设置(驱动自行处理)。

statementType STA TEMENT,PREPARED 或 CALLABLE 的一种。这会让 MyBatis 使用选择使用 Statement,PreparedStatement 或 CallableStatement。默认值:PREPARED。

useGeneratedKeys ( 仅 对 insert 有 用 ) 这 会 告 诉 MyBatis 使 用 JDBC 的
getGeneratedKeys 方法来取出由数据(比如:像 MySQL 和 SQL Server 这样的数据库管理系统的自动递增字段)内部生成的主键。默认值:false。

keyProperty (仅对 insert 有用) 标记一个属性, MyBatis 会通过 getGeneratedKeys 或者通过 insert 语句的 selectKey 子元素设置它的值。默认: 不设置。

keyColumn (仅对 insert 有用) 标记一个属性, MyBatis 会通过getGeneratedKeys 或者通过 insert 语句的 selectKey 子元素设置它的值。默认: 不设置。

4.实例

API接口层的GoodsDao

package secondkill.dao;

import org.apache.ibatis.annotations.Param;
import secondkill.entity.Goods;

import java.util.Date;
import java.util.List;

/**
 * @author xiaochao
 * @date 2017/6/9
 */
public interface GoodsDAO {

    List<Goods> queryAllGoods();

    List<Goods> queryAllActiveGoods(@Param("now") Date now);

    Goods queryGoodsById(Long id);

    int reduceCAS(@Param("goodsId") Long id, @Param("number") Integer number);

}

相应的映射文件,GoodDao.XML。

<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="secondkill.dao.GoodsDAO">
    <!--目的:为dao接口方法提供sql语句配置
    即针对dao接口中的方法编写我们的sql语句-->

    <select id="queryAllGoods" resultType="Goods">
        SELECT *
        FROM goods
        ORDER BY goods.start_time
    </select>

    <select id="queryAllActiveGoods" resultType="Goods">
        SELECT *
        FROM goods
        WHERE
        goods.start_time <![CDATA[ <= ]]> #{now}
        AND
        goods.end_time <![CDATA[ >= ]]> #{now}
    </select>

    <select id="queryGoodsById" resultType="Goods">
        SELECT *
        FROM goods
        WHERE goods_id = #{goodsId}
    </select>

    <!--int reduce(Integer number);-->
    <update id="reduceCAS">
        UPDATE goods
        SET surplus = surplus - #{number}
        WHERE
        goods_id=#{goodsId} AND
        surplus >= #{number}
    </update>
</mapper>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值