1.单独使用MyBatis
单独使用MyBatis,不结合其他框架,主要步骤是:
1.创建SqlSessionFactory对象
创建方法是通过SqlSessionFactoryBuilder这个类从mybatis的XML配置文件,或者porperties,或者URL获取相关数据库的配置信息。
2.从sqlSessionFactory获取SqlSession。
3.使用SqlSession提供的API,对数据库进行增删改查,以及事务管理。
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对象。
<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
<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对象,执行之后,自动提交事务和关闭会话。
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反射原理