JDBC dbutils以及c3p0 dbcp连接池的使用

时间:2020-12-04 23:20:30
1. jdbc:
java操作数据库.jdbc是oracle公司指定的一套规范(一套接口)
驱动:jdbc的实现类.由数据库厂商提供.
我们就可以通过一套规范操作不同的数据库了(多态)
jdbc作用:
连接数据库
发送sql语句
处理结果

2. jdbc操作步骤:★
1.数据库和表
2.创建一个项目
3.导入驱动jar包
4.编码:
注册驱动
获取连接
编写sql
创建预编译的语句执行者
设置参数
执行sql
处理结果

释放资源

// 1.注册驱动
// 由于源码中也注册了一次,相当于注册两次,造成浪费
// 所以用反射 将类的字节码文件直接加载到内存,则静态代码块自动执行,就注册成功
// DriverManager.registerDriver(new Driver());
//驱动类类名的字节码文件
Class.forName("com.mysql.jdbc.Driver");
// 2.获得连接
// public static Connection getConnection(String url,String user,String
// password)
// url:数据库的地址 格式: jdbc:mysql://连接主机IP:端口号/数据库名字
String url = "jdbc:mysql://localhost:3307/mydata";
java.sql.Connection c = DriverManager.getConnection(url, "root", "123");
// System.out.println(c);
// 3.通过连接对象获取对SQL语句的执行者对象
Statement stm = c.createStatement();
// 4.执行SQL语句
// int executeUpdate(String sql)只能针对数据库的增 删 改操作
int row = stm.executeUpdate("UPDATE user3 SET uname='汽车',uprice=30000 WHERE uid=5;");
System.out.println(row);
// 释放资源
c.close();

// 1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
// 2.获得连接
String url = "jdbc:mysql://localhost:3307/mydata";
java.sql.Connection c = DriverManager.getConnection(url, "root", "123");
// 3.获取对SQL语句的执行者对象
Statement st = c.createStatement();
// 4.执行SQL语句 select语句
ResultSet rs = st.executeQuery("SELECT * FROM user3;");
// 5.处理结果集
while(rs.next()){
System.out.println(rs.getInt("uid")+" "+rs.getString("uname")+" "
+rs.getDouble("uprice")+" "+rs.getString("udesc"));
}
// 6.释放资源
rs.close();
st.close();
c.close();

3. dbutils

  核心类或接口
QueryRunner:类名
作用:操作sql语句
构造器:
new QueryRunner(Datasource ds);
注意:
底层帮我们创建连接,创建语句执行者 ,释放资源.
常用方法:
query(..):
update(..):

DbUtils:释放资源,控制事务 类
closeQuietly(conn):内部处理了异常
commitAndClose(Connection conn):提交事务并释放连接
....

ResultSetHandler:封装结果集 接口

ArrayHandler, ArrayListHandler, BeanHandler, BeanListHandler, ColumnListHandler, KeyedHandler, MapHandler, MapListHandler, ScalarHandler
 
(了解)ArrayHandler, 将查询结果的第一条记录封装成数组,返回
(了解)ArrayListHandler, 将查询结果的每一条记录封装成数组,将每一个数组放入list中返回
★★BeanHandler, 将查询结果的第一条记录封装成指定的bean对象,返回
★★BeanListHandler, 将查询结果的每一条记录封装成指定的bean对象,将每一个bean对象放入list中 返回.
(了解)ColumnListHandler, 将查询结果的指定一列放入list中返回 
(了解)MapHandler, 将查询结果的第一条记录封装成map,字段名作为key,值为value 返回
★MapListHandler, 将查询结果的每一条记录封装map集合,将每一个map集合放入list中返回
★ScalarHandler,针对于聚合函数 例如:count(*) 返回的是一个Long值

