1.单独使用MyBatis
单独使用MyBatis,不结合其他框架,主要步骤是:
1.创建SqlSessionFactory对象
创建方法是通过SqlSessionFactoryBuilder这个类从mybatis的XML配置文件,或者porperties,或者URL获取相关数据库的配置信息。
2.从sqlSessionFactory获取SqlSession。
3.使用SqlSession提供的API,对数据库进行增删改查,以及事务管理。
1
2
3
4
5
6
7
|
String resource =
"org/mybatis/example/mybatis-config.xml"
;
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory =
new
SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession();
session.insert(
"BlogMapper.selectBlog"
,
101
);
session.commit();
sesssion.close();
|
2.结合Spring框架使用MyBatis
MyBatis + Spring的使用方式,一般是在Spring的配置文件里,配置以下内容:
1.数据源(DataSource)
2.SqlSessionFactoryBean,实现FactoryBean接口,通过注入DataSource对象,以及MyBatis的相关配置信息,返回SQLSessionFactory对象。
1
2
3
4
5
6
|
<
jee:jndi-lookup
id="dataSource" jndi-name="jdbc/mysql"></
jee:jndi-lookup
>
<
bean
id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<
property
name="dataSource" ref="dataSource" />
<
property
name="configLocation" value="classpath:mybatis/mybatis-config.xml"></
property
>
<
property
name="mapperLocations" value="classpath:mybatis/*/*.xml"></
property
>
</
bean
>
|
加入以上的配置信息就可以Dao类里,直接引用sqlSessionFactory这个对象,对数据库进行操作(跟1的代码一样)。
如果Dao的代码写多了,这时候会发现,每次的数据库操作,步骤都是要先
①获取SqlSession对象->②调用数据库操作的方法->③提交事务->④关闭SqlSession
其中①③④这三个步骤会一直环绕在每个Dao的方法里。
这时候会这么想,能否提供这样一个功能,在调用方法之前自动获取SqlSession对象,在调用方法之后自动提交事务和关闭SqlSession对象。这样①③④这样重复的代码就可以剔除了,整个Dao类的代码也变得更加简洁。
3.SqlSessionTemplate的应用
上面提到的,在调用方法之前和调用方法之后,各执行一些操作。这种技术一下子就联想到就是AOP编程方式。
AOP是Spring的第二个核心功能,所以自然它也提供了这样的是一个实现类,就是SqlSessionTemplate
1
2
3
4
5
6
7
8
9
10
11
|
<
jee:jndi-lookup
id="dataSource" jndi-name="jdbc/mysql"></
jee:jndi-lookup
>
<
bean
id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<
property
name="dataSource" ref="dataSource" />
<
property
name="configLocation" value="classpath:mybatis/mybatis-config.xml"></
property
>
<
property
name="mapperLocations" value="classpath:mybatis/*/*.xml"></
property
>
</
bean
>
<
bean
id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<
constructor-arg
ref="sqlSessionFactory" />
</
bean
>
|
引入SqlSessionTemplate这个类,在写Dao时,每个方法,在执行之前,自动获取SqlSession对象,执行之后,自动提交事务和关闭会话。
1
2
3
|
public
Object save(String str, Object obj)
throws
Exception {
return
sqlSessionTemplate.insert(str, obj);
}
|
现在代码一下子变得更简洁了,只剩下数据操作的方法。
4.SqlSessionTemplate原理解析思路
为什么SqlSessionTemplate能够在每个方法,在执行之前,自动获取SqlSession对象,执行之后,自动提交事务和关闭会话。
要知道这个原理,其实相当于要了解Spring AOP原理。
要了解Spring AOP原理,就必须知道Java技术里,动态代理的原理。
Java的动态代理主要是涉及到JDK里java.lang.reflect包下的InvocationHandler接口和Proxy类里创建代理对象的方法。
SqlSessionTemplate的源码解析
SqlSessionTemplate的构造方法里,创建了一个SqlSession的代理对象。
在这个代理对象,每次SQLSession的方法被调用,都执行以下操作。
上面代码涉及到的知识点比较多,要完全理解,需要掌握下面列出的几点。
5.知识点归纳
1.MyBatis中的SqlSessionFactory和SqlSession
2.Spring中的SqlSessionFactoryBean和SqlSessionTemplate
3.Spring AOP原理
4.Java动态代理原理
5.Java反射原理