JDBC(4)----------数据库连接池(dbcp连接)

1、JDBC:是提供用来执行SQL语句的java API.步骤如下:加载驱动程序、与数据库建立连接、发送SQL语句、处理结果。

2、JTA:事务有提交和回滚两个概念。提交:所有的操作步骤都被完整的执行后,称为事务被提交。回滚:由于某一操作步骤执行失败,导致所有步骤都没有被提交,则事务必须回滚,即回到事务执行前的状态。

代码如下:

 

package henu.utils;
import java.sql.*;
public class DbUtil {
	/**
	 * 声明连接数据库的信息,例如数据库URL、用户名、密码等
	 */
	
	private static String url = "jdbc:mysql://localhost:3306/user";
	private static String user = "root";
	private static String password = "123";
	
	/**
	 * 声明相关对象
	 */
	private static Statement stmt = null;
	private static ResultSet rs = null;
	private static Connection conn = null;
	
	/**
	 * 创建数据库链接
	 */
	
	public static synchronized Connection getConnect() {
		try {
			//加载驱动
			Class.forName("com.mysql.jdbc.Driver");
			conn = DriverManager.getConnection(url, user, password);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return conn;
	}
	
	
	/**
	 * 执行insert、update、delete语句
	 * 
	 * 返回int类型
	 */
	
	public static int executeUpdate(String sql) {
		int result = 0;
		
		try {
			stmt = getConnect().createStatement();
			result = stmt.executeUpdate(sql);
			
		} catch (SQLException e) {
			
			e.printStackTrace();
		}
		return result;
	}
	/**
	 * 执行select语句
	 * 
	 * 返回查询ResultSet的结果集
	 */
	public static ResultSet executeQuery(String sql) {
		
		try {
			stmt = getConnect().createStatement();
			rs = stmt.executeQuery(sql);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return rs;
	}
	
	/**
	 * 执行动态的Sql语句
	 * @param sql含有参数的动态Sql语句
	 * @result 返回PreparedStatement对象
	 */
	
	public static PreparedStatement executePrepareStatement(String sql) {
		PreparedStatement ps = null;
		try {
			ps = getConnect().prepareStatement(sql);
			
		} catch (Exception e) {
			
			e.printStackTrace();
		}
		
		return ps;
	}
	
	/**
	 * 事务回滚
	 */
	
	public static void rollback() {
		try {
			getConnect().rollback();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	/**
	 * 关闭数据库
	 */
	
	public static void close() {
		
			try {
				if(rs!=null)
					rs.close();
				if(stmt!=null)
					rs.close();
				if(conn!=null)
					conn.close();
				
			} catch (SQLException e) {
				e.printStackTrace();
			}
	}
	
	/**
	 * 连接Sql Server 2008
	 * 需要下载sqljdbc.jar
	 * Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
	 * url = "jdbc:sqlserver://localhost:1433;DatabaseName = dbName"
	 * 
	 * 
	 * 连接Oracle数据库
	 * 加载驱动程序
	 * DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
	 * url = "jdbc:oracle:oci8:@user"
	 *或者
	 *Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
	 *url = "jdbc:oracle:thin:@localhost:1512:user" 
	 */
	
}

 

 

 

3、数据库连接池:在一个虚拟的池中预先建好一定数量的Connection对象等待客户端的连接,当客户端连接时则分配一个空闲的Connection对象给客户端连接数据库;当这个客户端请求结束时则将Connection对象归还给池中,用来等待下一个客户端的访问。独立于Web服务器的数据库连接池:dbcp方式

需要commons-dbcp-xxx.jar和commons-pool-xxx.jar

 

package henu.util;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSource;
import org.apache.commons.dbcp.BasicDataSourceFactory;
/**
 * DBCP
 * @suqichang
 * 2017-10-20
 */
public class DbUtil {
	
	private static BasicDataSource dataSource = null;

	public static void init(){
		if (dataSource != null){
			try{
				dataSource.close();
			}catch(Exception e){
				e.printStackTrace();
			}
			dataSource = null;
		}
		
		try {
			Properties p = new Properties();
			//硬编码方式
			p.setProperty("driverClassName", "com.mysql.jdbc.Driver");
			p.setProperty("url", "jdbc:mysql://localhost:3306/webdisk");
			p.setProperty("username", "root");
			p.setProperty("password", "123456");
			p.setProperty("maxActive", "30");
			p.setProperty("maxIdle", "10");
			//读取配置文件
			//p.load(DbUtil.class.getClass().getResourceAsStream("/db.properties"));
			dataSource = (BasicDataSource)BasicDataSourceFactory.createDataSource(p);
		} catch(Exception e) {
			e.printStackTrace();
		}
	}
	
	public static DataSource getDataSource()
	{
		if(dataSource == null) {
			init();
		}
		return dataSource;
	}
	
	public static synchronized Connection getConnection() {
		Connection con = null;
		if(dataSource == null) {
			init();
		}
		if(dataSource!=null) {
			try {
				con = dataSource.getConnection();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return con;
	}
}

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值