Commons DbUtils是Apache組織提供的一個對JDBC進行簡單封裝的開源工具類庫,使用它能夠簡化JDBC應用程序的開發,同時也不會影響程序的性能
1、特征
DBUtils是java編程中的數據庫操作實用工具,小巧簡單實用,
1.對於數據表的讀操作,他可以把結果轉換成List,Array,Set等java集合,便於程序員操作;
2.對於數據表的寫操作,也變得很簡單(只需寫sql語句)
3.可以使用數據源,使用JNDI,數據庫連接池等技術來優化性能--重用已經構建好的數據庫連接對象,而不像php,asp那樣,費時費力的不斷重復的構建和析構這樣的對象。
2、DBUtils提供了三個核心的功能
2.1QueryRunner中提供對sql語句操作的API
QueryRunner(DataSource ds),提供數據源(連接池),DBUtils底層自動維護了連接Connection
update(String sql, Object...params),執行更新數據
query(String sql,ResultSetHandler
2.2 ResultSetHandler接口,用於定義select操作后,怎樣封裝結果集
ArrayHandler:將結果集中的第一條記錄封裝到Object[]數組中,數組中的每一個元素即使這條記錄中的每一個字段的值
ArrayListHandler:將結果集中的每一條記錄封裝到Object[]數組中,將這些數組再封裝到List集合中
BeanHandler:將結果集中的第一條記錄封裝到一個指定的javabean中
BeanListHandler:將結果集中每一條記錄封裝到javabean中,將這些javabean再封裝到List集合中
ColumnListHandler:將結果集中指定列的字段值封裝到一個List集合中
KeyedHandler:將結果集中的每一條記錄封裝到Map<String,Object>,再講這個map集合作為另一個Map的value,另一個Map集合的key是指定的字段的值
MapHandler:將結果集中的第一條記錄封裝到Map<String,Object>集合中,key就是字段名稱,value就是字段的值
MapListHandler:將結果集中的每一條記錄封裝到Map<String,Object>集合中,key就是字段名稱,value就是字段的值,再將這些Map封裝到List集合中
ScalarHandler:它是用於單數據,列如:select count(1) from 表操作
2.3 DbUtils類,就是一個工具類,定義了關閉資源和事務處理的方法
closeQuietly(Connetion conn)關閉連接,有異常就會拋出
commitAndCloseQuietly(Connetion conn):提交並關閉連接
rollbackAndCloseQuietly(Connetion conn):回滾並關閉連接
3、DBUtils操作代碼demo
3.1maven依賴
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.44</version>
</dependency>
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-dbutils/commons-dbutils -->
<dependency>
<groupId>commons-dbutils</groupId>
<artifactId>commons-dbutils</artifactId>
<version>1.7</version>
</dependency>
3.2QueryDbUtils代碼
package com.rookie.bigdata.dbutils;
import com.rookie.bigdata.domain.User;
import com.rookie.bigdata.util.C3P0Utils;
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 java.sql.SQLException;
import java.util.List;
/**
* Created by dell on 2019/5/24.
*/
public class QueryDbUtils {
public static void main(String[] args) {
//insertMethod();
//updateMethod();
//deleteMethod();
//selectAllUserMethod();
//selectUserMethod();
try {
QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
String sql = "select count(*) from user ";
Long count=(Long)qr.query(sql, new ScalarHandler());
System.out.println(count);
} catch (Exception e) {
e.printStackTrace();
}
}
//查詢單個用戶方法
private static void selectUserMethod() {
try {
QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
String sql = "select * from user where username=?";
Object[] params = {"李四"};
User user = qr.query(sql, new BeanHandler<User>(User.class), params);
System.out.println(user);
} catch (Exception e) {
e.printStackTrace();
}
}
//查詢所有的用戶信息
private static void selectAllUserMethod() {
try {
QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
String sql = "select * from user";
List<User> userList = qr.query(sql, new BeanListHandler<User>(User.class));
for (User user : userList) {
System.out.println(user);
}
} catch (Exception e) {
e.printStackTrace();
}
}
//刪除操作
private static void deleteMethod() {
try {
QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
String sql = "delete from user where username=?";
Object[] params = {"李四"};
int update = qr.update(sql, params);
System.out.println("刪除了" + update + "記錄");
} catch (Exception e) {
e.printStackTrace();
}
}
//更新記錄操作
private static void updateMethod() {
try {
QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
String sql = "update user set password=? where username=?";
Object[] params = {"654321", "李四"};
int update = qr.update(sql, params);
System.out.println("更新了" + update + "記錄");
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 查詢操作
*/
private static void insertMethod() {
try {
// 1.創建核心類QueryRunner
QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
// 2.編寫SQL語句
String sql = "insert into user values(?,?)";
// 3.為站位符設置值
Object[] params = {"李四", "123456"};
// 4.執行添加操作
int rows = qr.update(sql, params);
System.out.println("添加成功!" + rows);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
C3P0Utils.java
package com.rookie.bigdata.util;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* Created by dell on 2019/5/23.
*/
public class C3P0Utils {
private static ComboPooledDataSource dataSource = new ComboPooledDataSource("mysql");
public static DataSource getDataSource() {
return dataSource;
}
public static Connection getConnection() {
try {
return dataSource.getConnection();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
//釋放連接回連接池
public static void close(Connection conn, PreparedStatement pst, ResultSet rs) {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (pst != null) {
try {
pst.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
User.java
package com.rookie.bigdata.domain;
/**
* Created by dell on 2019/5/25.
*/
public class User {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}