分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.youkuaiyun.com/jiangjunshow
也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!
<!-- @page { margin: 0.79in } P { margin-bottom: 0.08in } -->
在MyBatis文档中,提到SqlSessionFactory最好在程序中只被创建一次。建议使用Singleton或者Spring、Guice等dependencyinjection框架。
Spring中使用MyBatis完全可以采用Spring-mybatis,无须考虑factory的生命周期。
本文考虑自己实现Singleton机制。选用之前我的Singleton文章中提到的第四种Singleton实现方案,lazyloading模式。
大体思路:
实现一个Holder类,该类是Singleton的,将SqlSessionFactory作为该类的成员变量。Holder类的构造函数只会被调用一次,并且会将SqlSessionFactory实例化。以后每次调用Holder.getFactory()方法就能获得同一个SqlSessionFactory对象。不过由于我还没有找到支持创建时参数的方案,使用另一个Singleton对象Configuration作为依赖。
使用代码如下:
Configuration.getInstance().setXmlPath("com/lifeix/mybatis/xml/dbConfig.xml");
SqlSessionFactorySingletonHolderfactoryHolder = SqlSessionFactorySingletonHolder.getInstance();
SqlSession session =factoryHolder.getFactory().openSession();
Configuration类代码如下:
- public class Configuration {
- private static class SingletonHolder{
- private static final Configuration INSTANCE = new Configuration();
- }
- public static Configuration getInstance(){
- return SingletonHolder.INSTANCE;
- }
- private Configuration() {
- }
- @Getter @Setter
- private String xmlPath;
- }
SqlSessionFactorySingletonHodler类的代码如下:
- import lombok.Getter;
- import java.io.IOException;
- import java.io.Reader;
- import org.apache.ibatis.io.Resources;
- import org.apache.ibatis.session.SqlSessionFactory;
- import org.apache.ibatis.session.SqlSessionFactoryBuilder;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- public class SqlSessionFactorySingletonHolder {
- static class InnerHolder{
- private static final SqlSessionFactorySingletonHolder INSTANCE;
- static {
- try {
- INSTANCE = new SqlSessionFactorySingletonHolder();
- } catch (Exception e) {
- throw new ExceptionInInitializerError(e);
- }
- }
- }
- public static SqlSessionFactorySingletonHolder getInstance(){
- return InnerHolder.INSTANCE;
- }
- private SqlSessionFactorySingletonHolder() throws Exception {
- init();
- }
- private void init() throws Exception {
- log = LoggerFactory.getLogger(getClass());
- Reader reader = null;
- try {
- reader = Resources.getResourceAsReader(Configuration.getInstance().getXmlPath());
- factory = new SqlSessionFactoryBuilder().build(reader);
- }catch(Exception ex){
- log.error(ex.getMessage(),ex);
- throw ex;
- } finally {
- try {
- if(reader != null){
- reader.close();
- }
- } catch (IOException ex) {
- log.error(ex.getMessage(),ex);
- }
- }
- }
- @Getter
- private SqlSessionFactory factory;
- private Logger log;
- }
希望对不使用Spring等框架的人有帮助。
给我老师的人工智能教程打call!http://blog.youkuaiyun.com/jiangjunshow
