自定义连接池JDBC

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_41264055/article/details/83513266
package cn.itheima.jdbc.utils;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;
import java.util.ResourceBundle;

public class JDBCUtils_V3 {

	private static String driver;
	private static String url;
	private static String username;
	private static String password;
	
	
	/**
	 *
	 *静态代码块加载配置文件信息
	 *
	 **/
	
	static{
		
		
		try {
			//1.通过当前类获取类加载器
			ClassLoader classLoader = JDBCUtils_V3.class.getClassLoader();
			
			//2.通过类加载器的方法获得一个输入流
			InputStream is = classLoader.getResourceAsStream("db.properties");
			
			//3.创建一个properties对象
			Properties props = new Properties();
			
			//4.加载输入流
			props.load(is);
			
			//5.获取相关参数的值
			driver = props.getProperty("driver");
			url = props.getProperty("url");
			username = props.getProperty("username");
			password = props.getProperty("password");
			
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	
	
	
/*使用properties配置文件
开发中获得链接的4个参数(驱动、URL、用户名、密码)通常都存在配置文件中,方便后期维护,
程序如果需要更换数据库,只需要修改配置文件即可。
通常情况下,我们习惯使用properties文件,此文件我们将做如下要求:
1,文件位置:任意,建议在src下
2,文件名称:任意,扩展名为properties
3,文件内容:一行一组数据,格式是“key = value”.
	a)  key命名定义:如果是多个单词,习惯使用点分隔。
		例如:jdbc.driver
	b)  value值不支持中文,如果需要使用非英文字符,将进行unicode转化。*/
	
	
	public static Connection getConnection(){
		
		/*获取连接方法*/
		Connection conn =null;
		
		try {
		//这里有缺陷,一旦更换数据库,这里就得换源码
			Class.forName(driver);
			
			//获取连接
			conn = DriverManager.getConnection(url,username,password);
			
		} catch( Exception e) {
			e.printStackTrace();
	
		}
		return conn;
	}
	
	/*释放资源*/
	public static void release(Connection conn,PreparedStatement pstmt, ResultSet rs){
		if(rs != null){
			try {
				rs.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		
		if(pstmt != null){
			try {
				pstmt.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		
		if(conn != null){
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		
	}
	
}

dp.propertise

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/web08?useUnicode=true&characterEncoding-utf8
username=root
password=wsq
package cn.itheima.jdbc.DataSource;

import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.SQLFeatureNotSupportedException;
import java.util.LinkedList;
import java.util.logging.Logger;

import javax.sql.DataSource;

import cn.itheima.jdbc.utils.JDBCUtils_V3;

public class MydataSource implements DataSource{
	/**
	 * 获取连接
	 * */
	//1.创建一个容器,用于存储Connection对象
	private static LinkedList<Connection> pool =  new LinkedList<Connection>();
	
	//2.创建5个连接放到容器中去
	static{
		for (int i = 0; i < 5; i++) {
			Connection conn = JDBCUtils_V3.getConnection();	//拿到5个连接
			pool.add(conn);							//将连接放到连接池pool里面
		}
	}
	
	
	
	
	/**
	 * 重写获取连接的方法 
	 * */	
	@Override
	public Connection getConnection() throws SQLException {
		Connection conn = null;
		//3.使用前拿到数据先进行判断
		if(pool.size()==0){			//如果池子里面没有连接了
			//4.池子里面没有,就要再创建5个连接
			for (int i = 0; i < 5; i++) {
				conn = JDBCUtils_V3.getConnection();	//拿到5个连接
				pool.add(conn);							//将连接放到连接池pool里面
			}
		}
		//5.从池子里面获取一个连接对象Connection
		conn = pool.remove(0);	//从池子pool里面移除第一个连接,移除的还是一个Connection对象,返回值还是Connection
		
		return conn;//将移除的一个连接给返回出去,就代表拿到一个连接
	}
	
	
	
	/**
	 * 归还连接对象到连接池中去
	 * */
	public void backConnection(Connection conn){//归还方法
		pool.add(conn);		//用完之后,将连接填到连接池里面去
	}
	
	

	@Override
	public PrintWriter getLogWriter() throws SQLException {
		// TODO Auto-generated method stub
		return null;
	}
 
	@Override
	public void setLogWriter(PrintWriter out) throws SQLException {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void setLoginTimeout(int seconds) throws SQLException {
		// TODO Auto-generated method stub
		
	}

	@Override
	public int getLoginTimeout() throws SQLException {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public Logger getParentLogger() throws SQLFeatureNotSupportedException {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public <T> T unwrap(Class<T> iface) throws SQLException {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public boolean isWrapperFor(Class<?> iface) throws SQLException {
		// TODO Auto-generated method stub
		return false;
	}


	@Override
	public Connection getConnection(String username, String password) throws SQLException {
		// TODO Auto-generated method stub
		return null;
	}			//实现
	
		
}

package cn.itheima.jdbc.test;

import java.sql.Connection;
import java.sql.PreparedStatement;

import javax.management.RuntimeErrorException;

import org.junit.Test;

import cn.itheima.jdbc.DataSource.MydataSource;

public class TestMyDataSource {

	@Test
	public void testAddUser(){//方法是为了添加一个用户
		Connection conn = null;
		PreparedStatement pstmt = null;
		//1.创建自定义连接池对象
		MydataSource dataSource = new MydataSource();//new一个对象,创建自定义连接池对象
		try {
			//2.从池子里获取连接
			conn = dataSource.getConnection();	//从连接池里获取连接
			String sql = "insert into tbl_user values(null,?,?)";//编写sql语句
			pstmt = conn.prepareStatement(sql);//执行
			pstmt.setString(1, "吕布 ");
			pstmt.setString(2, "貂蝉 ");
		
			int rows = pstmt.executeUpdate();//执行操作,根据rows来判断是否执行成功
			if(rows>0){//说明有更新操作
				System.out.println("添加成功!!");
			}else{
				System.out.println("添加失败!!");
			}
			
		} catch (Exception e) {
			throw new RuntimeException(e);
		}finally{//释放资源
			dataSource.backConnection(conn);//调用归还方法,将连接归还到连接池里面去
		}
	}
}

猜你喜欢

转载自blog.csdn.net/qq_41264055/article/details/83513266
今日推荐