1. 程式人生 > >資料庫操作工具-QueryRunner

資料庫操作工具-QueryRunner

在相繼學習了JDBC和資料庫操作之後,我們明顯感到編寫JDBC程式碼並非一件輕鬆的事兒。為了幫助我們更高效的學習工作,從JDBC的繁重程式碼中解脫出來,老佟給我們詳盡介紹了一個簡化JDBC操作的元件——DBUtils。我們今天主要學習了它所提供的兩個類和一個介面。
元件下載地址:http://commons.apache.org/proper/commons-dbutils/

  • DbUtils類(org.apache.commons.dbutils.DbUtils)主要負責裝載驅動、關閉連線的常規工作
    方法:
    • close: 檢查所提供的引數是不是NULL,如果不是的話,它們就關閉連線、宣告和結果集。
    • CloseQuietly:避免連線、宣告或結果集為NULL的情況被關閉
    • CommitAndCloseQuietly(Connection conn):用來提交連線,然後關閉連線,並且在關閉連線時不向上丟擲在關閉時發生的一些SQL異常。
    • LoadDriver(String driveClassName): 裝載並註冊JDBC驅動程式,如果成功就返回TRUE。
  • QreryRunner類(org.apache.commons.dbutils.QueryRunner) 顯著的簡化了SQL查詢,並與ResultSetHandler協同工作將使編碼量大為減少
    • query(Connection conn, String sql, Object[] params, ResultSetHandler rsh):執行選擇查詢,在查詢中,物件陣列的值被用來作為查詢的置換引數。
    • query(String sql, Object[] params, ResultSetHandler rsh):方法本身不提供資料庫連線,執行選擇查詢,在查詢中,物件陣列的值被用來作為查詢的置換引數。
    • query(Connection conn, String sql, ResultSetHandler rsh):執行無需引數的選擇查詢。
    • update(Connection conn, String sql, Object[] params):被用來執行插入、更新或刪除(DML)操作。
  • ResultSetHandler介面(org.apache.commons.dbutils.ResultSethandler)執行處理一個結果集物件,將資料轉變並處理為任何一種形式,供其他應用使用。

    • Object handle (java.sql.ResultSet .rs) :結果集(ResultSet)作為引數傳入方法內,處理這個結果集,返回一個物件。

      ArrayHandler
      
      ArrayListHandler
      
      BeanHandler
      
      BeanListHandler
      
      MapHandler
      
      MapListHandler
      
      ScalarHandler
      

學習了此元件的兩個類和一個介面以後,寫了下列程式碼供參考:

import java.sql.Connection;

import java.sql.SQLException;

import org.apache.commons.dbutils.QueryRunner;

import org.apache.commons.dbutils.handlers.BeanListHandler;

public class TestQueryRunner {

         public static void main(String[] args) throws SQLException {

                   // TODO Auto-generated method stub

                   //queryOracle();

                   update();

         }



         private static void update() throws SQLException{

                   QueryRunner runner = new QueryRunner();

                   Connection conn = DBManager.getConnection();

                   //刪除非 manager 中工資 低於 5000 的員工

                   String sql = "UPDATE examstudent SET student_name = ? WHERE flow_id = ?";

                   Object [] params = new Object[]{"Jerry", 5000};



                   runner.update(conn, sql, params);

         }



         private static void insert() throws SQLException{

                   QueryRunner runner = new QueryRunner();

                   Connection conn = DBManager.getConnection();

                   //刪除非 manager 中工資 低於 5000 的員工

                 String sql = "INSERT INTO examstudent(flow_id, type, id_card, exam_card, student_name, location, grade) VALUES(?, ?, ?, ?, ?, ?, ?)";

                   Object [] params = new Object[]{5000, 6, "身份證", "准考證", "Tom", "北京", 99};



                   runner.update(conn, sql, params);

         }



         private static void delete() throws SQLException{

                   QueryRunner runner = new QueryRunner();

                   Connection conn = DBManager.getConnection();

                   //刪除非 manager 中工資 低於 5000 的員工

                   String sql = "delete from employees " +

                                                "where employee_id not in " +

                                                "     (select distinct d.manager_id from departments d where d.manager_id is not null) " +

                                                "and salary < ?";

                   System.out.println(sql);

                   Object [] params = new Object[]{5000};



                   runner.update(conn, sql, params);

         }



