DbUtils學習入門
一: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:數據庫連接池對象。
構造函數與增刪改查方法的組合:
QueryRunner()
update(Connection conn, String sql, Object… params)
query(Connection conn, String sql, ResultSetHandler rsh, Object… params)
QueryRunner(DataSource ds)
update(String sql, Object… params)
query(String sql, ResultSetHandler rsh, Object… params)
3:ResultSetHandle:封裝數據的策略對象------將封裝結果集中的數據,轉換到另一個對象
策略:封裝數據到對象的方式(示例:將數據庫保存在User、保存到數組、保存到集合)
方法介紹:handle(ResultSet rs)
備註:詳解參考ResultSetHandle實現類
四:DbUtils快速入門
使用Dbutils注意事項:
(1)需要導入的jar包:①MySql驅動 ②c3p0包 ③DbUtils包
(2)添加c3p0配置文件
(3)可以自行添加一個JDBCUtils工具類:用來獲取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:///jdbc</property>
<property name="user">root</property>
<property name="password">root</property>
</default-config>
</c3p0-config>
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, "柳巖", 3);
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, 3);
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 com.ambow.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.getName());
} 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();
}
}
參考文獻1