mybatis整体框架

1、mybatis框架

image

1.1、接口层–与数据库交互的api

mybatis提供了两种与数据库交互的方式:

1.1.1、使用mybatis提供的传统api方法

传统的api方式即传入statementId和param利用SqlSession提供的select/update/delete/insert等方法来与数据库进行交互;

image

具体实例如下所示:
映射器接口

public interface EnvironmentDao {
     public int updateEnv(@Param("ip") String ip,@Param("id") int id);
     public EnvironmentDo selectById(@Param("id") int id);
 }   

mapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!--suppress SqlDialectInspection -->
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.XXXX.service.mobile.meilv.dao.EnvironmentDao">
    <update id="updateEnv" >
        UPDATE test_env
        SET ip = #{ip}
        WHERE id = #{id}
    </update>
    <select id="selectById" resultType="com.XXXX.service.mobile.meilv.dao.bean.EnvironmentDo">
        SELECT id ,ip,name FROM test_env WHERE id=#{id}
    </select>
</mapper>

传统mybatis的api使用

  sqlSession = MySqlSessionFactoryUtils.openSqlSession();
  Map<String,Object> map = new HashMap();
  map.put("ip", currentEnv.getTicketServer().substring(7));
  map.put("id", new Integer(Type.Rhone_callback.getId()));
  sqlSession.update("com.XXXX.service.mobile.meilv.dao.EnvironmentDao.updateEnv", map);
1.1.2、使用mapper接口

mybatis将Mapper.xml中映射器配置抽象为一个mapper接口,接口中的方法与xxMapper.class 接口中的方法一一对应。mapper.xml中insert,select,update,delete节点的id为xxMapper.class中 的方法名,parameterType为接口中的参数,resultType为接口中的返回类型;

image

用户使用sqlSession.getMapper()方法获取一个Mapper实例,sqlSession.getMapper的底层实现是mybatis利用jdk动态代理为 mapper生成一个代理对象返回给用户;当用用户调用一个mapper方法时,mybatis会根据这个方法的方法名和 参数来确定statementId和param,底层还是使用sqSession.select(statementId,param)来实现; 具体实现如下:

EnvironmentDao environmentDao = sqlSession.getMapper(EnvironmentDao.class);
environmentDao.updateEnv(currentEnv.getTicketServer().substring(7), Type.Rhone_callback.getId());
1.2、数据处理层

数据处理层主要完成三件事:

1.2.1、sql的动态生成

当用户调用api查询数据时,mybatis就会根据用户传入的statementId,从Configuration里取得对应的MappedStatement,然后依据传入的参数,对MapperStatement进行解析,得到最终的sql和参数。

1.2.2 sql的执行及结果的封装

Executor调度StatementHandler,ParameterHandler,ResultHandler来生成prepareStatement,及对其设置参数和执行完成与数据库的交互,和对查询结果的封装。

1.3 框架支撑层
1.3.1、事务管理机制

事务管理机制对于ORM框架而言是不可缺少的一部分,事务管理机制的质量也是考量一个ORM框架是否优秀的一个标准。

1.3.2、连接池管理机制

由于创建一个数据库连接所占用的资源比较大, 对于数据吞吐量大和访问量非常大的应用而言,连接池的设计就显得非常重要。

1.3.3、缓存机制


为了提高数据利用率和减小服务器和数据库的压力,MyBatis 会对于一些查询提供会话级别的数据缓存,即将对某一次查询,放置到SqlSession 中,在允许的时间间隔内,对于完全相同的查询,MyBatis 会直接将缓存结果返回给用户,而不用再到数据库中查找。

1.3.4、SQL语句的配置方式

传统的MyBatis 配置SQL 语句方式就是使用XML文件进行配置的,但是这种方式不能很好地支持面向接口编程的理念,为了支持面向接口的编程,MyBatis 引入了Mapper接口的概念,面向接口的引入,对使用注解来配置SQL 语句成为可能,用户只需要在接口上添加必要的注解即可,不用再去配置XML文件了,但是,目前的MyBatis 只是对注解配置SQL 语句提供了有限的支持,某些高级功能还是要依赖XML配置文件配置SQL 语句。

1.4、引导层

引导层是配置和启动MyBatis配置信息的方式。MyBatis 提供两种方式来引导MyBatis :基于XML配置文件的方式和基于Java API 的方式。