Java Web day13

第十章、数据库链接池与DBUtils工具

10.1、数据库连接池

10.1.1 什么是数据库连接池

在这里插入图片描述

10.1.2 DataSource 接口

为了获取数据库连接对象( Connection), JDBC提供了javax.sql.DataSource 接口,它负责与数据库建立连接,并定义了返回值为Connection对象的方法。

10.1.3 DBCP数据源

DBCP是数据库连接池( DataBase Connection Pool )的简称,是Apache组织下的开源连
接池实现,也是Tomcat服务器使用的连接池组件。单独使用DBCP数据源时,需要在应用程序
中导入两个JAR包:

  1. commons-dbcp.jar 包
    commons-dbcp.jar包是DBCP数据源的实现包,包含所有操作数据库连接信息和数据库
    连接池初始化信息的方法,并实现了DataSource接口的getConnection()方法。
  2. commons-pool.jar 包
    commons- pool.jar包是DBCP数据库连接池实现包的依赖包,为commons -dbcp.jar包中的方法提供了支持。可以这么说,没有该依赖包,commons- dbep.jar包中的很多方法就没有办法实现
    在这里插入图片描述

10.2 通过BasicDataSource类直接创建数据源对象

package cn.itcast.chapter10.example;

import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSource;

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.SQLException;


public class example01 {
	public static DataSource ds=null;
	static {
		BasicDataSource bds=new BasicDataSource();
		
		bds.setDriverClassName("com.mysql.jdbc.Driver");
		bds.setUrl("jdbc:mysql://localhost:3306/jdbc");
		bds.setUsername("root");
		bds.setPassword("123456");
		
		bds.setInitialSize(5);
		bds.setMaxActive(10);
		
		ds=bds;
	}
	
	public static void main(String[] args) throws SQLException{
		Connection conn=ds.getConnection();
		DatabaseMetaData metadata=conn.getMetaData();
		
		System.out.println(metadata.getURL());
		System.out.println(metadata.getUserName());
		System.out.println(metadata.getDriverName());
	}
}

运行结果:
在这里插入图片描述

10.1.3 DBCP数据源

package cn.itcast.chapter10.example;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.SQLException;
import java.util.Properties;

import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSourceFactory;

public class example02 {
	public static DataSource ds=null;
	static {
		Properties prop=new Properties();
		
		try {
			InputStream in=new example02().getClass().getClassLoader().getResourceAsStream("dbcp.properties");
			prop.load(in);
			ds=BasicDataSourceFactory.createDataSource(prop);
		}catch(Exception e) {
			e.printStackTrace();
		}
		
	}
	public static void main(String[] args) throws SQLException{
		Connection conn=ds.getConnection();
		DatabaseMetaData metadata=conn.getMetaData();
		
		System.out.println(metadata.getURL());
		System.out.println(metadata.getUserName());
		System.out.println(metadata.getDriverName());
	}
	
}

运行结果:
在这里插入图片描述

10.1.4 C3P0数据源

C3P0是目前最流行的开源数据库连接池之一,它实现了DataSource 数据源接口,支持JDBC2和JDBC3的标准规范,易于扩展并且性能优越,著名的开源框架Hibernate和Spring都支持该数据源。在使用C3PO数据源开发时,需要了解C3P0中DataSource接口的实现类
1.通过ComboPooledDataSource()构造方法创建数据源对象

package cn.itcast.chapter10.example;

import java.beans.PropertyVetoException;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.SQLException;

