我们都知道在javaee实际开发中,分为3层结构来开发,controller,service和dao
专注于为中小企业提供成都网站设计、网站建设服务,电脑端+手机端+微信端的三站合一,更高效的管理,为中小企业遂昌免费做网站提供优质的服务。我们立足成都,凝聚了一批互联网行业人才,有力地推动了上千家企业的稳健成长,帮助中小企业通过网站建设实现规模扩充和转变。
那么为什么事物要存在于业务层中,事物是通过connection对象操作的,使用原始jdbc链接数据库的链接也是connection操作的,connection是在到是怎么传递到dao的呢?
这里讲解两种方式
第一种通过形式参数的方式
第二种通过ThreadLocal的方式
ThreadLocal的底层是个map,该map的key是固定的,当前线程。value可以让我们存入任意对象
public class JdbcUtils {
// 成员变量,创建了C3P0的连接池(连接池中已经存在连接了...)
private static final ComboPooledDataSource DATASOURCE = new ComboPooledDataSource();
// 把Connection绑定到当前的线程中
private static ThreadLocal tl = new ThreadLocal();
/**
* 返回的是C3P0的连接池
* @return
*/
public static DataSource getDataSource(){
return DATASOURCE;
}
/**
* 获取连接,返回连接
* @return
* @throws SQLException
*/
public static Connection getConnection() throws SQLException{
Connection conn = null;
// 从tl中获取
conn = tl.get();
if(conn == null){
// 从连接池中获取连接
conn = DATASOURCE.getConnection();
// 非常关键,把连接存入到tl中
tl.set(conn);
}
return conn;
}
/**
* 开启事务
* @throws SQLException
*/
public static void beginTransaction() throws SQLException{
// 调用getConnection()
Connection conn = getConnection();
conn.setAutoCommit(false);
}
/**
* 提交事务
* @throws SQLException
*/
public static void commitTransaction() throws SQLException{
// 调用getConnection()
Connection conn = getConnection();
conn.commit();
}
/**
* 回滚事务
* @throws SQLException
*/
public static void rollBackTransaction() throws SQLException{
// 调用getConnection()
Connection conn = getConnection();
conn.rollback();
}
/**
* 归还连接
* @throws SQLException
*/
public static void closeConn() throws SQLException{
// 调用getConnection()
Connection conn = getConnection();
conn.close();
tl.remove();
}
/**
* 释放资源
* @param stmt
* @param conn
*/
public static void release(Statement stmt,Connection conn){
if(stmt != null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn != null){
try {
// 已经变成了归还了...
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
/**
* 释放资源
* @param stmt
* @param conn
*/
public static void release(ResultSet rs,Statement stmt,Connection conn){
if(rs != null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(stmt != null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn != null){
try {
// 把close()给修改了,原来是销毁连接,现在让方法变成归还连接。
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}