private static void beanListHander() throws Exception {
/*
* QueryRunner 实现数据库查询操作的第四种方式: 将结果集的第行数据封装成javaBean对象
* 再将javaBean对象封装到List集合中
*/
Connection conn = JDBCdemo6_1.getConnection();
QueryRunner qr = new QueryRunner();
String sql = "SELECT * FROM user3;";
// BeanHandler<User3>(Class<User3> type)
List<User3> list = qr.query(conn, sql, new BeanListHandler<User3>(User3.class));
for (User3 user : list) {
System.out.println(user);
}

}
private static void beanHander() throws Exception {
/*
* QueryRunner 实现数据库查询操作的第三种方式: 将结果集的第行数据封装成javaBean对象 JavaBean对象 就是一个类
* 类的成员变量和表中的字段一样,类名和表名一样
*/
Connection conn = JDBCdemo6_1.getConnection();
QueryRunner qr = new QueryRunner();
String sql = "SELECT * FROM user3 WHERE uid=?;";
// BeanHandler<User3>(Class<User3> type)
User3 us = qr.query(conn, sql, new BeanHandler<User3>(User3.class), 2);
System.out.println(us);
}
private static void scalarHandler() throws Exception {
/*
* QueryRunner 实现数据库查询操作的第六种方式: 适用于只有一个结果集的查询
*/
Connection conn = JDBCdemo6_1.getConnection();
QueryRunner qr = new QueryRunner();
String sql = "SELECT COUNT(*) FROM user3;";
Long row = qr.query(conn, sql, new ScalarHandler<Long>());
System.out.println(row);
}
4. dbcp连接池

public class DataSource2 {
private static BasicDataSource bds = new BasicDataSource();
static {
// 连接驱动类 数据库驱动名称 必须配置
bds.setDriverClassName("com.mysql.jdbc.Driver");
// 数据库地址
bds.setUrl("jdbc:mysql://localhost:3307/mydata");
bds.setUsername("root");
bds.setPassword("123");
//对象连接池中的连接对象配置 可以不配置,有默认的
bds.setInitialSize(10);//初始化的连接数
bds.setMaxActive(8);//最大连接数量
bds.setMinIdle(2);//最大空闲连接数
bds.setMaxIdle(5);//最小空闲连接数
}
public static DataSource getBasicDataSource(){
return bds;
}
}
public class Test2 {
private static QueryRunner qr = new QueryRunner(DataSource2.getBasicDataSource());

public static void main(String[] args) {

//delete();
select();
}
private static void select() {
String sql = "SELECT * FROM user2;";
try {
List<Object[]> list = qr.query(sql, new ArrayListHandler());
for(Object[] obj:list){
for(Object ob:obj){
System.out.println(ob);
}
}
} catch (SQLException e) {
e.printStackTrace();
}
}

private static void delete() {
String sql = "DELETE FROM user2 WHERE num=?;";
try {
qr.update(sql, 6);
} catch (Exception e) {
e.printStackTrace();
}
}

}

5. u3p0连接池  能自动回收空闲的连接

public void method_3() throws Exception{
//ComboPooledDataSource cds=new ComboPooledDataSource();
// 使用命名的配置 针对不同的数据库 如果命名匹配不到 则执行默认的配置
ComboPooledDataSource cds=new ComboPooledDataSource("itcast");
Connection conn=cds.getConnection();
String sql="insert into user1 values(?,?)";
PreparedStatement pst=conn.prepareStatement(sql);
pst.setInt(1, 8);
pst.setString(2, "鳄鱼");
int row=pst.executeUpdate();
System.out.println(row);
}
配置文件:名称:c3p0.properties 或者 c3p0-config.xml  放在src目录下

<c3p0-config>
<!-- 默认配置,如果没有指定则使用这个配置 -->
<default-config>
<!-- 基本配置 -->
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://127.0.0.1:3307/day</property>
<property name="user">root</property>
<property name="password">123</property>

<!--扩展配置-->
<property name="checkoutTimeout">30000</property>
<property name="idleConnectionTestPeriod">30</property>
<property name="initialPoolSize">10</property>
<property name="maxIdleTime">30</property>
<property name="maxPoolSize">100</property>
<property name="minPoolSize">10</property>
<property name="maxStatements">200</property>
</default-config>


<!-- 命名的配置 -->
<named-config name="itcast">
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://127.0.0.1:3307/day</property>
<property name="user">root</property>
<property name="password">123</property>


<!-- 如果池中数据连接不够时一次增长多少个 -->
<property name="acquireIncrement">5</property>
<property name="initialPoolSize">20</property>
<property name="minPoolSize">10</property>
<property name="maxPoolSize">40</property>
<property name="maxStatements">20</property>
<property name="maxStatementsPerConnection">5</property>
</named-config>
</c3p0-config>