注意:在使用QueryRunner類進行數據庫操作的過程中,發現了一些小的注意事項:
1.那就是java的實體類的屬性名稱要和數據庫表里的列名保持一致,不然數據顯示不出來,就很煩
2.java實體類一定要記得添加空參構造器
1為什么使用DbUtils?
DbUtils工具類,避免JDBC繁瑣,簡化開發。DbUtils類主要負責裝載驅動、關閉連接的常規工作。
2QueryRunner類
QreryRunner類DbUtils的核心類,簡化SQL查詢,使代碼量減少。
2.1常用方法
1.query(Connection conn, String sql, Object[] params, ResultSetHandler rsh):執行選擇查詢,在查詢中,對象陣列的值被用來作為查詢的置換參數。
2.query(String sql, Object[] params, ResultSetHandler rsh):方法本身不提供數據庫連接,執行選擇查詢,在查詢中,對象陣列的值被用來作為查詢的置換參數。
3.query(Connection conn, String sql, ResultSetHandler rsh):執行無需參數的選擇查詢。
4.update(Connection conn, String sql, Object[] params):被用來執行插入、更新或刪除(DML)操作。
2.2ResultSetHandler接口
(org.apache.commons.dbutils.ResultSethandler)執行處理一個結果集對象,將數據轉變並處理為任何一種形式,供其他應用使用。
常見的實現類
ArrayHandler:把結果集中的第一行數據轉成對象數組。
ArrayListHandler:把結果集中的每一行數據都轉成一個對象數組,再存放到List中。
BeanHandler:將結果集中的第一行數據封裝到一個對應的JavaBean實例中。
BeanListHandler:將結果集中的每一行數據都封裝到一個對應的JavaBean實例中,存放到List里。
MapHandler:將結果集中的第一行數據封裝到一個Map里,key是列名,value就是對應的值。
MapListHandler:將結果集中的每一行數據都封裝到一個Map里,然后再存放到List
ColumnListHandler:將結果集中某一列的數據存放到List中。
KeyedHandler(name):將結果集中的每一行數據都封裝到一個Map里(List<Map>),再把這些map再存到一個map里,其key為指定的列。
ScalarHandler:將結果集第一行的某一列放到某個對象中。
使用步驟:
1.導jar包(鏈接:https://pan.baidu.com/s/1BMhXYRNcusUDkzsymJn4OQ +提取碼:p68w)
2.添加C3P0配置文件--src目錄下
內容如下:
<?xml version="1.0" encoding="UTF-8"?> <c3p0-config> <default-config> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql:///newsdb?useUnicode=true&charsetEncoding=UTF-8</property> <!-- 數據庫的賬號和密碼 --> <property name="user">root</property> <property name="password">root</property> </default-config> </c3p0-config>
3.創建C3P0數據源連接池工具類DBUtils
package com.it.util; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import javax.sql.DataSource; import com.mchange.v2.c3p0.ComboPooledDataSource; import com.mysql.jdbc.Statement; /** * C3P0數據源連接池工具類 * @author *** * @date 0000年0月0日 * @Description */ public class DBUtils { // 創建一個ThreadLoacl對象,用當前線程作為key private static ThreadLocal<Connection> tl = new ThreadLocal<>(); // 讀取的是C3P0-config默認配置創建數據庫連接池對象 private static DataSource ds = new ComboPooledDataSource(); // 獲取數據庫連接池對象 public static DataSource getDs() { return ds; } // 從連接池中獲取連接 public static Connection getConnection() { Connection conn = tl.get(); if(conn == null) { try { conn = ds.getConnection(); } catch (SQLException e) { e.printStackTrace(); } tl.set(conn); } return conn; } // 關閉數據庫連接 public static void closeConnection(Connection conn,Statement st,ResultSet rs) { try { if(conn != null) { conn.close(); } if(st != null) { st.close(); } if(rs != null) { rs.close(); } } catch (Exception e) { e.printStackTrace(); } } // 開啟事務 public static void startTranscation() { Connection conn = getConnection(); try { /* * setAutoCommit總的來說就是保持數據的完整性,一個系統的更新操作可能要涉及多張表,需多個SQL語句進行操作 * 循環里連續的進行插入操作,如果你在開始時設置了:conn.setAutoCommit(false); * 最后才進行conn.commit(),這樣你即使插入的時候報錯,修改的內容也不會提交到數據庫, */ conn.setAutoCommit(false); } catch (SQLException e) {// TODO Auto-generated catch block e.printStackTrace(); } } public static void commit() { try { Connection conn = tl.get(); if(conn != null) { conn.commit(); } } catch (Exception e) { // TODO: handle exception } } public static void rollback() { try { Connection conn = tl.get(); if(conn != null) { conn.rollback(); } } catch (Exception e) { // TODO: handle exception } } }
4.dao層應用
QueryRunner qr = new QueryRunner(DBUtils.getDs());
//更新的示范,刪除修改大致
public boolean addNews(News news) throws SQLException {
conn = DBUtils.getConnection();
String sql = "insert into news(ntid,ntitle,nauthor,ncreateDate,ncontent,nsummary,npicPath) values(?,?,?,NOW(),?,?,?)";
Object[] params = {news.getNtid(),news.getNtitle(),news.getNauthor(),news.getNcontent(),news.getNsummary(),news.getNpicPath()};
int result = qr.update(conn, sql, params);
if(result == -1) {
return false;
}else {
return true;
}
}
//查詢的示范--無條件查詢全部
public List<News> queryAllNews() throws SQLException{
conn = DBUtils.getConnection();
String sql = "select * from news";
List<News> newss = new ArrayList<>();
newss = qr.query(conn, sql, new BeanListHandler<News>(News.class));
return newss;
}
//查詢的示范--通過條件查詢某一記錄
public News queryNewsByNid(int nid) throws SQLException {
conn = DBUtils.getConnection();
String sql = "select * from news where nid=?";
News news = null;
news = qr.query(conn, sql, nid, new BeanHandler<>(News.class));
return news;
}
//分頁查詢數量時注意
public int getCount() {
String sql="select count(1) from news";
Long c=new Long(-1);
try {
c =(Long)qr.query(sql, new ScalarHandler());
} catch (SQLException e) {
e.printStackTrace();
}
return c.intValue();
}
大致用法就是這樣了,保險起見,在service層處理時加上事務的處理!