感謝原文作者:simonXi-tech
原文鏈接:https://blog.csdn.net/simonforfuture/article/details/90480147
更多請查閱在線API文檔:https://tool.oschina.net/apidocs/apidoc?api=commons-dbutils
前言
DBUtils
Java開發基礎(二)——JDBC的使用中寫到,Java與數據庫的連接包括:導包、注冊驅動、獲取與數據庫的連接對象、獲取SQL語句的執行者對象、獲取結果集對象、關閉連接等。其中連接池包含了注冊驅動和獲取與數據庫連接兩個步驟,而dbutils簡化了其他步驟。
JavaBean組件
**JavaBean是一個用於封裝數據的類,在與數據庫連接之中,JavaBean其的作用是將獲取的數據庫的記錄封裝到JavaBean中。**特性如下:
- 需要實現接口:java.io.Serializable ,可以省略不寫。
- 提供私有字段:private 類型 字段名;
- 提供getter/setter方法:
- 提供無參構造
DBUtils使用
DBUtils封裝了JDBC的操作,核心功能如下:
QueryRunner
中提供對sql語句操作的API.ResultSetHandler
接口,用於定義select操作后,怎樣封裝結果集.DbUtils
類是一個工具類,定義了關閉資源與事務處理的方法
QueryRunner核心類:
核心方法:
QueryRunner(DataSource ds)
;傳入參數為連接池update(String sql, Object… params)
,執行insert update delete
操作query(String sql, ResultSetHandler rsh, Object… params)
,執行 select操作
ResultSetHandler結果集處理類
示例
JavaBean: Category.java
// JavaBean
public class Category {
private String cid;
private String cname;
public String getCid() {
return cid;
}
public void setCid(String cid) {
this.cid = cid;
}
public String getCname() {
return cname;
}
public void setCname(String cname) {
this.cname = cname;
}
@Override
public String toString() {
return "Category [cid=" + cid + ", cname=" + cname + "]";
}
public Category() {
super();
// TODO Auto-generated constructor stub
}
public Category(String cid, String cname) {
super();
this.cid = cid;
this.cname = cname;
}
}
C3P0Utils.java
/** * 在C3P0連接池中 遵循了javax.sql.DataSource接口的實現類: * ComboPooledDataSource */
import java.beans.PropertyVetoException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.sql.DataSource;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class C3P0Utils {
private static ComboPooledDataSource ds = new ComboPooledDataSource();
// 自動加載C3P0-config.xml文件
public static DataSource getDataSource(){
return ds;
}
public static Connection getConnection() throws SQLException{
// 獲取連接,從C3P0連接池獲取
return ds.getConnection();
}
// 關閉所有資源的統一代碼
public static void closeAll(Connection conn, Statement st, ResultSet rs){
//負責關閉
if(conn != null){
try {
conn.close(); // 使用代理,放回到連接池中
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(st != null){
try {
st.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(rs != null){
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
DBUtilsDemo.java
package cn.simon.jdbc.demo03_DBUtils的使用;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.ArrayHandler;
import org.apache.commons.dbutils.handlers.ArrayListHandler;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ColumnListHandler;
import org.apache.commons.dbutils.handlers.MapHandler;
import org.apache.commons.dbutils.handlers.MapListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import cn.simon.jdbc.domain.Category;
/** * DBUtils執行數據庫查詢操作 * 1.QueryRunner(DataSource) * 2.query(String sql, ResultSetHandler<T> rsh, Object... params); // 主要執行查詢 */
public class DBUtilsDemo {
public static void main(String[] args) throws SQLException {
// TODO Auto-generated method stub
// queryDemo01();
// queryDemo02();
// queryDemo03();
// queryDemo04();
// queryDemo05();
queryDemo06();
// queryDemo07();
// queryDemo08();
}
// ArrayHandler處理類的使用
public static void queryDemo01() throws SQLException{
// 1.創建QueryRunner對象
QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
// 2.執行查詢
Object[] objs = qr.query("select * from category where cid = ?", new ArrayHandler(), 1);
for(Object o: objs){ // object[]中保存了object對象
System.out.println(o);
}
}
// ArrayListHandler
public static void queryDemo02() throws SQLException{
// 1.創建QueryRunner對象
QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
// 2.執行查詢
List<Object[]> objs = qr.query("select * from category ", new ArrayListHandler());
for (Object[] objects : objs) {
System.out.println(objects[0]+"\t"+objects[1]);
}
}
// BeanHandler處理類的使用
public static void queryDemo03() throws SQLException{
// 1.創建QueryRunner對象
QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
// 2.執行查詢
String sql = "select * from category";
Category c = qr.query(sql, new BeanHandler<Category>(Category.class));
System.out.println(c);
}
// BeanListHandler
public static void queryDemo04() throws SQLException{
// 1.創建QueryRunner對象
QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
// 2.執行查詢
String sql = "select * from category";
List<Category> c = qr.query(sql, new BeanListHandler<Category>(Category.class));
for (Category category : c) {
System.out.println(category);
}
}
// ColumnListHandler處理類的使用
public static void queryDemo05() throws SQLException{
// 1.創建QueryRunner對象
QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
// 2.執行查詢
String sql = "select * from category";
List<Object> c = qr.query(sql, new ColumnListHandler<Object>("cname"));
System.out.println(c);
}
// MapHandler處理類的使用
public static void queryDemo06() throws SQLException{
// 1.創建QueryRunner對象
QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
// 2.執行查詢
String sql = "select * from category";
Map<String, Object> map = qr.query(sql, new MapHandler());
// 3.
System.out.println(map);
}
// MapListHandler處理類的使用
public static void queryDemo07() throws SQLException{
// 1.創建QueryRunner對象
QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
// 2.執行查詢
String sql = "select * from category";
List<Map<String, Object>> maps = qr.query(sql, new MapListHandler());
// 3.List
System.out.println(maps);
}
// MapListHandler處理類的使用
public static void queryDemo08() throws SQLException{
// 1.創建QueryRunner對象
QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
// 2.執行查詢
String sql = "select count(*) from category";
Long count = qr.query(sql, new ScalarHandler<Long>());
// 3.List
System.out.println(count);
}
}
總結
DBUtils主要就是簡化JDBC操作,封裝雖好,但還是要知道其中的原理才好。
Maven
<!--DBUtils-->
<dependency>
<groupId>commons-dbutils</groupId>
<artifactId>commons-dbutils</artifactId>
<version>1.7</version>
</dependency>
我的項目具體使用
倉庫地址:https://github.com/b84955189/TF-MIS
源路徑:src/main/java/dao/impl/BaseDaoImpl.java
package dao.impl;
import dao.inter.BaseDaoInter;
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 utils.JDBCUtils;
import java.sql.SQLException;
import java.util.List;
/** * 基礎Dao實現類 * @author Jason * @version 1.0 * @date 6/11/2020 9:59 PM */
public class BaseDaoImpl implements BaseDaoInter {
/** * 獲取任意對象 * 結果Bean需要強轉 * @param beanType Java Bean 類型 * @param sqlSyntax SQL語句 * @param params 查詢參數 * @return * @author Jason * @date 9:57 PM 6/11/2020 */
@Override
public Object getObject(Class beanType, String sqlSyntax, Object[] params) throws SQLException {
QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());
return queryRunner.query(sqlSyntax,new BeanHandler(beanType),params);
}
/** * 獲取任意對象集合 * 注意:JSONObject是采用反射的機制獲取get方法,然后再獲取參數值的。所以在使用JSONObject處理結果集合時可以 * 不必下轉型。可以查看JSONObject的實現源代碼。上轉型類.getClass()==實例類型 * @param beanType Java Bean 類型 * @param sqlSyntax SQL語句 * @param params 查詢參數 * @return * @author Jason * @date 8:57 PM 6/13/2020 */
@Override
public List<Object> getObjectList(Class beanType, String sqlSyntax, Object[] params) throws SQLException {
System.out.println(sqlSyntax);
QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());
return queryRunner.query(sqlSyntax,new BeanListHandler<Object>(beanType),params);
}
/** * 數據庫更新操作 * QueryRunner的update方法參數底層依舊是使用JDBC的setObject方法設置參數.setObject方法內部會通過instance of判斷這個參數到底是哪個類型的具體對象,從而調用相應類型的set方法。 * @param sqlSyntax SQL語句 * @param params 參數 * @return * @author Jason * @date 9:29 AM 6/14/2020 */
@Override
public boolean update(String sqlSyntax, Object[] params) throws SQLException {
boolean sign=false;
QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());
if(queryRunner.update(sqlSyntax,params)>0){
sign=true;
}
return sign;
}
/** * 獲取查詢數目 * * @param sqlSyntax SQL 語句 * @param params 查詢限制參數 * @return * @author Jason * @date 7:26 PM 6/15/2020 */
@Override
public long getCount(String sqlSyntax, Object[] params) throws SQLException {
QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());
return queryRunner.query(sqlSyntax,new ScalarHandler<Long>(),params);
}
}