在上篇博客当中只是对第一个Mybatis的创建步骤进行演示,这篇博客将主要针对于第一个Mybatis程序的进一步说明和运行的原理。
还是先看一下我的项目结构
- com.test.beans存放实体类Student
- com.test.dao存放接口IStudent与映射文件mapper,当然还有接口的实现
- com.test.mytest存放了测试类
- com.test.util存放了工具类,主要是获取sqlSession的方法
1、主配置文件的说明
说明一:先看主配置文件
需要说明的是,这里面有一个jdbc.properties的文件,这个文件的主要作用是,对数据库连接的四要素单独提取出来,这样当我们的数据库进行改变时候,我们只需要修改这个文档里面的值,而不用修改mybatis.xml中的值。
先看一下这里面的代码:
jdbc.driver= com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/test1
jdbc.user=root
jdbc.password=root
这时候mybatis.xml数据库的值进行修改:首先需要把数据库连接的四要素文件也就是jdbc.properties引入进来
<?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>
<!-- 数据库的配置文件 -->
<properties resource="jdbc.properties"/>
<!-- 别名的定义 -->
<typeAliases>
<!-- 将保内的所有类的名字作为别名 -->
<package name="com.test.beans"/>
<!-- <typeAlias type="com.test.beans.Student" alias="student"/> -->
</typeAliases>
<!-- 配置运行环境 -->
<environments default="testEM">
<environment id="testEM">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.user}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!-- 注册映射文件 -->
<mappers>
<mapper resource="com/test/dao/mapper.xml"/>
</mappers>
</configuration>
说明二:别名
由上面的代码可以看到多了如下代码:
<!-- 别名的定义 -->
<typeAliases>
<!-- 将保内的所有类的名字作为别名 -->
<package name="com.test.beans"/>
<!-- <typeAlias type="com.test.beans.Student" alias="student"/> -->
</typeAliases>
这些代码的作用是设置别名这样做有什么好处呢?这样做的好处是会将该包中所有实体类的简单类名指定为别名,
当然我们也可以采用注释的这样一种方式:
<!-- <typeAlias type="com.test.beans.Student" alias="student"/> -->
不过这样会比较繁琐。从形式上我们就可以看到,上面的方式比较简单。他的唯一好处是我们可以一个一个的指定别名。
除了自定义的类型的别名之外,Mybatis还提供了内置的类型别名:
说明三:环境
<!-- 配置运行环境 -->
<environments default="testEM">
<environment id="testEM">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.user}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
A:<environments/>标签
说明了这里面可以包含很多个运行环境,但是其default属性指出了当前Mybatis运行时所使用的环境:
B:<transactionManager/>
该标签用于指定Mybatis所使用的事务管理器。Mybatis支持两种事务管理器:JDBC和MANAGED。
- JDBC:支持使用JDBC的事务管理机制。也就是通过Connection的commit()方法提交,通过rollback()方法回滚。但默认情况下,Mybatis将自动提交功能关闭了,改为了手动提交。
- MANEGED:由容器来管理事务的整个生命周期,比如Spring容器。
C:<dataSource/>标签
该标签用于配置Mybatis使用的数据源类型与数据库链接基本属性,常见的有UNPOOLED、POOLED、JDNI等。
- UNPOOLED:不使用连接池。也就是每次请求都会为其创建一个DB连接,使用完毕后,会马上将此链接关闭。
- POOLED:使用数据库连接池来维护连接
- JNDI:数据源可以定义到应用的外部,通过JNDI容器获取数据库连接。
但是由于有了jdbc.properties文件,所以将里面的属性进行了更改
说明四:指定映射文件
指定映射文件的方式有很多种。但所有的方式,都是指定在<mapppers/>标签当中的。接下来一一列出
A:<mapper:resource=""/>指定映射文件
若映射文件只有一个,可以直接使用如下的形式:
若映射文件有多个,则可以使用如下形式
B:<mapper url=""/>指定映射文件
这样做的好处是,可以将映射文件放在本地或者是网络中的任意位置,通过url地址2即可直接访问。但通常映射文件是存放在当前应用中的。所以该方式不常用。
C:<mapper class=""/>指定映射文件
class属性为dao接口的全类名。
该方式的使用需要满足以下几个要求:、
- 映射文件名字要与Dao接口名字相同
- 映射文件要与接口在同一包中,也就是mapper.xml和IStudent都要在com.fdd.dao中
- 映射文件中<mapper/>的namespace属性值为Dao的全类名
D:<package name=""/>指定映射文件
当映射文件比较多的时候,也可以采用如下形式。其中package的name属性指定映射文件所存放地包。
但是这种方式的使用需要满足以下几个条件:
- dao使用mapper动态代理实现
- 映射文件名要与dao接口名称相同
- 映射文件要与接口在同一个包内
- 映射文件中<mapper/>的namespace属性值为dao接口的全类名
2、从源码角度分析
在文章一开头中,我给出了一张图,这张图是项目图,里面有一个工具类叫做MybatisUtil的工具类。这个类的主要作用就是获取sqlSession。看一看代码:
public class MybatisUtil {
//单例模式创建sqlSession.要设置成静态的
public static SqlSession getSqlSession(){
SqlSessionFactory factory = null;
try {
InputStream is = Resources.getResourceAsStream("mybatis.xml");
if(factory==null){
factory=new SqlSessionFactoryBuilder().build(is);
}
SqlSession sqlSession = factory.openSession();
return sqlSession;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
我们先看一下这个工具类:
dao中是需要sqlSession来操作DB的,而SqlSession对象的创建是需要SqlSessionFactory工厂来创建的,而SqlSessionFactory对象是通过SqlSessionFactoryBuilder的build方法加载主配置文件的输入流来创建的。
如果我们不使用这个工具类,那么执行插入操作的MyTest的代码应该如下:
我们创建工具类的目的是:为了降低代码之间的耦合度,减少大量重复代码的编写。所以,我们要分析是如何操作DB的就要从头说起。
2.1 resource类
resource类,顾名思义就是资源,用于读取资源文件。其中很多方法通过加载并解析资源文件,返回不同类型的IO数据流对象,
2.2 SqlSessionFactoryBuilder类
SqlSessionFactory的创建,需要使用SqlSessionFactoryBuilder的build方法,由于,SqlSessionFactoryBuilder对象在创建工厂对象之后,就完成了其历史使命,即可被销毁,一般将该SqlSessionFactoryBuilder对象创建一个方法内的局部对象,方法结束,对象销毁。
2.3 SqlSessionFactory接口
SqlSessionFactory接口对象是一个重量级对象(系统开销比较大的对象),是线程安全的,所以2,一个应用只需要一个该对象即可。可以创建SqlSession需要使用SqlSessionFactory接口的openSession()方法。
- openSession(true):创建一个有自动提交功能的SqlSession
- openSession(false):创建一个非自动提交功能的SqlSession,需要手动提交啊
- openSession():和openSession(false)一样。
2.4 SqlSession接口
sqlsession接口对象用于执行持久化操作(增删改查)。一个SqwlSession对应着一次数据库会话,一次会话以SqlSession对象的创建开始的,以SqlSession对象的关闭结束。
SqlSession接口对象是线程不安全的,所以每次数据库会话结束前,需要马上调用其close方法,将其关闭。再次进行会话时候,再次创建。而在关闭时候会判断当前的SqlSession是否被提交,若没有被提交,则会执行回滚后关闭,若一被提交,则直接关闭。所以,SqlSession无需手工回滚。常用的SqlSession接口常用的方法有:
OK,对第一个Mybatis的程序的说明就介绍这么多。下一篇介绍对单表的增删改查操作: