关于itcast-tools工具包的详解.(二.jdbc)

jdbc文件夹下有两个类,分别是JdbcUtils类和TxQueryRunner类;

一.JdbcUtils类

package cn.itcast.jdbc;

import java.sql.Connection;
import java.sql.SQLException;

import javax.sql.DataSource;

import com.mchange.v2.c3p0.ComboPooledDataSource;

/**
 * 使用本类的方法,必须提供c3p0-copnfig.xml文件
 * @author qdmmy6
 */
public class JdbcUtils {
	// 饿汉式
    //创建c3p0数据源对象
	private static DataSource ds = new ComboPooledDataSource();
	
	/**
	 * 它为null表示没有事务
	 * 它不为null表示有事务
	 * 当开启事务时,需要给它赋值
	 * 当结束事务时,需要给它赋值为null
	 * 并且在开启事务时,让dao的多个方法共享这个Connection
	 */
	private static ThreadLocal<Connection> tl = new ThreadLocal<Connection>();
	
	public static DataSource getDataSource() {
		return ds;
	}
	
	/**
	 * dao使用本方法来获取连接
	 * @return
	 * @throws SQLException
	 */
	public static Connection getConnection() throws SQLException {
		/*
		 * 如果有事务,返回当前事务的con
		 * 如果没有事务,通过连接池返回新的con
		 */
		Connection con = tl.get();//获取当前线程的事务连接
		if(con != null) return con;
		return ds.getConnection();
	}
	
	/**
	 * 开启事务
	 * @throws SQLException 
	 */
	public static void beginTransaction() throws SQLException {
		Connection con = tl.get();//获取当前线程的事务连接
		if(con != null) throw new SQLException("已经开启了事务,不能重复开启!");
		con = ds.getConnection();//给con赋值,表示开启了事务
		con.setAutoCommit(false);//设置为手动提交
		tl.set(con);//把当前事务连接放到tl中
	}
	
	/**
	 * 提交事务
	 * @throws SQLException 
	 */
	public static void commitTransaction() throws SQLException {
		Connection con = tl.get();//获取当前线程的事务连接
		if(con == null) throw new SQLException("没有事务不能提交!");
		con.commit();//提交事务
		con.close();//关闭连接
		con = null;//表示事务结束!
		tl.remove();
	}
	
	/**
	 * 回滚事务
	 * @throws SQLException 
	 */
	public static void rollbackTransaction() throws SQLException {
		Connection con = tl.get();//获取当前线程的事务连接
		if(con == null) throw new SQLException("没有事务不能回滚!");
		con.rollback();
		con.close();
		con = null;
		tl.remove();
	}
	
	/**
	 * 释放Connection
	 * @param con
	 * @throws SQLException 
	 */
	public static void releaseConnection(Connection connection) throws SQLException {
		Connection con = tl.get();//获取当前线程的事务连接
		if(connection != con) {//如果参数连接,与当前事务连接不同,说明这个连接不是当前事务,可以关闭!
			if(connection != null &&!connection.isClosed()) {//如果参数连接没有关闭,关闭之!
				connection.close();
			}
		}
	}
}

ThreadLocal<Connection> tl = new ThreadLocal<Connection>();

声明了一个 ThreadLocal 变量t1t1可以为每一个引用该类的线程保存Connection类型的对象。 当多个线程都是用这个类时, 每个线程可以将自己的Connection对象,保存在t1中,各个线程中的Connection对象不会交叉混乱,当各个线程要使用自己的Connection时,只需要要调用 t1.Get(),返回的必然是当前线程保存的那个Connection。
总而言之,ThreadLocal就是 线程 局部 变量,同时它是泛型的,<>中的类型,就是局部变量的类型。使用Set方法来设置局部变量的值,使用Get方法来获取局部变量的值。-----引用自百度知道

getDataSource()

用于获取创建的数据源对象;

getConnection();

用于获取当前线程的事务连接;如果没有就通过连接池接续获取;使用此方法的作用是防止重复获取数据连接

关于数据库事务不太了解,附上大佬的链接

https://www.cnblogs.com/Alandre/p/5545801.html

看完了还是不太明白;

二.TxQueryRunner类

package cn.itcast.jdbc;

import java.sql.Connection;
import java.sql.SQLException;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.ResultSetHandler;

public class TxQueryRunner extends QueryRunner {

	@Override
		//批处理操作;
	public int[] batch(String sql, Object[][] params) throws SQLException {
		Connection con = JdbcUtils.getConnection();
		int[] result = super.batch(con, sql, params);
		JdbcUtils.releaseConnection(con);
		return result;
	}
//用于执行查询操作;
	@Override
	public <T> T query(String sql, ResultSetHandler<T> rsh, Object... params)
			throws SQLException {
		Connection con = JdbcUtils.getConnection();
		T result = super.query(con, sql, rsh, params);
		JdbcUtils.releaseConnection(con);
		return result;
	}
	
	@Override
	public <T> T query(String sql, ResultSetHandler<T> rsh) throws SQLException {
		Connection con = JdbcUtils.getConnection();
		T result = super.query(con, sql, rsh);
		JdbcUtils.releaseConnection(con);
		return result;
	}
	//更新;
	@Override
	public int update(String sql) throws SQLException {
		Connection con = JdbcUtils.getConnection();
		int result = super.update(con, sql);
		JdbcUtils.releaseConnection(con);
		return result;
	}

	@Override
	public int update(String sql, Object param) throws SQLException {
		Connection con = JdbcUtils.getConnection();
		int result = super.update(con, sql, param);
		JdbcUtils.releaseConnection(con);
		return result;
	}

	@Override
	public int update(String sql, Object... params) throws SQLException {
		Connection con = JdbcUtils.getConnection();
		int result = super.update(con, sql, params);
		JdbcUtils.releaseConnection(con);
		return result;
	}
}

TxQueryRunner类继承了QueryRunner类,在该类中有有三大类操作方法,分别是batch(批处理),query(查询),update(插入更新和删除操作);

1.batch

批处理操作,对sql语句进行批量操作,如批量删除和批量修改;

JdbcUtils.releaseConnection(con);//如果当前连接跟事务有关就不关闭数据库,如果无关就关闭数据库

2.query

进行查询操作,分为有参和无参数两种情况;

3.update

该方法用来执行插入,删除,和更新操作;

分为,无参,有参,和动态参数;

动态参数

Object… params于是百度查了查。

这是JDK1.5新增语法,新特性,动态参数或者是可变参数的意思。 
(1)使用…将参数声明成可变长参数。 
(2)可变长参数必须是最后一个参数。 
(3)可变参数同时可以跟固定的参数混合使用,但是一个方法的参数中不能同时拥有2种类型的可变参数。

附上大佬关于QueryRunner的链接:http://www.cnblogs.com/wang-meng/p/5525389.html

猜你喜欢

转载自blog.csdn.net/g666m666d666/article/details/89279628