二、MyBatis体系结构源码解读

1、MyBatis源码正确姿势

  • 技术本质

技术本质

  • 从宏观到微观

宏观理解

(1) mybatis数据源的源码解析 xml(environment) > java Environment

>org.apache.ibatis.session.SqlSessionFactoryBuilder.build(java.io.InputStream)
 >org.apache.ibatis.builder.xml.XmlConfigBuilder
  >org.apache.ibatis.builder.xml.XmlConfigBuilder.parseConfiguration
   >org.apache.ibatis.builder.xml.XmlConfigBuilder.environmentsElement
    >org.apache.ibatis.builder.xml.XmlConfigBuilder.dataSourceElement
     >org.apache.ibatis.datasource.DataSourceFactory.getDataSource

mybatis获取数据源

(2) mybatis sql源码解析 sql > MappedStatement

>org.apache.ibatis.builder.xml.XmlConfigBuilder.mapperElement
  >org.apache.ibatis.builder.xml.XmlMapperBuilder
   >org.apache.ibatis.builder.xml.XmlMapperBuilder.parse
    >org.apache.ibatis.builder.xml.XmlMapperBuilder.buildStatementFoemContext
     >org.apache.ibatis.builder.xml.XmlStatementBuilder
      >org.apache.ibatis.builder.xml.XmlStatementBuilder.parseStatementNode

mybatis获取sql

(3) mybatis 如何操作数据库 SimpleExecutor 执行器

>org.apache.ibatis.session.defaults.DefaultSqlSessionFactory.openSession
  >org.apache.ibatis.session.defaults.DefaultSqlSessionFactory.openSessionFormDataSource
   >org.apache.ibatis.session.Configuration.newExcetor
    >org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne
     >org.apache.ibatis.session.Configuration.getMappedStatement
      >org.apache.ibatis.executor.BaseExecutor.queryFormDatabase
       >org.apache.ibatis.executor.SimpleExecutor.doQuery

① SimpleExecutor是Mybatis执行Mapper语句时默认使用的Executor。它提供最基本的Mapper语句执行功能,没有过多的封装的

② ReuseExecutor,顾名思义,是可以重用的Executor。它重用的是Statement对象,它会在内部利用一个Map把创建的Statement都缓存起来,每次在执行一条SQL语句时,它都会去判断之前是否存在基于该SQL缓存的Statement对象,存在而且之前缓存的Statement对象对应的Connection还没有关闭的时候就继续用之前的Statement对象,否则将创建一个新的Statement对象,并将其缓存起来。因为每一个新的SqlSession都有一个新的Executor对象,所以我们缓存在ReuseExecutor上的Statement的作用域是同一个SqlSession。

③ BatchExecutor的设计主要是用于做批量更新操作的。其底层会调用Statement的executeBatch()方法实现批量操作。

MyBatis处理流程

2、MyBatis整体架构理解

  • myBatis 体系结构图

mybatis体系结构图

  • myBatis 应用知识结构图

myBatis应用知识结构图

  • config上下文配置

(1) 属性配置

<properties resource="app.properties">
    <property name="jdbc.driver" value="com.mysql.jdbc.Driver"/>
</properties> 

三种设置方式:

①构建sessionFactory 时传递 (优先级:高)

②基于resource 属性加载 或 url 加载 (优先级:中)

③基于 属性设置 (优先级:低)

(2) 全局参数设置

<settings>
   <setting name="mapUnderscoreToCamelCase" value="true" /> 
</settings> 

具体参考:http://www.mybatis.org/mybatis-3/zh/configuration.html#settings

(3) 环境配置

<environments default="development">
    <environment id="development"> 
        <transactionManager type="JDBC" /> 
        <dataSource type="POOLED" > 
            <property name="driver" value="${jdbc.driver}" /> 
            <property name="url" value="${jdbc.url}" /> 
            <property name="username" value="${jdbc.username}" />
            <property name="password" value="${jdbc.password}" />
        </dataSource>
    </environment>
</environments> 

事物管理器:JDBC|MANAGED

(4) 数据源

unpooled 普通连接,每次获取时都会重新建立一个新的连接.属性下如下:

• driver :数据库驱动类

• url: URL地址

• username:用户名

• password :登录数据库的密码

pooled: 连接池模式,所有连接从连接池当中获取,由连接池来来进行连接的建立与回收关于等操作,除支持unpooled属性外还支持属性如下:

• poolMaximumActiveConnections : 最大活跃数,默认值:10

• poolMaximumIdleConnections :最大空闲连接数

• poolMaximumCheckoutTime :获取连接超时等待最大(checked out)时间,默认值:20000 毫秒

• poolTimeToWait : 单次获取连接 最大等待时间 默认:20000 毫秒(即 20 秒)。

• poolMaximumLocalBadConnectionTolerance 获取连接重试次数 默认:3

• poolPingQuery 用于检测连接是否断开的测试 语句

• poolPingEnabled 是否通过执行poolPingQuery 语句做检测,默认值:false。

• poolPingConnectionsNotUsedFor 连接检测间隔时间 ,默认60000。

(5) typeAliases 别名配置

<typeAliases>
    <typeAlias type="com.niuh.dao"/>
    <typeAlias type="com.niuh.dao.UserInfo" alias="UserInfo"/>
</typeAliases>

(6) mappers 文件引入

