mybatis的架构组成


Mybatis的架构图

各组成部分:
1. SqlMapConfig.xml,此文件作为mybatis的全局配置文件,配置了mybatis的数据库等运行环境信息。
2. mapper.xml文件即sql映射文件,文件中配置了操作数据库的sql语句.此文件需要在SqlMapConfig.xml中加载。
3. SqlSessionFactoryBuilder(构造器)
      SqlSessionFactoryBuilder用于根据配置信息或者代码生成SqlSessionFacoty(工厂接口),SqlSessionFacoty一旦创建完成就不需要SqlSessionFactoryBuilder了,因为SqlSession是通过SqlSessionFactory生产,所以可以将SqlSessionFactoryBuilder当成一个工具类使用,最佳使用范围是方法范围即方法体内局部变量。

生命周期:方法的内部,SqlSession一旦创建SqlSessionFactoryBuilder就失去意义.

4.SqlSessionFactory(单例模式)
     SqlSessionFactory是一个接口,接口中定义了openSession的不同重载方法,SqlSessionFactory的最佳使用范围是整个应用运行期间,一旦创建后可以重复使用,通常以单例模式管理SqlSessionFactory。,用于生成sqlSession(回话);
生命周期:mybatis应用的整个生命周期.

5.SqlSession---线程不安全的.
    SqlSession是一个面向用户的接口, sqlSession中定义了数据库操作方法。
    sqlSession内部的数据区域本身就是一级缓存,是通过map来存储的。每个线程都应该有它自己的SqlSession实例。SqlSession的实例不能共享使用,它也是线程不安全的。因此最佳的范围是请求或方法范围。绝对不能将SqlSession实例的引用放在一个类的静态字段或实例字段中。
打开一个 SqlSession;使用完毕就要关闭它。通常把这个关闭操作放到 finally 块中以确保每次都能执行关闭。如下:
SqlSession session = sqlSessionFactory.openSession();
try {
// do work
} finally {
  session.close();
}

生命周期: 在请求数据库处理事务的过程中.因此最佳的范围是请求或方法范围


创建SqlSessionFactory:

mybatis 创建了两种方式去创建SqlSessionFactory:
第一种:xml的配置方式:推荐方式
第二种:代码构建方式.
      能够使用配置文件的时候,我们尽量使用配置文件,这样一方面可以避免硬编码(hard code),另一方面可以方便日后配置人员的修改,避免重复编译代码;
     在mybatis中Configuration的类的全限定名为org.apache,ibatis.session.Configuration.它在Mybatis中将以一个Configuration类对象的形式存在,而且这个对象将存在整个mybatis应用的生命期中.以便重复读取和利用.

Configuration类对象保存着我们配置在mybatis中的信息.

在Mybatis中提供了两个SqlSessionFactory的实现类,DefaultSqlSessinFactory和SqlSessionManager.

不过目前SQLSessionManager目前没有使用,Mybatis中目前使用的是DefaultSqlSessionFactory.

1. 使用xml的配置方式构建
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--自定义别名-->
<!--在SqlMapConfig.xml中配置: <typeAliases>
<!-- 单个别名定义 之后所有需要配置user全包名的地方,都可以只写user-->
<typeAlias alias="user" type="cn.itcast.mybatis.po.User"/>

<!--定义数据库信息,默认使用development数据库构建环境-->
<!-- 和spring整合后 environments配置将废除-->
<environments default="development">
<environment id="development">
<!-- 使用jdbc事务管理-->
<transactionManager type="JDBC" />
<!-- 数据库连接-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url"
value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments>
<!-- 引入的mapper映射文件:提供SQL和SQL对POJO的映射规则定义 -->
<mappers>
<mapper resource="cn/itcast/mybatis/dao/UserDao.xml"/>
<!-- 必须遵循动态代理mapper开发规则 -->
<!-- 批量别名定义,扫描整个包下的类,别名为类名(首字母大写或小写都可以)
所有自定义的实体类都可以写实体类的名称即可 -->
<mapper class="cn.itcast.mybatis.dao.UserDao"/>
<package name="cn.itcast.mybatis.po"/>
</mappers>
</configuration>

之后我们用代码实现创建SqlSessionFactory如下
String resource="mybatis-config.xml";
InputStream inputStream=Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory=null;
sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream;

这里我们创建了一个xml的输入流,用sqlSessionFactoryBuilder读取xml的信息来为我们创建一个sqlSessionFactory的对象.

总结:Mybatis的解析程序会将mybatis-config.xml文件配置的信息解析到Configuration类对象里面.然后领sqlSessionFactoryBuilder读取这个对象为我们创建SqlSessionFacory.

2. 使用代码方式构建--一般在需要加入自己的特性的时候才会用到

比如:数据可配置信息需要加密的时候;

步骤:
1. 初始化一个数据库连接池
2.定义JDBC的数据库事物管理方式
3. 用数据库连接池和事务管理方式创建一个数据库云翔环境,并命名为development
4. 创建了一个Configuration类对象,并将数据库运行环境注册给他.
5. 注册一个role的别名
6. 加入一个映射器
7. 用SqlSessionFactoryBuilder通过Configuration对象创建SqlSessionFactory

代码方式:
//构建数据库连接池
PoodDataSource dataSource=new PooledDataSource();
dataSource.setDriver("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/mybatis");
dataSource.setUsername("root");
dataSource.setPassword("root");
//构造数据库事务方式
TransationFactory transactionFactor=new JdbcTransactionFactory();
//创建数据库的运行环境
Environment environment=
new Environment("development",transactionFactory,dataSource);
//构建configuration对象
Configuration configuration=new Configuration(environment);
//注册一个mybatis上下文别名
configuration.getTypeAliasRegistry().registerAlias("role",Role.class);
//加入一个映射器
configuration.addMapper(RoleMapper.class);
//使用SqlSessionFactoryBuilder 构建SqlSessionFactory
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(configuration);
return sqlSessionFactory;

创建SqlSession:

sqlSession是一个借口类,类似于公司前台,扮演门面的作用,真正起作用的是executor接口.类似工程师.
我们构建了SqlSessionFactory,然后生成mybatis的门面接口sqlSession.
SqlSession接口类似于一个JDBC中的Connection接口对象,我们需要保证每次用完都要关闭它,所以正确的做法是把关闭SqlSession接口的代码写在finally语句中保证每次都会关闭SqlSession.让连接资源归还给资源库,如果我们笔记是关闭资源,数据库的连接资源很快就被耗尽,系统很快因为数据库资源的匮乏而瘫痪.
SqlSession sqlSession=null;
try{
sqlSession=sqlSessionFactory.openSession();
sqlSession.commit();
}catch(Exception ex{
System.out.print(ex.getMessage());
sqlSession.rollback();//回滚
}finally{
if(sqSession!=null){
sqlSession.close();
}
}

SqlSession的用途:
1. 获取映射器,让映射器通过命名空间和方法名找到对应的SQL.发送给数据库,执行后返回结果.
2) 直接通过命名信息去执行SQL返回结果,这个iBatis版本留下的方式,




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值