本篇就是聊一個工具類庫:
commons-dbutils.jar
.這個是Apache組織提供的開源的JDBC工作類庫,其對JDBC 進行了簡單的封裝,其實在前面聊的時自己通過反射建立的一個簡單的公用的工具類也是對JDBC的一個簡單的封裝,不過這個是人家提供的功能更強調,自然也會簡化Jdbc的編碼工作量。
其中最重用的有兩個記住接口和類:
- 類 :org.apache.commons.dbutils.QueryRunner;
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIyVGduV2YfNWawNiNx8FesU2cfdGLwczX0xiRGZkRGZ0Xy9GbvNGLwIzXlpXazxiZ5JWNxlHN1A1QiVTQClGVF5UMR9Fd4VGdsATNfd3bkFGazxSUhxGatJGbwhFT1Y0Mk9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL5MTO2UjM4AjZjJTOmdTN5kDM5QTY2gjNiRTOyYWO3gzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
- 接口 :org.apache.commons.dbutils.ResultSetHandler;
因為這個工具庫中最常用的一些方法都是通過這個接口實作,或者這個接口的子接口。
對這個說實話,不好解釋,隻能通過代碼進行簡單的示範。
而在示範中說實話也不能将所有的方法都示範,隻能說簡單的列出常用幾個方法,如果需要更多那就可能需要看官方文檔了。
準備
連接配接池工具類
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
public class jdbc_utils {
// 連接配接池一般會在運作的時候就啟動 是以沒必要每次都調用
static DataSource dataSource=null;
static {
Properties properties= new Properties();
try {
properties.load(test_druid.class.getClassLoader().getResourceAsStream("druid.properties"));
// 這個和C3P0有點差別,C3P0可以自動根據名字導入而這個需要的手動寫一下
dataSource= DruidDataSourceFactory.createDataSource(properties);
} catch (Exception e) {
e.printStackTrace();
}
}
// 得到連接配接
public static Connection getCon() {
Connection con=null;
try {
con= dataSource.getConnection();
return con;
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return con;
}
//釋放資源 畢竟連接配接就算不用也要放回池子裡面
public static void ColseStaCon(Statement stm, ResultSet rst,Connection con){
try {
if(rst!=null){
rst.close();
}
} catch ( SQLException throwables) {
throwables.printStackTrace();
}finally {
if (stm!=null){
try {
stm.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
} finally {
if(con!=null){
try {
con.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
}
}
}
}
配置檔案
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/test?rewriteBatchedStatments=true
username=root
password=root
# 初始化連接配接數量
initialSize=5
# 最大連接配接數
maxActive=10
# 最大逾時時間
maxWait=3000
建立一個bean類:
public class UserBean {
int uid;
String uname;
String uaddres;
public UserBean() {
}
public UserBean(int uid, String uname, String uaddres) {
this.uid = uid;
this.uname = uname;
this.uaddres = uaddres;
}
public int getUid() {
return uid;
}
public String getUname() {
return uname;
}
public String getUaddres() {
return uaddres;
}
public void setUid(int uid) {
this.uid = uid;
}
public void setUname(String uname) {
this.uname = uname;
}
public void setUaddres(String uaddres) {
this.uaddres = uaddres;
}
@Override
public String toString() {
return "UserBean{" +
"uid=" + uid +
", uname='" + uname + '\'' +
", uaddres='" + uaddres + '\'' +
'}';
}
}
插入一行的方法
public void insert_one() {
Connection con=null;
try {
con=jdbc_utils.getCon();
// 首先聲明一個 queryrunnder類
QueryRunner queryRunner=new QueryRunner();
String sql="INSERT INTO test.UserBean (uid, uname, uaddres ) VALUES (?,?,?)";
// 運作一個插入
queryRunner.execute(con,sql,"001","張三","北京");
// 還可以調用另一個方法,傳回一個操作的行數,這個方法支援 更新删除和插入
// int countrow=queryRunner.update(con,sql,"001","張三","北京");
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
jdbc_utils.ColseStaCon(null,null,con);
}
結構:
插入一些資料
public static void insert_some() {
Connection con=null;
try {
con=jdbc_utils.getCon();
// 首先聲明一個 queryrunnder類
QueryRunner queryRunner=new QueryRunner();
String sql="INSERT INTO test.UserBean (uid, uname, uaddres ) VALUES (?,?,?)";
String[][] arruser={
{"003","張4","北京"},
{"004","張5","北京"},
{"005","張6","北京"},
};
int[] countrows=queryRunner.batch(con,sql,arruser);
System.out.println(Arrays.toString(countrows));
} catch ( Exception throwables) {
throwables.printStackTrace();
}finally {
jdbc_utils.ColseStaCon(null,null,con);
}
}
查詢傳回一條資料
public static void getOne(){
Connection con=null;
try {
con=jdbc_utils.getCon();
QueryRunner queryRunner=new QueryRunner();
String sql="SELECT uid, uname, uaddres FROM test.userbean WHERE uid=? ";
BeanHandler<UserBean> beanHandler= new BeanHandler<UserBean>(UserBean.class);
UserBean userBean= queryRunner.query(con, sql, beanHandler, "001");
System.out.println(userBean);
} catch (Exception e) {
e.printStackTrace();
}finally {
jdbc_utils.ColseStaCon(null, null, con);
}
}
查詢多條資料
public static void getSome(){
Connection con=null;
try {
con=jdbc_utils.getCon();
QueryRunner queryRunner=new QueryRunner();
String sql="SELECT uid, uname, uaddres FROM test.userbean where uid < ?";
MapListHandler mapListHandler=new MapListHandler();
List<Map<String, Object>> list= queryRunner.query(con, sql, mapListHandler,"008" );
list.forEach(System.out::println);
} catch (Exception e) {
e.printStackTrace();
}finally {
jdbc_utils.ColseStaCon(null, null, con);
}
}
特殊的聚合函數
public static void getTe(){
Connection con=null;
try {
con=jdbc_utils.getCon();
QueryRunner queryRunner=new QueryRunner();
String sql="SELECT max(uid) FROM test.userbean ";
ScalarHandler scalarHandler=new ScalarHandler();
Object object=queryRunner.query(con,sql,scalarHandler);
System.out.println(object);
} catch (Exception e) {
e.printStackTrace();
}finally {
jdbc_utils.ColseStaCon(null, null, con);
}
}
簡單了解下ResultSetHandler(實作這個接口)
先看代碼
public static void getTEST(){
Connection con=null;
try {
con=jdbc_utils.getCon();
QueryRunner queryRunner=new QueryRunner();
String sql="SELECT uid, uname, uaddres FROM test.userbean WHERE uid=? ";
ResultSetHandler<UserBean> testresult= new ResultSetHandler<UserBean>() {
@Override
public UserBean handle(ResultSet resultSet) throws SQLException {
return new UserBean(100,"李四","好壓");
}
};
UserBean userBean= queryRunner.query(con, sql, testresult, "001");
System.out.println(userBean);
} catch (Exception e) {
e.printStackTrace();
}finally {
jdbc_utils.ColseStaCon(null, null, con);
}
}
可以看出ResultSetHandler是一個對對象包裝的容器,是以無論BeanHandler,還是MapListHandler都是對接口方法的實作的一種展現。
關閉的優化
上面寫的關閉手動關閉了三個,其實還有一種方式
// 這種關閉需要排除異常
try {
DbUtils.close(con);
DbUtils.close(rst);
DbUtils.close(prst);
} catch (Exception e) {
e.printStackTrace();
}
為什麼不用判斷是否為空
還可以更加簡單
// 這種就不需要try了 因為工具類庫已經解決異常了
DbUtils.closeQuietly(con);
DbUtils.closeQuietly(rst);
DbUtils.closeQuietly(prst);
為什麼不需要