一:Dbutils是什麼?(當我們很難了解一個東西的官方解釋的時候,就讓我們記住它的作用)
Dbutils:主要是封裝了JDBC的代碼,簡化dao層的操作。
作用:幫助java程式員,開發Dao層代碼的簡單架構。
架構的作用:幫助程式員,提高程式的開發效率。
出生:Dbutils是由Apache公司提供。
二:為什麼需要Dbutils ?
在使用Dbutils 之前,我們Dao層使用的技術是JDBC,那麼分析一下JDBC的弊端:
(1)資料庫連結對象、sql語句操作對象,封裝結果集對象,這三大對象會重複定義
(2)封裝資料的代碼重複,而且操作複雜,代碼量大
(3)釋放資源的代碼重複
結果:(1)程式員在開發的時候,有大量的重複勞動。(2)開發的周期長,效率低
三:Dbutils三個核心類介紹:
1:DbUtils:連接配接資料庫對象----jdbc輔助方法的集合類,線程安全
構造方法:DbUtils()
作用:控制連接配接,控制書屋,控制驅動加載額一個類。
2:QueryRunner:SQL語句的操作對象,可以設定查詢結果集的封裝政策,線程安全。
構造方法:
(1)QueryRunner():建立一個與資料庫無關的QueryRunner對象,後期再操作資料庫的會後,需要手動給一個Connection對象,它可以手動控制事務。
Connection.setAutoCommit(false); 設定手動管理事務
Connection.commit(); 送出事務
(2)QueryRunner(DataSource ds):建立一個與資料庫關聯的queryRunner對象,後期再操作資料庫的時候,不需要Connection對象,自動管理事務。
DataSource:資料庫連接配接池對象。
(3)ResultSetHandle:封裝資料的政策對象------将封裝結果集中的資料,轉換到另一個對象
政策:封裝資料到對象的方式(示例:将資料庫儲存在User、儲存到數組、儲存到集合)
方法介紹:handle(ResultSet rs)
四:Dbutils快速入門
使用Dbutils注意事項:
(1)需要導入的jar包:①MySql驅動 ②c3p0包 ③DbUtils包
(2)添加c3p0配置檔案
(3)可以自行添加一個JDBCUtils工具類:用來擷取c3p0連接配接池對象
c3p0配置檔案:c3p0-config.xml
<? xml version ="1.0" encoding= "UTF-8" ?>
< c3p0-config>
<!-- 預設配置,c3p0架構預設加載這段預設配置 -->
< default-config>
<!-- 配置JDBC 四個基本屬性 -->
< property name ="driverClass" > com.mysql.jdbc.Driver</ property >
< property name ="jdbcUrl" > jdbc:mysql:///資料庫名</ property >
< property name ="user" > 資料庫使用者名</ property >
< property name ="password" > 資料庫密碼</ property >
</ default-config> <!-- This app is massive! -->
</ c3p0-config>
JDBCUtils工具類:JDBCUtils. java
package cn.utils;
import java.sql.Connection;
import java.sql.SQLException;
import javax.sql.DataSource;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class JDBCUtils {
// 獲得c3p0連接配接池對象
private static ComboPooledDataSource ds = new ComboPooledDataSource();
/**
* 獲得資料庫連接配接對象
*
* @return
* @throws SQLException
*/
public static Connection getConnection() throws SQLException {
return ds.getConnection();
}
/**
* 獲得c3p0連接配接池對象
* @return
*/
public static DataSource getDataSource() {
return ds;
}
}
案例一:使用queryRunner對象完成增删改操作:
1.資料表
drop database if exists jdbc;
CREATE DATABASE IF NOT EXISTS jdbc;
USE jdbc;
drop table if exists user ;
CREATE TABLE IF NOT EXISTS `user ` (
`id` int(11) NOT NULL AUTO_INCREMENT,
` name` varchar(50) DEFAULT NULL ,
`pwd` varchar(50) DEFAULT NULL ,
PRIMARY KEY (`id`)
) ;
#資料初始化
insert into user values (null ,'zhangsan' ,'123456' );
insert into user values (null ,'lisi' ,'123456' );
2:示範代碼
//需求:向user表插入一條資料
@Test
public void test1(){
//第一步:建立queryRunner對象,用來操作sql語句
QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
//第二步:建立sql語句
String sql = "insert into user values(null,?,?)";
//第三步:執行sql語句,params:是sql語句的參數
//注意,給sql語句設定參數的時候,按照user表中字段的順序
try {
int update = qr.update(sql, "狗蛋","123456");
System.out.println(update);
} catch (SQLException e) {
e.printStackTrace();
}
}
//需求:修改id==7的資料
@Test
public void test2(){
//第一步:建立queryRunner對象,用來操作sql語句
QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
//第二步:建立sql語句
String sql = "update user set name = ? where id = ?";
//第三步:執行sql語句,params:是sql語句的參數
//注意,給sql語句設定參數的時候,按照user表中字段的順序
try {
int update = qr.update(sql, "柳岩",7);
System.out.println(update);
} catch (SQLException e) {
e.printStackTrace();
}
}
//需求:删除id==7的資料
@Test
public void test3(){
//第一步:建立queryRunner對象,用來操作sql語句
QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
//第二步:建立sql語句
String sql = "delete from user where id = ?";
//第三步:執行sql語句,params:是sql語句的參數
//注意,給sql語句設定參數的時候,按照user表中字段的順序
try {
int update = qr.update(sql, 7);
System.out.println(update);
} catch (SQLException e) {
e.printStackTrace();
}
}
案例二:QueryRunner的query方法和ResultSetHandler接口的使用
1:資料庫表
同上一案例User表
2:自定義實作ResultSetHandler封裝查詢結果集
自定義政策
package cn.handler;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.dbutils.ResultSetHandler;
import cn.itcast.domain.User;
// ResultSetHandler<T>,<T>表示封裝結果的類型
//MyHandler 是自定義的ResultSetHandler封裝結果集政策對象
public class MyHandler implements ResultSetHandler<List<User>>{
@Override
public List<User> handle(ResultSet rs) throws SQLException {
// 封裝資料,資料從 Resultset 中擷取
List<User> list = new ArrayList<User>();
while(rs.next()){
User u = new User();
u.setId(rs.getInt( "id"));
u.setName(rs.getString( "name"));
u.setPwd(rs.getString( "pwd"));
list.add(u);
}
return list;
}
}
3:測試代碼
//需求:擷取user表中所有的資料
@Test
public void test4(){
//第一步:建立queryRunner對象,用來操作sql語句
QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
//第二步:建立sql語句
String sql = "select * from user";
//第三步:執行sql語句,params:是sql語句的參數
//注意,給sql語句設定參數的時候,按照user表中字段的順序
try {
List<User> list = qr.query(sql, new MyHandler());
System.out.println(list);
} catch (SQLException e) {
e.printStackTrace();
}
}
案例三:ResultSetHandler實作類介紹(由DbUtils架構提供)
備注:DbUtils給我們提供了10個ResultSetHandler實作類,分别是:
①ArrayHandler: 将查詢結果的第一行資料,儲存到Object數組中
②ArrayListHandler : 将查詢的結果,每一行先封裝到Object數組中,然後将資料存入List集合
③BeanHandler : 将查詢結果的第一行資料,封裝到user對象
④BeanListHandler : 将查詢結果的每一行封裝到user對象,然後再存入List集合
⑤ColumnListHandler : 将查詢結果的指定列的資料封裝到List集合中
⑥MapHandler : 将查詢結果的第一行資料封裝到map結合(key==列名,value==列值)
⑦MapListHandler : 将查詢結果的每一行封裝到map集合(key==列名,value==列值),再将map集合存入List集合
⑧BeanMapHandler : 将查詢結果的每一行資料,封裝到User對象,再存入mao集合中(key==列名,value==列值)
⑨KeyedHandler : 将查詢的結果的每一行資料,封裝到map1(key==列名,value==列值 ),然後将map1集合(有多個)存入map2集合(隻有一個)
⑩ScalarHandler : 封裝類似count、avg、max、min、sum......函數的執行結果
以上10個ResultSetHandler實作類,常用的是BeanHandler、BeanListHandler和ScalarHandler,下面将對這三個實作類,寫測試類
一: 測試BeanHandler政策
//需求:測試BeanHandler政策
//BeanHandler:将查詢結果的第一行資料,封裝到user對象
@Test
public void test7(){
//第一步:建立queryRunner對象,用來操作sql語句
QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
//第二步:建立sql語句
String sql = "select * from user";
//第三步:執行sql語句,params:是sql語句的參數
//注意,給sql語句設定參數的時候,按照user表中字段的順序
try {
User user = qr.query(sql, new BeanHandler<User>(User.class));
System.out.println(user);
} catch (SQLException e) {
e.printStackTrace();
}
}
二:測試BeanListHandler政策
//需求:測試BeanListHandler政策
//BeanListHandler:将查詢結果的每一行封裝到user對象,然後,再存入list集合
@Test
public void test8(){
//第一步:建立queryRunner對象,用來操作sql語句
QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
//第二步:建立sql語句
String sql = "select * from user";
//第三步:執行sql語句,params:是sql語句的參數
//注意,給sql語句設定參數的時候,按照user表中字段的順序
try {
List<User> list = qr.query(sql, new BeanListHandler<User>(User.class));
System.out.println(list);
} catch (SQLException e) {
e.printStackTrace();
}
}
三:測試ScalarHandler政策
//需求:測試ScalarHandler政策
//ScalarHandler:封裝類似count、avg、max、min、sum。。。。函數的執行結果
@Test
public void test14(){
//第一步:建立queryRunner對象,用來操作sql語句
QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
//第二步:建立sql語句
String sql = "select count(*) from user";
//第三步:執行sql語句,params:是sql語句的參數
//注意,給sql語句設定參數的時候,按照user表中字段的順序
try {
Object object = qr.query(sql, new ScalarHandler());
System.out.println(object);
} catch (SQLException e) {
e.printStackTrace();
}
}
以上三個有測試案例的ResultSetHandler政策為常用實作類。
轉自:
https://www.cnblogs.com/CQY1183344265/p/5854418.html
表示感謝!!