<mappers>
    <mapper resource="userInfo.xml" />
    <package name="com.niuh.dao"/>
</mappers>

基于 mapper 引入指定资源文件: resource| url |class
基于package 引入:扫描指定包路径当下的url

  • mapper 映谢文件配置

(1) mapper 常用元素

select – 映射查询语
insert – 映射插入语句
update – 映射更新语句
sql – 可被其他语句引用的可重用语句块
delete – 映射删除语句
resultMap 用来描述如何从数据库结果集中来加载对象
cache – 给定命名空间的缓存配置
cache-ref – 其他命名空间缓存配置的引用

(2) <select>查询标签
其表示一个查询语句映谢,其简单示例如下:
示例

<select id="selectUser" resultType="com.niuh.mybatis.test.UserInfo"> 
    select * from user_info where id = #{id}
</select>

其支持属性如下:

<select
id="selectUser" // statement id
parameterType="int" // 参数类型
resultType="hashmap"// 返回结果类别
resultMap="personResultMap" // 返回结果映射
flushCache="false" // 
useCache="true"
timeout="10000"
fetchSize="256"
statementType="PREPARED">

参数的引用的办法

#{id, mode=in, jdbcType=INT, jdbcTypeName=MY_TYPE}

(3) 示例 标签

<insert id="addUser"
parameterType="com.niuh.mybatis.test.UuserInfo">
INSERT INTO user_info (user_name,nick_name,password) VALUES
(#{userName},#{nickName},#{password})
</insert>
<update id="updateUser" 
parameterType="com.niuh.mybatis.test.UuserInfo" >
update user_info set user_name=#{userName} where id=#{id}
</update>
<delete id="deleteUser" parameterType="int">
DELETE from user_info where id=#{id}
</delete>

属性说明:

<insert
id="insertUuser"
parameterType="com.niuh.mybatis.test.UuserInfo"
flushCache="true"
statementType="PREPARED"
keyProperty=""
keyColumn=""
useGeneratedKeys=""
timeout="20">
<update
id="updateUuser"
parameterType="com.niuh.mybatis.test.UuserInfo"
flushCache="true"
statementType="PREPARED"
timeout="20">
<delete
id="deleteUuser"
parameterType="com.niuh.mybatis.test.UuserInfo"
flushCache="true"
statementType="PREPARED"
timeout="20">

(4) 标签
将重复的sql 语句定文为一个字段

<sql id="base_colume"> id,user_name,nick_name</sql>

可通过 进行引入 如:

<include refid="base_colume"/>

(5) 标签
resultMap 是myBatis 对象的映射

  • 动态SQL配置

标签
trim (where, set) 标签
foreach 标签

4、数据库访问层的4种实现方案对比

  • jdbc 执行时序图

  • JdbcTemplate 执行时序图

  • hibernate 执行流程

  • myBatis 执行流程

总结:

myBatis 的定位

myBatis 专注于sql 本身,其为sql 映谢而非完整的ORM,需要自己编写sql 语句,这是其优点也是缺点。优点是:优化方便,可更好利用sql编写经验。缺点是当数据修改之后调整麻烦耗费时间长.

试用场景:适用于对性能要求较高,有大批量的查询修改,并且业务实现没有过多依懒数据关系模型,比如:电商、O2O等互联网项目。

互联网项目对DAO层的要求:

1、对数据库的访问更新纯粹

2、尽可能不要使用数据库做运算

3、SQL语句可以针对性的优化(减少查询字段、查条件排序例 、查询条件尽可能命中索引)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis 是一个开源的持久化框架,它主要用于将 Java 对象映射到关系型数据库中的 SQL 语句。它提供了将数据访问逻辑与 SQL 语句解耦的功能,使得开发人员可以更加专注于业务逻辑的实现。 MyBatis体系结构主要包括以下几个核心组件: 1. SqlSessionFactory:这是 MyBatis 的顶层接口,它是整个 MyBatis 的关键接口之一。SqlSessionFactory 对象是由 SqlSessionFactoryBuilder 构建的,用于创建 SqlSession 对象。 2. SqlSession:SqlSession 是 MyBatis 提供的一个用于执行 SQL 语句并管理事务的接口。通过 SqlSession,开发人员可以执行 CRUD 操作,并且可以通过一些方法来控制事务的提交和回滚。 3. Mapper 接口:Mapper 接口是定义与数据库交互的方法接口,它通常与一个 XML 文件相对应,XML 文件中定义了该接口的实现类所需的 SQL 语句。Mapper 接口可以通过 MyBatis 提供的动态代理机制来实现自动创建代理对象。 4. XML 映射文件:XML 映射文件是 MyBatis 的核心配置之一,它主要用于定义 Mapper 接口的实现类所需的 SQL 语句。在 XML 文件中,我们可以通过定义 SELECT、INSERT、UPDATE、DELETE 等操作来与数据库进行交互。 5. Configuration:Configuration 是 MyBatis 的全局配置类,它用于加载和管理 MyBatis 的配置信息。通过 Configuration,我们可以配置数据库连接信息、Mapper 接口与 XML 文件的映射关系等。 总的来说,MyBatis体系结构是基于 SqlSessionFactory、SqlSession、Mapper 接口和 XML 映射文件的,通过这些核心组件的配合使用,可以实现方便的数据库操作和事务管理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值