jdbcUtils+QueryRunner的使用


注意:在使用QueryRunner類進行數據庫操作的過程中,發現了一些小的注意事項:

1.那就是java的實體類的屬性名稱要和數據庫表里的列名保持一致,不然數據顯示不出來,就很煩

2.java實體類一定要記得添加空參構造器

 

1為什么使用DbUtils

  DbUtils工具類,避免JDBC繁瑣,簡化開發。DbUtils類主要負責裝載驅動、關閉連接的常規工作。

2QueryRunner

  QreryRunnerDbUtils的核心類,簡化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&amp;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層處理時加上事務的處理!

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM