Mybatis学习(3)第一个Mybatis程序的说明与解释

在上篇博客当中只是对第一个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。

  1. JDBC:支持使用JDBC的事务管理机制。也就是通过Connection的commit()方法提交,通过rollback()方法回滚。但默认情况下,Mybatis将自动提交功能关闭了,改为了手动提交。
  2. MANEGED:由容器来管理事务的整个生命周期,比如Spring容器。

C:<dataSource/>标签

该标签用于配置Mybatis使用的数据源类型与数据库链接基本属性,常见的有UNPOOLED、POOLED、JDNI等。

  1. UNPOOLED:不使用连接池。也就是每次请求都会为其创建一个DB连接,使用完毕后,会马上将此链接关闭。
  2. POOLED:使用数据库连接池来维护连接
  3. JNDI:数据源可以定义到应用的外部,通过JNDI容器获取数据库连接。

但是由于有了jdbc.properties文件,所以将里面的属性进行了更改

说明四:指定映射文件

指定映射文件的方式有很多种。但所有的方式,都是指定在<mapppers/>标签当中的。接下来一一列出

A:<mapper:resource=""/>指定映射文件

若映射文件只有一个,可以直接使用如下的形式:

若映射文件有多个,则可以使用如下形式

B:<mapper url=""/>指定映射文件

这样做的好处是,可以将映射文件放在本地或者是网络中的任意位置,通过url地址2即可直接访问。但通常映射文件是存放在当前应用中的。所以该方式不常用。

C:<mapper class=""/>指定映射文件

class属性为dao接口的全类名。

该方式的使用需要满足以下几个要求:、

  1. 映射文件名字要与Dao接口名字相同
  2. 映射文件要与接口在同一包中,也就是mapper.xml和IStudent都要在com.fdd.dao中
  3. 映射文件中<mapper/>的namespace属性值为Dao的全类名

D:<package name=""/>指定映射文件

当映射文件比较多的时候,也可以采用如下形式。其中package的name属性指定映射文件所存放地包。

但是这种方式的使用需要满足以下几个条件:

  1. dao使用mapper动态代理实现
  2. 映射文件名要与dao接口名称相同
  3. 映射文件要与接口在同一个包内
  4. 映射文件中<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()方法。

  1. openSession(true):创建一个有自动提交功能的SqlSession
  2. openSession(false):创建一个非自动提交功能的SqlSession,需要手动提交啊
  3. openSession():和openSession(false)一样。

2.4 SqlSession接口

sqlsession接口对象用于执行持久化操作(增删改查)。一个SqwlSession对应着一次数据库会话,一次会话以SqlSession对象的创建开始的,以SqlSession对象的关闭结束。

SqlSession接口对象是线程不安全的,所以每次数据库会话结束前,需要马上调用其close方法,将其关闭。再次进行会话时候,再次创建。而在关闭时候会判断当前的SqlSession是否被提交,若没有被提交,则会执行回滚后关闭,若一被提交,则直接关闭。所以,SqlSession无需手工回滚。常用的SqlSession接口常用的方法有:

OK,对第一个Mybatis的程序的说明就介绍这么多。下一篇介绍对单表的增删改查操作:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值