力所能及之关于Mybatis SqlSession工具类

小狼最近在做mybatis的CURD,发现一个小狼不能接受的问题,当然,小狼是比较懒的,见不得冗余代码

每一个CURD操作,小狼都得写一遍下面的代码,一口老血吐出来了...

SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
			InputStream config = Resources
					.getResourceAsStream("mybatities-config.xml");
			SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder
					.build(config);
			SqlSession sqlSession = sqlSessionFactory.openSession();

为了小狼后半生幸福,决定了,写一个工具类

public class GetSqlSession {

	private static SqlSessionFactory sqlSessionFactory;

	private static ThreadLocal<SqlSession> tl = new ThreadLocal<SqlSession>();

	synchronized public static SqlSessionFactory getSqlSessionFactory() {

		try {
			InputStream isRef=GetSqlSession.class.getResourceAsStream("/DBMysql.properties");
			Properties properties=new Properties();
			properties.load(isRef);
			//Log.getLog().info("properties="+properties);
			if (sqlSessionFactory == null) {
				String resource = "mybatis-config.xml";
				InputStream inputStream = Resources
						.getResourceAsStream(resource);
				sqlSessionFactory = new SqlSessionFactoryBuilder()
						.build(inputStream,properties);
			} else {
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return sqlSessionFactory;
	}

	public static SqlSession getSqlSession() {
		SqlSession sqlSession = tl.get();
		if (sqlSession == null) {
			sqlSession = getSqlSessionFactory()
					.openSession();
			tl.set(sqlSession);
		} else {

		}
		//System.out.println("获得的sqlSession对象的hashCode:" + sqlSession.hashCode());
		return sqlSession;
	}

	public static void commit() {
		if (tl.get() != null) {
			tl.get().commit();
			tl.get().close();
			tl.set(null);
			//System.out.println("提交了");
		}
	}

	public static void rollback() {
		if (tl.get() != null) {
			tl.get().rollback();
			tl.get().close();
			tl.set(null);
			//System.out.println("回滚了");
		}
	}
}

小狼上一次说了,sqlsessionFactory的生命周期是整个项目运行期间,他都会存在。但是我们采用单例懒汉模式,比较人性化。每一个线程都得使用一个sqlsession,并且sqlsession是不能共享的,它是线程不安全的,所以这就涉及到多线程的问题。我们采用ThreadLocal<SqlSession>,为每一个线程创建一个sqlsession副本,副本跟副本之间互相不影响。这样我们获得sqlsession对象的时候,直接这么写

SqlSession sqlSession = GetSqlSession.getSqlSession();

大家可能发现一个问题,小狼这里写了一句

synchronized public static SqlSessionFactory getSqlSessionFactory() {

try {

InputStream isRef=GetSqlSession.class.getResourceAsStream("/DBMysql.properties");

Properties properties=new Properties();

properties.load(isRef);

//Log.getLog().info("properties="+properties);

if (sqlSessionFactory == null) {

String resource = "mybatis-config.xml";

InputStream inputStream = Resources

.getResourceAsStream(resource);

sqlSessionFactory = new SqlSessionFactoryBuilder()

.build(inputStream,properties);

} else {

}

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

return sqlSessionFactory;

}

这个小狼可以解释一下,小狼用的property,属性配置mybatis-config.xml,里面的参数,所以得读出property的文件内容,并与已经读出的mybatis-config.xml文件内容匹配,得到值,注入

写完了这么多,一口老血又咽回去了。。。

时间: 2024-10-11 22:43:03

力所能及之关于Mybatis SqlSession工具类的相关文章

MyBatis批处理工具类MyBatisBatchHelper.java

该工具类使用mybatis的会话来手动提交事务,从而对批量sql进行控制.事务提交,多条sql执行结果会被更新到数据库,出现异常则回滚. 测试采用的表为oracle数据库scott下的dept表和salgrade表 MyBatisBatchHelper.java package com.alphajuns.util; import org.apache.ibatis.session.ExecutorType; import org.apache.ibatis.session.SqlSession

MyBatis工厂工具类 MyBatisUtils

import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; public class MyBatisUtils { private static SqlSessionFa

SSM-MyBatis-10:Mybatis中SqlSession的getMapper()和简单的工具类MyBatisUtils

------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- getMapper的作用,获取到接口,直接通过点的方式调用方法,以免直接手打的方式写错方法名,(强类型的方式) 例子: IBookDAO mapper = session.getMapper(IBookDAO.class); List<Book> list = mapper.findAllBook(); 那个工具类,主要是获取SqlSession对象,写法 package cn.dawn.util; im

mybatis的基本配置:实体类、配置文件、映射文件、工具类 、mapper接口

搭建项目 一:lib(关于框架的jar包和数据库驱动的jar包) 1,第一步:先把mybatis的核心类库放进lib里 2,第二步:导入第三方类库(在lib里).mybatis的核心类库在运行时还依赖一些第三方类库 3,第三步:导入连接数据库驱动jar包 二:创建mybatis的配置文件 1,第一步:先创建实体包,对照着表结构把实体类写出来.封装好就是写get,set方法------不像hibernate,可以自动的将表名字段名与实体类相对应,不用自己手写实体类与映射文件 2,第二步:创建xml

Mybatis工具类

import java.io.IOException; import java.io.Reader; import java.sql.Connection; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.Sq

沫沫金-Mybatis工具类,生成dao层xml、mapper文件和实体类entity层

Mybatis Generator工具使用起来,总感觉不太灵活加上初次环境配置麻烦,特编写java文件 单文件不依赖,直接生成.源码如下(此为Oracle数据库版) package net.icarefx.booking.util; import java.io.BufferedWriter; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.Outpu

MyBatisUtil.java.工具类,连接数据库库

可以在每一个项目里直接使用 1 package com.yh.mb.dao; 2 3 import java.io.Reader; 4 5 import org.apache.ibatis.io.Resources; 6 import org.apache.ibatis.session.SqlSession; 7 import org.apache.ibatis.session.SqlSessionFactory; 8 import org.apache.ibatis.session.SqlSe

关于MyBatis sqlSession的一点整理

原文地址:关于MyBatis sqlSession的一点整理 工作中,需要学习一下MyBatis sqlSession的产生过程,翻看了mybatis-spring的源码,阅读了一些mybatis的相关doc,对mybatis sqlSession有了一些认知和理解,这里简单的总结和整理一下. 首先, 通过翻阅源码,我们来整理一下mybatis进行持久化操作时重要的几个类: SqlSessionFactoryBuilder:build方法创建SqlSessionFactory实例. SqlSes

Mybatis 代码生成工具

Mybatis 应用程序,需要大量的配置文件,对于一个成百上千的数据库表来说,完全手工配置,这是一个很恐怖的工作量. 所以 Mybatis 官方也推出了一个 Mybatis 代码生成工具的 jar 包. 首先要下载mybatis-generator-core-1.3.2-bundle.zip 文件,之后解压有两个文件夹   docs 是帮助文档目录: lib 目录是jar 包,需要 mybatis-generator-core-1.3.2.jar,将它拷贝到我们刚刚创建的 Java工程中:  按