数据库连接池和DBUtil

1 数据库连接池

数据库连接池就是用来保存数据库连接的容器。当服务器启动的时候,JVM就会预先创建一批数据库连接。然后保存数据库连接池中。当用户访问数据库的时候,JVM就会从数据库连接池中获取一个连接出来给用户使用。用户访问数据库结束后,JVM就会连接返回给连接池中,给下一个用户继续使用。

使用数据库连接池的好处:

  • 减少数据库连接创建的数量;
  • 提供资源的利用率;
  • 提供系统性能

1.1 自定义数据库连接池

第一步:定义一个类,实现DataSource接口,重写getConnection方法,该方法用于获取一个数据库的连接;

第二步:定义一个release方法,用于把Connection对象释放回连接池中;

1.2 使用配置文件配置连接池

C3P0支持xml和properties格式的配置文件。我们只需要在src目录下

定义好配置文件,那么创建连接池对象的时候,它会自动在src目录下查找c3p0.properrties或c3p0-config.xml配置文件中加载配置文件。

c3p0-config.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<c3p0-config>
	<default-config> 
		<property name="jdbcUrl">jdbc:mysql://localhost:3306/entor_db</property>
		<property name="driverClass">com.mysql.jdbc.Driver</property>
		<property name="user">root</property>
		<property name="password">root</property>
		
		<property name="acquireIncrement">3</property>
		<property name="initialPoolSize">5</property>
		<property name="minPoolSize">2</property>
		<property name="maxPoolSize">5</property>
	</default-config>
</c3p0-config>

c3p0.properrties:

c3p0.driverClass=com.mysql.jdbc.Driver
c3p0.jdbcUrl=jdbc:mysql://localhost:3306/aa
c3p0.user=root
c3p0.password=root
c3p0.initialPoolSize=3
c3p0.maxPoolSize=5
c3p0.minPoolSize=3
c3p0.acquireIncrement=2
c3p0.checkoutTimeout=3000

如果同时定义了c3p0.properrties和c3p0-config.xml文件,优先加载c3p0-config.xml文件。

2 DBUtil工具

2.1 DBUtil工具介绍

DBUtil是Commons组件之一,用于简化数据库的操作。

2.2 DBUtil工具的使用

第一步:导入DBUtil核心jar包(commons-DbUtil.jar);

第二步:创建QueryRunner对象;

//可以手动指定事务
QueryRunner qr = new QueryRunner();
//不支持事务
QueryRunner qr = new QueryRunner(new ComboPooledDataSource());

第三步:使用QueryRunner对象方法访问数据库

# 更新操作
update(sql):传入一个sql字符串
update(sql, Object param):sql代表要执行的sql,param代表要传入到sql中的参数
update(sql, Object[] params):sql代表要执行的sql,params代表要传入到sql中的多个参数

# 查询操作
query(sql, ResultSetHandler, Object[] params):sql代表要执行的sql,ResultSetHandler代表结果处理器,params代表要传入的多个参数

ResultSetHandler:结果处理器

ResultSetHandler结果处理器使用场景
BeanHandler把一行的数据封装一个实体对象中。
BeanListHandler把多行的数据封装到一个List集合中。
ScalarHandler如果结果返回单个值,该处理器就返回它的值。

2.2.1 得到单个值(非事务)

private static void getTotalOfEmployee() throws SQLException {
    String sql = "select count(*) from employee";
    Object o = qr.query(sql, new ScalarHandler());
    System.out.println("结果总数:" + o);
}

2.2.2 查找多条数据(非事务)

private static void queryEmployees() throws SQLException {
    String sql = "select * from employee";
    Object o = qr.query(sql, new BeanListHandler(Employee.class));
    if (o != null) {
        List<Employee> empList = (List<Employee>) o;
        for (Employee employee : empList) {
            System.out.println(employee);
        }
    }
}

2.2.3 查找一条数据(非事务)

private static void queryEmployeeById(int id) throws SQLException {
    String sql = "select * from employee where id = ?";
    Object o = qr.query(sql, new BeanHandler(Employee.class), new Object[]{110});
    if (o != null) {
        Employee emp = (Employee) o;
        System.out.println(emp);
    }
}

2.2.4 删除数据(非事务)

private static void deleteEmployee() throws SQLException {
    String sql = "delete from employee where id = ?";
    qr.update(sql, 110);
}

2.2.5 更新数据(非事务)

private static void updateEmployee() throws SQLException {
    String sql = "update employee set name = ? where id = ?";
    qr.update(sql, new Object[]{"mickey", 110});
}

2.2.6 添加数据(非事务)

private static void addEmployee() throws SQLException {
    String sql = "insert into employee(id, name, dept, job) values(?, ?, ?, ?)";
    qr.update(sql, new Object[]{220, "mickey", "行政部", "行政主管"});
}

2.2.7 删除数据(事务)

package com.chinasofti.day13dbutils;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class Demo032 {
	// 创建QueryRunner对象,不需要每次执行数据库操作的时候都创建一个。
	static QueryRunner qr = new QueryRunner();
	// 创建连接池,一个应用只需要创建一个连接池即可
	static ComboPooledDataSource ds = new ComboPooledDataSource();

	public static void main(String[] args) throws SQLException {
		String sql = "delete from employee where id = ?";
        //获取数据库连接
		Connection conn = ds.getConnection();
		try {
			//关闭自动提交事务功能
			conn.setAutoCommit(false);
			qr.update(conn, sql, 110);
			qr.update(conn, sql, 220);
			// 提交事务
			conn.commit();
            //释放资源
			conn.close();
		} catch (Exception e) {
			e.printStackTrace();
			// 事务回滚
			conn.rollback(); 
		}
	}
	
}

2.3 实体类有嵌套类时

第一步:创建一个类,实现ResultSetHandler接口,重写handle方法

class StudentBeanListHandler implements ResultSetHandler{

	@Override
	public Object handle(ResultSet rs) throws SQLException {
		// TODO Auto-generated method stub
		return null;
	}
	
}

第二步:重写数据库表中的字段名和实体类的属性名的匹配

@Override
	public Object handle(ResultSet rs) throws SQLException {
		// TODO Auto-generated method stub
		List<Student> students = new ArrayList<>();
		while(rs.next()){
			Student s = new Student();
			s.setId(rs.getInt("stu_id"));
			s.setUsername(rs.getString("stu_name"));
			s.setGender(rs.getInt("gender")==1 ? "男" : "女");
			s.setPhone(rs.getString("phone"));
			s.setBirthdate(rs.getDate("birthdate"));
			s.setHobby(rs.getString("hobby"));
			Cls cls = new Cls();
			cls.setClassId(rs.getInt("classId"));
			cls.setClassName("className");
			s.setCls(cls);
			students.add(s);
		}
		return students;
	}

第三步:获取数据

public static void getAllStu(){
		String sql = "select * from student, cls where student.classId = cls.classId";
		try {
			List<Student> students = (List<Student>) qr1.query(sql, new StudentBeanListHandler());
			for (Student student : students) {
				System.out.println(student.toString());
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值