import javax.sql.DataSource;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class example03 {
	public static DataSource ds=null;
	static {
		ComboPooledDataSource cpds=new ComboPooledDataSource();
		try {
			cpds.setDriverClass("com.mysql.jdbc.Driver");
			cpds.setJdbcUrl("jdbc:mysql://localhost:3306/jdbc");
			cpds.setUser("root");
			cpds.setPassword("123456");
		}catch(PropertyVetoException e) {
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) throws SQLException{
		Connection conn=ds.getConnection();
		DatabaseMetaData metadata=conn.getMetaData();
		
		System.out.println(metadata.getURL());
		System.out.println(metadata.getUserName());
		System.out.println(metadata.getDriverName());
	}
}

在这里插入图片描述
2.通过读取配置文件创建数据源对象
使用ComboPooledDataSource ( String configName )构造方法读取c3p0-config.xml 配置文件,从而创建数据源对象,然后获取数据库连接对象。下面通过一个案例来演示读取配置文件创建数据源对象的使用

package cn.itcast.chapter10.example;

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.SQLException;

import javax.sql.DataSource;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class example04 {
	public static DataSource ds=null;
	static {
		ComboPooledDataSource cpds=new ComboPooledDataSource("dashuju");
		ds=cpds;
	}
	public static void main(String[] args) throws SQLException{
		Connection conn=ds.getConnection();
		DatabaseMetaData metadata=conn.getMetaData();
		
		System.out.println(metadata.getURL());
		System.out.println(metadata.getUserName());
		System.out.println(metadata.getDriverName());
	}
}

请添加图片描述

10.2 DBUtils工具

10.2.1 DBUtils工具介绍

为了更加简单地使用JDBC, Apache组织提供了个DBUtis 工具,它是提作数据库的一 一个组件,实现了对JDBC的简单封装,可以在不影响性能的情况下极大地简化JDBC的编码工作量。DBUtis工具可以在“tp:.mmo.h apache orpromons-oduisindex htm”"下载到,截止到目前它的最新版本为Apache Commons DbUtils 1.6

10.2.2 QueryRunner类

QuerRunner类简化了执行SQL语句的代码,它与ResultHerdler组合在一起就能完成大部分的数据库操作,大大地减少了编码量。

10.2.3 ResultSetHandler接口

ResultSetHandler接口用于处理ResultSet结果集,它可以将结果集中的数据转为不同的形式。根据结果集中数据类型的不同,ResultSetHandler 提供了几种常见的实现类:

BeanHandler:将结果集中的第1行数据封装到一个对应的JavaBean实例中。
BeanL istHandler:将结果集中的每一行数 据都封装到一个对应的JavaBean实例中,并存放到List里。
ScalarHandler:将结果集中某一条记录的其中某一列的数据存储成Object对象。

10.2.4 ResultSetHandler实现类

1.BeanHandler和BeanListHandler
BeanHandler和BeanlistHandler实现类是将结果集中的数据封装到对应的JavaBean实例中,这也是实际开发中最常用的结果集处理方法。
先在数据库中创建一个user表,并添加数据。
创建一个JDBCUtils类编写通用的查询方法

package cn.itcast.chapter10.example;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class JDBCUtils {
	public static Connection getConnection() throws SQLException,ClassNotFoundException{
		Class.forName("com.mysql.jdbc.Driver");
		String url="jdbc:mysql://localhost:3306/jdbc";
		String username="root";
		String password="123456";
		Connection conn=DriverManager.getConnection(url,username,password);
		return conn;
	}
	public static void release(Statement stmt,Connection conn) {
		if(stmt !=null) {
			try {
				stmt.close();
			}catch(SQLException e) {
				e.printStackTrace();
			}
			stmt=null;
		}
		if(conn !=null) {
			try {
				conn.close();
			}catch(SQLException e) {
				e.printStackTrace();
			}
			conn=null;
		}
	}
	public static void release(ResultSet rs,Statement stmt,Connection conn) {
		if(rs !=null) {
			try {
				rs.close();
			}catch(SQLException e) {
				e.printStackTrace();
			}
			rs=null;
		}
	}
}

创建一个user类用来封装user对象

package cn.itcast.chapter10.example;

public class User {
	private int id;
	private String name;
	private String password;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	
}

创建一个ResultSetTest1类用来演示对结果集的处理

package cn.itcast.chapter10.example;

import org.apache.commons.dbutils.handlers.BeanHandler;

public class ResultSetTest1 {
	public static void testBeanHandler() {
		BaseDao basedao=new BaseDao();
		
		String sql="select * from user where id=?";
		User user=(User) basedao.query(sql, new BeanHandler(User.class), 3);
		
		System.out.println("name:"+user.getName());
	}
	public static void main(String[] args) {
		testBeanHandler();
	}
}

在这里插入图片描述

package cn.itcast.chapter10.example;

import java.util.ArrayList;

import org.apache.commons.dbutils.handlers.BeanListHandler;

public class ResultSetTest2 {
	public static void testBeanHandler() {
		BaseDao basedao=new BaseDao();
		
		String sql="select * from user";
		ArrayList<User> list=(ArrayList<User>) basedao.query(sql,new BeanListHandler(User.class));
		
		for(User user2:list) {
			System.out.println("name:"+user2.getName());
		}
	}
	public static void main(String[] args) {
		testBeanHandler();
	}
}	

2020080605012

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值