Mybatis知识点一

Mybatis知识点一

一 MyBatis基本构成

1.基本组成

SqlSessionFactoryBuilder:会根据配置信息和代码生成SqlSessionFactory.
SqlSessionFactory:依靠工厂生成SqlSession。
SqlSession:既可以发送sql执行并获得返回结果,也可以获取Mapper的接口。
SQL Mapper: 它是 MyBaits 新设计的组件,它是由一个 Java 接口和XMI 文件(或注解)构成的,需要给出对应的 SOL 和映射规则。它负责发送SOL 去执行,并返回结果。
在这里插入图片描述

2.SqlSessionFactoryBuilder

它的任务是创建 SqlSession。 SqlSession 类似于一个JDBC 的Connection 对象。
MyBatis 提供了两种模式去创建 SqlSessionFactory:一种是 XML 配置
方式,这是笔者推荐的方式;另一种是代码的方式。能够使用配置文件的时候,我们要尽量的使用配置文件,这样一方面可以避免硬编码。
mybatis提供两个SqlSessionFactory的实现类DefaultSqlSessionFactory和SqlSessionManager。
在这里插入图片描述
下面展示一些 内联代码片

<?xml version="1.0" encoding= "UTF-8" ?>
<! DOCTYPE configuration
PUBLIC "-//mybatis.org//DID Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--定义别名-->
<typeAliases>
<typeAlias alias="role" type="com.learn.chapter2.po.Role"/>
</typeAliases>
<!--定义数据库信息,默认使用 development 数据库构建环境-->
<environments default-"development">
<environment id-"development">
<!--采用jdbc 事务管理-一>
<transactionManager type="JDBC" />
<!--配置数据库链接信息一->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="rl" value-"jdbc:mysql://localhost:3306/mybatis"/>
<property name-"username" value="root"/>
<property name="password" value="learn"/>
</dataSource>
</environment>
</environments>
<!--定义映射器-->
(mappers>
<mapper resource-"com/learn/chapter2/mapper/roleMapper.xml"/>
</mappers>
</configuration>

3.创建SqlSession

在MyBatis中SqlSession的实现类有两个,分别是 DefaultSqlSession 和 SqISessionManager。
在这里插入图片描述
SqISession 的用途主要有两种。
(1)获取映射器,让映射器通过命名空间和方法名称找到对应的 SOL,发送给数据库执行后返回结果。
(2)直接通过命名信息去执行 SQL 返回结果,这是 iBatis 版本留下的方式。在 SqlSession层我们可以通过 update、insert、 select、delete 等方法,带上SQL 的id来操作在 XMI 中配置好的 SQL,从而完成我们的工作;与此同时它也支持事务,通过 commit、rollback 方法提交或者回滚事务。

4.映射器(Mapper+xml)

映射器的实现方式有两种,一种是通过 XML 文件方式实现,读者应该记得我们在 mybatis-config.xml 文件中己经描述了一个XML 文件,它是用来生成Mapper 的。另外一种就是通过代码方式实现,在 Configuration 里面注册 Mapper 接口(当然里面还需要我
们写入 Java 注解)。

二 生命周期

1.SqlSessionFactoryBuilder 是利用 XML 或者Java 编码获得资源来构建 Sql SessionFactory的,通过它可以构建多个 SessionFactory。它的作用就是一个构建器,一旦我们构建了SqlSessionFactory,它的作用就己经完结,失去了存在的意义,这时我们就应该毫不犹豫的废弃它,将它回收。所以它的生命周期只存在于方法的局部,它的作用就是生成SqlSessionFactory 对象。

2.SqlSessionFactory 的作用是创建 SqlSession,而 SqlSession 就是一个会话,相当于 JDBC中的 Connection 对象。每次应用程序需要访问数据库,我们就要通过 SaISessionFactory 创建 SqlSession,所以 SqlSessionFactory 应该在 MyBatis 应用的整个生命周期中。而如果我们多次创建同一个数据库的 SqISessionFactory,则每次创建 SqISessionFactory 会打开更多的数
据库连接 (Connection)资源,那么连接资源就很快会被耗尽。因此SqISessionFactory 的责任是唯一的,它的责任就是创建 SqlSession, 所以我们果断采用单例模式。如果我们采用多例,那么它对数据库连接的消耗是很大的,不利于我们统一的管理,这样便嗅到了代码的坏味道。所以正确的做法应该是使得每一个数据库只对应一个 SqISessionFactory,管理好
数据库资源的分配,避免过多的 Connection 被消耗。

3.SqlSession 是一个会话,相当于 JDBC 的一个 Connection 对象,它的生命周期应该是在请求数据库处理事务的过程中。它是一个线程不安全的对象,在涉及多线程的时候我们需要特别的当心,操作数据库需要注意其隔离级别,数据库锁等高级特性。此外,每次创建的 SqlSession 都必须及时关闭它,它长期存在就会使数据库连接池的活动资源减少,对系统性能的影响很大。正如前面的代码一样,我们往往通过 finally 语句块保证我们正确的关闭 SqlSession。它存活于一个应用的请求和操作,可以执行多条 SQL,保证事务的一致性。

三 缓存

mybatis在没有配置的默认的情况下,它只开启一级缓存。一级缓存只是相对于同一个 SqlSession 而言。二级缓存是相对于SqlSessionFatory层面,能够提供给各个SqlSession对象共享,二级缓存默认是不开启的。

二级缓存:
(1)映射语句文件中的所有 select 语句将会被缓存。
(2)映射语句文件中的所有 insert、update 和delete 语句会刷新缓存。
(3)缓存会使用默认的 Least Recently Used (LRU,最近最少使用的)算法来收回,根据时间表,比如 No Flush Intermal, (CNFI,没有刷新间隔),缓存不会以任何时间顺序来刷新。
(4)缓存会存储列表集合或对象(无论查询方法返回什么)的1024个引用。
(5)缓存会被视为是read/write(可读/可写)的缓存,意味着对象检索不是共享的,而且可以安全地被调用者修改,不干扰其他调用者或线程所做的潜在修改。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值