         private static void queryOracle() throws SQLException{

                   QueryRunner runner = new QueryRunner();

                   Connection conn = DBManager.getConnection();

                   //oracle 中的別名可以別解析

                   String sql = "SELECT flow_id flowid, type, id_card idcard, exam_card examcard, student_name studentname, location, grade FROM examstudent";

                   Object obj = runner.query(conn, sql, new BeanListHandler(ExamStudent.class));

                   System.out.println(obj);

         }

         private static void query() throws SQLException {

                   //1. 建立一個 QueryRunner 的例項

                   QueryRunner runner = new QueryRunner();





                   Connection conn = DBManager.getConnection();

                   String sql = "SELECT id, name, address, phone FROM customers WHERE name LIKE ?";

                   Class type = Customer.class;

                   Object [] params = new Object[]{"%%"};



                   //2. 查詢操作

                   //conn: 查詢需要的資料庫連線, sql: 查詢使用的 sql 語句, rsh: 如何轉換查詢得到的結果集, params: 填補 sql 語句引數的陣列

                   Object obj = runner.query(conn, sql, new BeanListHandler(type), params);

                   //System.out.println("^^" + obj);



                   sql = "SELECT flow_id flowid, type, id_card idcard, exam_card examcard, student_name studentname, location, grade FROM examstudent";

                   type = ExamStudent.class;



                   obj = runner.query(conn, sql, new BeanListHandler(ExamStudent.class));

                   System.out.println(obj);

                   }

}

public class JdbcUtil {

private static ComboPooledDataSource dataSource =new ComboPooledDataSource();
public static ComboPooledDataSource getDataSource()
{
return dataSource;
}

}

src目錄下c3p0-config.xml

重要程式碼摘錄

從資料庫中取count(*)資料:

    int topicNum=0;

    QueryRunner runner= new QueryRunner(JdbcUtil.getDataSource());
    String sql ="select count(*) from topic where type_id= ? order by time desc";
    Object[] params={typeId};

    topicNum=(int)(long) runner.query(sql,new ScalarHandler(),params);

    return topicNum;

取一條資料 其中表的欄位名字和類的名字要對應相同:

         Topic newlyTopic=null;
         QueryRunner runner= new QueryRunner(JdbcUtil.getDataSource());
         String sql ="select * from topic where type_id= ? order by time desc";
         Object[] params={typeId};
         newlyTopic= runner.query(sql,new BeanHandler<Topic>(Topic.class),params);
         return newlyTopic;

取集合資料List<>返回 其中表的欄位名字和類的名字要對應相同:

         List<Topic> topicList=new ArrayList<Topic>();
         QueryRunner runner= new QueryRunner(JdbcUtil.getDataSource());
         String sql ="select * from topic where type_id= ? order by time desc";
         Object[] params={typeId};
         topicList=runner.query(sql, new BeanListHandler<Topic>(Topic.class),params);
         return topicList;

插入:

          QueryRunner runner= new QueryRunner(JdbcUtil.getDataSource());
          String sql ="insert into topic(name,author,content,time,type_id) values(?,?,?,?,?)";
          Object[] params={topic.getName(),topic.getAuthor(),topic.getContent(),topic.getTime(),topic.getTypeId()};
          try {
              //事務開始
              runner.update(sql,params);
              //事務提交
          } catch (SQLException e) {
              e.printStackTrace();
             //事務回滾
             throw e;
         }

更新:

         QueryRunner runner= new QueryRunner(JdbcUtil.getDataSource());
         String sql ="update topic set name=? , content=? , time=? where id= ?";
          Object[] params={topic.getName(),topic.getContent(),topic.getTime(),topic.getId()};
          try {
              //事務開始
             runner.update(sql,params);
              //事務提交
          } catch (SQLException e) {
              e.printStackTrace();
             //事務回滾
             throw e;
         }

轉載原地址