1.导入jar包 druid-1.2.8.jar
2.定义配置文件
3.加载配置文件
4.获取数据库连接池对象
5.获取连接
注意:2、3、4整体又叫做创建数据源(连接池)
1.导入jar包 druid-1.2.8.jar
2.创建数据源 (获取连接池对象)
//1 获得连接池(创建数据源)
//1.1 核心类
DruidDataSource dataSource = new DruidDataSource();
//1.2 基本4项
// 1) 驱动
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
// 2) 连接
dataSource.setUrl("jdbc:mysql://localhost:3306/day1?useSSL=false&characterEncoding=utf-8&serverTimezone=Asia/Shanghai");
// 3) 用户
dataSource.setUsername("root");
// 4) 密码
dataSource.setPassword("123456");
//1.3 特殊项【可选】
// 1) 初始化大小
dataSource.setInitialSize(5);
// 2) 最大值活动数
dataSource.setMaxActive(10);
// 3) 最小空闲数
dataSource.setMinIdle(2);
3.获取连接
//2 从连接池中获得连接
long l = System.currentTimeMillis();
for (int i = 0; i < 5000; i++) {
DruidPooledConnection conn = dataSource.getConnection();
System.out.println(conn);
//用完了,返还到连接池中
conn.close();
}
long l1 = System.currentTimeMillis();
System.out.println("执行时间:"+(l1-l));
3.封装使用连接池
1.由于每次使用连接池我们都会去创建数据源,重复且费事儿,那么我们可以创建一个工具类
把创建数据源放到静态代码块中即可,类加载时执行一次就可以了
//以便后续的后续的获取连接池方法中,能拿到这个创建的数据源
public static DruidDataSource dataSource=null;
static{
//1.获取数据源
dataSource = new DruidDataSource();
//1.2 基本4项
// 1) 驱动
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
// 2) 连接
dataSource.setUrl("jdbc:mysql://localhost:3306/day1?useSSL=false&characterEncoding=utf-8&serverTimezone=Asia/Shanghai");
// 3) 用户
dataSource.setUsername("root");
// 4) 密码
dataSource.setPassword("123456");
//1.3 特殊项【可选】
// 1) 初始化大小
dataSource.setInitialSize(5);
// 2) 最大值活动数
dataSource.setMaxActive(10);
// 3) 最小空闲数
dataSource.setMinIdle(2);
}
2.封装利用上面数据源获得连接的过程
//将获得连接也封装进一个方法,写成静态以后直接类名调用
public static Connection getConnection() {
try {
//2.获得连接
DruidPooledConnection conn = dataSource.getConnection();
return conn;
} catch (SQLException e) {
e.printStackTrace();
return null;
}
}
3.将资源释放也封装进一个方法
这里需要注意:我们调用该方法释放资源时,释放的Sql执行对象:PreparedStatement ps,得是我们利用连接池获得的连接connection 创建的PreparedStatement ps,如果我们利用连接创建的是Sql执行对象为:Statement statement,那么有两种解决办法:
1.不能使用该方法释放资源,自己手动释放
2.封装释放方法时,将释放的对象类型改成Statement 即可(方法中:Statement +statement(为形参,随便命名,只要最后我们用该方法时传的实参为Statement类型的即可))
//将资源的释放也封装进方法中
public static void close(PreparedStatement ps,Connection connection){
if (ps !=null){
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (connection !=null){
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
Fengconnectionpool就是我们写的用来封装各部分的工具类,需要用其中的方法,直接调
public class Test {
public static void main(String[] args) {
Connection connection=null;
PreparedStatement ps=null;
try {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入用户名:");
String username1 = scanner.next();
System.out.println("请输入用户密码:");
String pwd1 = scanner.next();
//从我们写的工具类中,调用封装的获得连接池的方法
connection = Fengconnectionpool.getConnection();
if (connection !=null) System.out.println("数据库连接成功");
String sql="select *from usermessage where name=? and password=?";
ps = connection.prepareStatement(sql);
ps.setString(1,username1);
ps.setString(2,pwd1);
ResultSet resultSet = ps.executeQuery();
if (resultSet.next()){
System.out.println("登录成功");
}else {
System.out.println("登录失败");
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
//使用自己写的工具类,中封装的方法释放资源
Fengconnectionpool.close(ps,connection);
}
}
}