C3P0连接池
创建C3P0连接池的工具类
* 连接的规范接口:
* javax.sql.DataSource接口
* 接口的实现类对象
* ComboPooledDataSource
* 成员位置创建ComboPooledDataSource对象
* 使用静态代码块给ComboPooledDataSource设置4大数据量连接信息
* 创建一个静态方法返回Connection对象
* 创建一个静态方法释放资源
public class C3P0Utils {
//成员位置创建ComboPooledDataSource对象
private static ComboPooledDataSource dataSource = new ComboPooledDataSource();
//使用静态代码块给ComboPooledDataSource设置4大数据量连接信息
static{
try {
dataSource.setDriverClass("com.mysql.jdbc.Driver");
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/mybase4");
dataSource.setUser("root");
dataSource.setPassword("root");
} catch (Exception e) {
throw new RuntimeException("设置连接信息失败!");
}
}
//创建一个静态方法返回Connection对象
public static Connection getConnection(){
try {
return dataSource.getConnection();
} catch (SQLException e) {
throw new RuntimeException("获取数据库连接信息失败!");
}
}
//定义一个释放资源的方法
public static void close(ResultSet rs,Statement stat,Connection conn){
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(stat !=null){
try {
stat.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
创建读取XML配置文件的C3P0工具类
public class C3P0UtilsReadXML {
//成员位置创建ComboPooledDataSource对象
private static ComboPooledDataSource dataSource = new ComboPooledDataSource();
//使用静态代码块给ComboPooledDataSource设置4大数据量连接信息
/*static{
try {
dataSource.setDriverClass("com.mysql.jdbc.Driver");
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/mybase4");
dataSource.setUser("root");
dataSource.setPassword("root");
} catch (Exception e) {
throw new RuntimeException("设置连接信息失败!");
}
}*/
//创建一个返回ComboPooledDataSource的方法
public static DataSource getDataSource(){
return dataSource;
}
//创建一个静态方法返回Connection对象
public static Connection getConnection(){
try {
return dataSource.getConnection();
} catch (SQLException e) {
throw new RuntimeException("获取数据库连接信息失败!");
}
}
//定义一个释放资源的方法
public static void close(ResultSet rs,Statement stat,Connection conn){
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(stat !=null){
try {
stat.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
DBCP连接池
创建DBCP连接池的工具类
* 连接的规范接口:
* javax.sql.DataSource接口
* 接口的实现类对象
* BasicDataSource
* 重写getConnection方法
public class DBCPUtils {
//创建连接池的实现类对象
private static BasicDataSource dataSource = new BasicDataSource();
//设置连接数据库的4大变量,使用BasicDataSource中的set方法设置
static{
//设置注册的驱动信息
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
//设置Url
dataSource.setUrl("jdbc:mysql://localhost:3306/mybase4");
//设置用户名
dataSource.setUsername("root");
//设置密码
dataSource.setPassword("root");
//可选信息
//dataSource.setInitialSize(100);
//dataSource.setMaxActive(1000);
}
//创建获取数据库连接对象的方法
public static Connection getConnection(){
try {
return dataSource.getConnection();
} catch (SQLException e) {
throw new RuntimeException("获取数据库连接对象失败");
}
}
//定义一个释放资源的方法
public static void close(ResultSet rs,Statement stat,Connection conn){
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(stat !=null){
try {
stat.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
读取配置文件的方式
/*
* 创建DBCP连接池工具类
* 使用读取配置文件的方式
* DBCP中有一个工厂类BasicDataSourceFactory
* 工厂类中有一个静态方法
* static DataSource createDataSource(Properties prop)
* 此方法返回的就是DataSource接口的实现类对象BasicDataSource
*
* 创建Propertis集合+IO技术读取配置文件
* 把配置文件传入BasicDataSourceFactory静态方法createDataSource中
*/
public class DBCPUtilsReadConfig {
//创建DataSource变量
private static DataSource dataSource;
static{
try {
//创建Propertis集合+IO技术读取配置文件
//使用类加载器,扫描包下的文件
InputStream is = DBCPUtilsReadConfig.class.getClassLoader()
.getResourceAsStream("dbcpconfig.properties");
//创建Propertis集合
Properties prop = new Properties();
prop.load(is);
//把配置文件传入BasicDataSourceFactory静态方法createDataSource中
dataSource = BasicDataSourceFactory.createDataSource(prop);
} catch (Exception e) {
throw new RuntimeException("读取配置文件失败");
}
}
//创建获取数据库连接对象的方法
public static Connection getConnection(){
try {
return dataSource.getConnection();
} catch (SQLException e) {
throw new RuntimeException("获取数据库连接对象失败");
}
}
//定义一个释放资源的方法
public static void close(ResultSet rs,Statement stat,Connection conn){
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(stat !=null){
try {
stat.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
* 使用DBUtils工具类对数据库表进行增删改查
* DBUtils工具类作用:简化JDBC的开发(6步)
*
* DBUtils有3个核心类
* 1.QueryRunner:使用QueryRunner中的方法对数据库进行增删改查
* 2.DbUtils:提供了大量的释放资源的方法
* 3.ResultSetHandler接口:提供了处理查询结果集的方法
*
* QueryRunner类
* 构造方法:
* QueryRunner() 空参数构造方法
* 调用更新和查询方法的时候,需要传入Connection对象
* QueryRunner(DataSource ds) 带DataSource数据库连接池的构造方法
* 调用更新和查询方法的时候QueryRunner会自动从DataSource实现类对象中获取数据库连接对象,使用完毕会自动归还
* 成员方法:
* 执行执行增删改的成员方法
* int update(Connection conn, String sql, Object... params)用来执行增删改的SQL
* int update(String sql, Object... params) 用来执行增删改的SQL
* 参数:
* Connection conn:数据库连接对象
* String sql:拼接的sql语句,可以使用?占位符
* Object... params:?占位符的实际参数,可以使用Object[]
* 返回值:
* int:执行的有效行数
* 执行执行查询的成员方法
* <T> T query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params)
* <T> T query(String sql, ResultSetHandler<T> rsh, Object... params)
* 参数:
* Connection conn:数据库连接对象
* String sql:拼接的sql语句,可以使用?占位符
* Object... params:?占位符的实际参数,可以使用Object[]
* ResultSetHandler<T> rsh:用来存储查询之后的结果集,可以传入ResultSetHandler9种实现类对象
* 返回值:
* <T> T:传入的ResultSetHandler实现类不同,返回的结果集也不同,使用泛型,传入什么结果集,就返回对应的类型
public class Demo01DBUtils {
//创建QueryRunner对象,构造方法中传入连接池的实现类对象
QueryRunner qr = new QueryRunner(C3P0UtilsReadXML.getDataSource());
/*
* 使用QueryRunner,对数据库表进行删除数据
*/
@Test
public void delete(){
try {
//拼接增加的sql语句
String sql = "DELETE FROM category WHERE cid=?";
//调用QueryRunner中update方法执行sql语句
//创建对象数据,储存?占位符的实际参数
//Object[] parmars = {"洗",10};
int row = qr.update(sql, 7);
System.out.println(row);
} catch (Exception e) {
System.out.println(e);
}
}
/*
* 使用QueryRunner,对数据库表进行修改数据
*/
@Test
public void update(){
try {
//拼接增加的sql语句
String sql = "UPDATE category SET cname=? WHERE cid=?";
//调用QueryRunner中update方法执行sql语句
//创建对象数据,储存?占位符的实际参数
Object[] parmars = {"洗",10};
int row = qr.update(sql, parmars);
System.out.println(row);
} catch (Exception e) {
System.out.println(e);
}
}
/*
* 使用QueryRunner,对数据库表进行增加(插入)数据
*/
@Test
public void insert(){
try {
//拼接增加的sql语句
String sql = "INSERT INTO category(cname) VALUES(?)";
//调用QueryRunner中update方法执行sql语句
int row = qr.update(sql, "玩具");
System.out.println(row);
} catch (Exception e) {
System.out.println(e);
}
}
}
使用QueryRunner对数据库表进行查询的九种查询方式
/*
* 使用QueryRunner对数据库表进行查询
* <T> T query(String sql, ResultSetHandler<T> rsh, Object... params)
*/
public class Demo02DBUtils {
//创建QueryRunner对象,构造方法中传入数据库连接池的实现类
QueryRunner qr = new QueryRunner(C3P0UtilsReadXML.getDataSource());
/*
* 第九种查询方式:使用KeyedHandler(Map嵌套Map)
* KeyedHandler会把结果集的每一行数据封装到Map集合中
* key:字符串类型列名
* value:列名对应的值(不同的列,数据类型不同,value使用Object类型)
* 多个Map集合存储到另外一个Map集合中
* key:指定的字符串列名,不指定则默认使用第一列
* value:传入存储每行数据的Map集合
*
* 构造方法:
* KeyedHandler() 不指定列名
* KeyedHandler(int columnIndex) 指定列号1,2,3,4
* KeyedHandler(String columnName) 指定字符串格式列名
*/
@Test
public void keyedHandler(){
try {
//拼接sql语句
String sql = "SELECT * FROM category";
//调用QueryRunner中的query方法,结果集使用KeyedHandler
//Map<Object,Map<String,Object>> mapmap = qr.query(sql, new KeyedHandler("cid"));
Map<Object,Map<String,Object>> mapmap = qr.query(sql, new KeyedHandler("cname"));
//遍历Map集合取出存储每一行数据的Map集合
for (Object obj: mapmap.keySet()) {
//根据key取出值存储每一行数据的Map集合
Map<String,Object> map = mapmap.get(obj);
//遍历Map集合
for(String key : map.keySet()){
System.out.print(obj+":"+key+"..."+map.get(key)+"\t");
}
//打印完每一行数据之后换行
System.out.println();
}
} catch (Exception e) {
System.out.println(e);
}
}
/*
* 第八种查询方式:使用ScalarHandler(重点)
* ScalarHandler用于执行返回单个数据的sql语句
* 使用聚合函数查询的结果都是单个数据
* 或者查询某一行的某一个字段
*/
@Test
public void scalarHandler(){
try {
//拼接sql语句
String sql = "SELECT SUM(cid) FROM category";
sql = "SELECT cname FROM category WHERE cid=?";
//调用QueryRunner中的query方法,结果集使用ScalarHander
//返回的值的数据类型不确定,使用Object类型
Object obj = qr.query(sql, new ScalarHandler(),2);
System.out.println(obj);
} catch (Exception e) {
System.out.println(e);
}
}
/*
* 第七种查询方式:使用MapListHandler
* 1.MapListHandler会把多条数据,存储到多个Map集合中
* key:字符串类型列名
* value:列名对应的值(不同的列,数据类型不同,value使用Object类型)
* 2.会把多个Map集合存储List集合中
*/
@Test
public void mapListHandler(){
try {
//拼接查询sql语句
String sql = "SELECT * FROM category";
//调用QueryRunner中的query方法执行查询sql语句,结果集传入MapListHandler
List<Map<String,Object>> list = qr.query(sql, new MapListHandler());
//遍历List集合,取出Map集合
for (Map<String, Object> map : list) {
//遍历Map集合
for(String key: map.keySet()){
System.out.print(key+"..."+map.get(key)+"\t");
}
System.out.println();//打印完每行数据之后换行
}
} catch (Exception e) {
System.out.println(e);
}
}
/*
* 第六种查询方式:使用MapHandler
* MapHandler把结果集的第一行数据存储Map集合中
* key:字符串类型列名
* value:列名对应的值(不同的列,数据类型不同,value使用Object类型)
*/
@Test
public void mapHandler(){
try {
//拼接查询sql语句
String sql = "SELECT * FROM category";
//调用QueryRunner中的query方法执行查询sql语句,结果集传入MapHandler
Map<String,Object> map = qr.query(sql, new MapHandler());
//使用keySet遍历Map集合
Set<String> set = map.keySet();
for (String key : set) {
//通过key使用get方法获取value
Object value = map.get(key);
System.out.print(key+"..."+value+" ");
}
} catch (Exception e) {
System.out.println(e);
}
}
/*
* 第五种查询方式:使用ColumnListHandler
* ColumnListHandler会把结果集中指定列的数据封装到一个List集合中
* 如果不指定列,则默认使用第一列数据存储到List集合中
* ColumnListHandler()
* ColumnListHandler(int columnIndex) 列号1,2,3,4
* ColumnListHandler(String columnName) 列名
*/
@Test
public void columnListHandler(){
try {
//拼接查询sql语句
String sql = "SELECT * FROM category";
//调用QueryRunner中的query方法执行查询sql语句,结果集传入ColumnListHandler
//返回一个List集合,因为列的数据类型不同,所有元素使用Object类型
List<Object> list = qr.query(sql, new ColumnListHandler("cname"));
for (Object object : list) {
System.out.println(object);
}
} catch (Exception e) {
System.out.println(e);
}
}
/*
* 第四种查询方式:使用BeanListHandler(重点)
* BeanListHandler会把多个条数据封装到多个JavaBean对象中
* 多个JavaBean对象存储到List集合中
*
* 注意:
* JavaBean中必须有空参数构造方法
*/
@Test
public void beanListHandler(){
try {
//拼接查询sql语句
String sql = "SELECT * FROM category";
//调用QueryRunner中的query方法执行查询sql语句,结果集传入BeanListHandler
List<Category> list = qr.query(sql, new BeanListHandler<>(Category.class));
//遍历存储Category的list集合
for (Category category : list) {
System.out.println(category);
}
} catch (Exception e) {
System.out.println(e);
}
}
/*
* 第三种查询方式:使用BeanHandler(重点)
* BeanHandler会把结果集的第一条数据,封装到指定的JavaBean对象中
* 构造方法:
* BeanHandler(Class<T> type) 传递JavaBean对象的class文件对象
* BeanHandler内部会根据传递的class文件对象使用反射技术创建JavaBean对象,把查询的结果集中第一行数据存储到JavaBean中
* 相当于
* Category c = new Category();
* c.setXXX(xxx);
* c.setXXX(xxx);
* c.setXXX(xxx);
* 注意:
* JavaBean中必须有空参数构造方法
*/
@Test
public void beanHandler(){
try {
//拼接查询sql语句
String sql = "SELECT * FROM category";
//调用QueryRunner中的query方法执行查询sql语句,结果集传入BeanHandler
Category cate = qr.query(sql, new BeanHandler<>(Category.class));
System.out.println(cate);
} catch (Exception e) {
System.out.println(e);
}
}
/*
* 第二种查询方式:使用ArrayListHandler
* ArrayListHandler中会把多条结果封装到多个对象数组中
* 一个对象数组封装一行数据
* 多个对象数组需要存储到list集合中
*/
@Test
public void arrrayListHandler(){
try {
//拼接查询sql语句
String sql = "SELECT * FROM category where cid = ?";
sql = "SELECT * FROM category where cid in(?,?)";
//调用QueryRunner中的query方法执行查询sql语句,传入ArrayListHandler结果集
List<Object[]> list = qr.query(sql, new ArrayListHandler(), 1,3);
//遍历集合
for (Object[] objects : list) {
//遍历对象数组
for (Object obj : objects) {
System.out.print(obj+" ");
}
System.out.println();//换行
}
} catch (Exception e) {
System.out.println(e);
}
}
/*
* 第一种查询方式:使用ArrayHandler
* ArrayHandler会把结果集第一条数据封装到一个对象(Object)数组中
* 数组中的每一个元素,就是第一条数据数据的每一列的值
*/
@Test
public void arrayHandler(){
try {
//拼接查询sql语句
String sql = "SELECT * FROM category";
//调用QueryRunner中的query方法执行查询sql语句,传入ArrayHandler结果集
Object[] objs = qr.query(sql, new ArrayHandler());
//遍历数组
for (Object obj : objs) {
System.out.print(obj+" ");
}
} catch (Exception e) {
System.out.println(e);
}
}
}