02相关讲解
一、简介
MyBatis 本是[apache]的一个开源项目[iBatis], 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。
iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的[持久层]框架。
Mybatis是一个持久层框架。代替JDBC技术完成与数据库交互功能的框架,操作过程中,调用底层封装好的API,代码会被解析成JDBC源码进行功能实现。
二、优点
1、基于SQL语法的,简单易学。
2、jdbc将sql语句写在java语句中,属于硬编码,而框架把SQL语句被封装在配置文件中,方便程序的维护,降低程序的耦合度。
3、程序调试方便。
4、jdbc需要将查询结果映射到实体类中,而框架可以省去这一步骤,查询即得到映射好的对象。
三、mybatis工作原理和流程
image四、关于Mybatis的API
1、SqlSession
SqlSession 中封装了对数据库的操作,如:查询、插入、更新、删除等。
2、SqlSessionFactoryBuilder
SqlSessionFactoryBuilder 用于创建 SqlSessionFacoty,SqlSessionFacoty 一旦创建完成就不需要SqlSessionFactoryBuilder 了,因为 SqlSession 是通过 SqlSessionFactory 生产,所以可以将SqlSessionFactoryBuilder 当成一个工具类使用,最佳使用范围是方法范围即方法体内局部变量。
3、SqlSessionFactory
SqlSessionFactory 是一个接口,接口中定义了 openSession 的不同重载方法,SqlSessionFactory 的最佳使用范围是整个应用运行期间,一旦创建后可以重复使用,通常以单例模式管理 SqlSessionFactory。
public class SqlSessionFactoryUtil {
//首先创建静态成员变量sqlSessionFactory,静态变量被所有的对象所共享。
public static SqlSessionFactory sqlSessionFactory = null;
public static SqlSessionFactory getSqlSessionFactory() {
//如果sqlSessionFactory没有被创建就读取全局配置文件,假如已经被创建过了,就使用已经存在的sqlsessionfactory。
//这样就有了单例模式的效果
if(sqlSessionFactory==null){
String resource = "SqlMapConfig.xml";
try {
Reader reader = Resources.getResourceAsReader(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return sqlSessionFactory;
}
}
五、类别名
1、以上提到,在xml文件中配置SQL语句时,需要使用全限定名,因此非常不便,需要配置类别名,使用typeAliases元素
<configuration>
<typeAliases>
<!-- typeAlias元素
type,全限定名
alias,类别名
-->
<typeAlias alias="User" type="com.neusoft.bean.User"/>
</typeAliases>
<environments default="oracle">
此时查询就可以使用User代替com.bean.User,注意,该元素必须在environments元素以前写,因为xml文件对元素顺序有要求
2、内置别名
java中的类型可以直接使用,无需配置别名,如int,long,String,List,Map
六、核心配置文件
1、defualt属性
现在,让我们来说一说environments元素的default属性,这是一个必须有的属性,由于系统可能配置多个数据源,因此需要指定一个默认数据源,default的值与environment的id相对应,那就走该id所在的数据源
<environments default="oracle">
<environment id="oracle">
</environment>
<environment id="oracle1">
</environment>
</environments>
还有一种情况,若我default的值指定了某一个数据源,是不是就连不了别的数据源?答案是否定的,SqlSessionFactoryBuilder有一个重载的方法能够指定连接其他数据源,如下代码所示
<environments default="oracle">
<environment id="oracle">
</environment>
<environment id="oracle1">
<transactionManager type="jdbc"></transactionManager>
<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="kkk"/>
</dataSource>
</environment>
</environments>
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader,"oracle1");
由于我在oracle1中密码错误,因此登录失败
2、事务管理器transactionManager
type属性,指定事务管理方式,可选值有
jdbc:利用传统jdbc方式进行事务处理,需要手动提交、回滚
MANAGED:让容器进行事务处理,此处容器指Spring容器,若配成此选项,意味着Mybatis不进行事务管理,交给Spring
3、dataSource元素
type属性,指定配置数据源连接的方式,可选择的值如下
POOLED,使用数据库连接池,使用能够存放多个已经生成好的数据库连接的区域,好处在于想拿连接时只需要open一下就可以拿到连接,不涉及对连接的管理
UNPOOLED,不使用数据库连接池,即使用原始连接方式,需要对连接管理
JNDI,使用第三方数据库连接池,POOLED表示使用Mybatis自己的连接池,如果想使用第三方,就选这一项,常见提供数据库连接池的第三方有tomcat自带的连接池,Spring容器
4、mappers
将应用中所有SQL映射文件配置到核心配置文件中,目的是加载核心配置文件时能够加载SQL映射文件,xml文件与以往java文件不同,java文件编译成字节码后,其他方法就可以调用其中的方法,想用xml文件必须加载
5、其他元素
如settings,可以用来优化配置,最多可以连几个连接,或同时最多可以执行几个SQL语句,几乎不常用,而且真正开发时也不需要你去做