我是靠谱客的博主 舒适小蝴蝶,最近开发中收集的这篇文章主要介绍关于itcast-tools工具包的详解.(二.jdbc)getDataSource()getConnection();关于数据库事务不太了解,附上大佬的链接二.TxQueryRunner类1.batch2.query3.update,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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 变量t1,t1可以为每一个引用该类的线程保存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

最后

以上就是舒适小蝴蝶为你收集整理的关于itcast-tools工具包的详解.(二.jdbc)getDataSource()getConnection();关于数据库事务不太了解,附上大佬的链接二.TxQueryRunner类1.batch2.query3.update的全部内容,希望文章能够帮你解决关于itcast-tools工具包的详解.(二.jdbc)getDataSource()getConnection();关于数据库事务不太了解,附上大佬的链接二.TxQueryRunner类1.batch2.query3.update所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(37)

评论列表共有 0 条评论

立即
投稿
返回
顶部