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();
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/81681.html