版权声明:本文为博主原创文章,未经博主允许不得转载。 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);//调用归还方法,将连接归还到连接池里面去
}
}
}