1. 程式人生 > >java中QueryRunner用法(增、刪、改、查詳解)

java中QueryRunner用法(增、刪、改、查詳解)

1.匯入相應的JARs

MySQL驅動jar包:mysql-connector-Java-5.1.28-bin.jar

C3P0需要的jar包:c3p0-0.9.2-pre1.jar和mchange-commons-0.2.jar

2.在src下新增C3P0配置檔案:c3p0-config.xml

[html] view plain copy  print?
  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <c3p0-config>
  3.     <default-config>
  4.         <propertyname="jdbcUrl"
    >jdbc:mysql://localhost:3306/grain</property>
  5.         <propertyname="driverClass">com.mysql.jdbc.Driver</property>
  6.         <propertyname="user">root</property>
  7.         <propertyname="password">123</property>
  8.         <propertyname="acquireIncrement">3</property
    >
  9.         <propertyname="initialPoolSize">10</property>
  10.         <propertyname="minPoolSize">2</property>
  11.         <propertyname="maxPoolSize">10</property>
  12.     </default-config>
  13. </c3p0-config>

3.封裝為JdbcUtils,用來獲取Connection物件,以及開啟和關閉事務。有以下介面:

  • Connection getConnection():從c3p0連線池獲取Connection物件,所以需要提供c3p0-config.xml配置檔案;

  • beginTransaction():為當前執行緒開啟事務;

  • commitTransaction():提交當前執行緒的事務;

  • rollbackTransaction():回滾當前執行緒的事務;

  • releaseConnection(Connection):如果引數連線物件不是當前事務的連線物件,那麼關閉它,否則什麼都不做;

4.測試JdbcUtils

[java] view plain copy  print?
  1. @Test
  2.     publicvoid testJdbcUtils() throws SQLException {  
  3.         Connection con = JdbcUtils.getConnection();  
  4.         System.out.println(con);  
  5.         JdbcUtils.releaseConnection(con);  
  6.         System.out.println(con.isClosed());  
  7.     }  

5.封裝TxQueryRunner,使用JdbcUtils連線資料庫,使用QueryRunner簡化資料庫操作

引入jar包:commons-dbutils-1.4.jar,有以下介面:

  • int[] batch(String sql, Object[][] params):執行批處理,引數sql是SQL語句模板,params為引數;

  • T query(String sql, ResultSetHandler<T> rh):執行查詢,執行查詢,引數sql為要執行的查詢語句模板,rh是結果集處理,用來把結果集對映成你想要的結果;

  • T query(String sql, ResultSetHandler<T> rh, Object… params):執行查詢,引數sql為要執行的查詢語句模板,rh是結果集處理,用來把結果集對映成你想要的結果,params是sql語句的引數;

  • int update(String sql):執行增、刪、改語句,引數sql是要執行的SQL語句;

  • int update(Stringsql, Object param):執行增、刪、改語句,引數sql是要執行的SQL語句,引數param是引數(一個引數);

  • int update(String sql, Object… params):執行增、刪、改語句,引數sql是要執行的SQL語句,引數params是引數(多個引數);
6.測試TxQueryRunner [java] view plain copy  print?
  1. @Test
  2.     publicvoid testUpdate() throws SQLException {  
  3.         String sql = "insert into user_info(uid,uname,phonenumber,region,address,postcode) values(?,?,?,?,?,?)";  
  4.         Object[] params = {"0001","xiaoming","12345678912","China","Beijing","123456"};  
  5.         QueryRunner q = new TxQueryRunner();  
  6.         q.update(sql,params);         
  7.     }  
  8.     @Test
  9.     publicvoid testUpdate2() throws SQLException {  
  10.         try{  
  11.             JdbcUtils.beginTransaction();  
  12.             String sql = "insert into user_info(uid,uname,phonenumber,region,address,postcode) values(?,?,?,?,?,?)";  
  13.             Object[] params1 = {"0002","xiaoming","12345678912","China","Beijing","123456"};  
  14.             Object[] params2 = {"0003","xiaoming","12345678912","China","Beijing","123456"};  
  15.             QueryRunner q = new TxQueryRunner();  
  16.             q.update(sql,params1);  
  17.             q.update(sql,params2);            
  18.             JdbcUtils.commitTransaction();  
  19.         }catch(Exception e){  
  20.             try{  
  21.                 JdbcUtils.rollbackTransaction();  
  22.             }catch(SQLException ee){  
  23.             }  
  24.         }  
  25.     }  
  26.     //單行結果集,BeanHandler
  27.     @Test
  28.     publicvoid testQuery() throws SQLException{  
  29.         String sql = "select * from user_info where uid = ?";  
  30.         QueryRunner q = new TxQueryRunner();  
  31.         User u = q.query(sql, new BeanHandler<User>(User.class),"0001");  
  32.         System.out.println(u);  
  33.     }  
  34.     //多行結果集,BeanListHandler
  35.     @Test
  36.     publicvoid testQuery2() throws SQLException{  
  37.         String sql = "select * from user_info";  
  38.         QueryRunner q = new TxQueryRunner();  
  39.         List<User> list_u = q.query(sql, new BeanListHandler<User>(User.class));  
  40.         System.out.println(list_u);  
  41.     }  
  42.     //單行結果集,map
  43.     @Test
  44.     publicvoid testQuery3() throws SQLException{  
  45.         String sql = "select * from user_info where uid = ?";  
  46.         QueryRunner q = new TxQueryRunner();  
  47.         Map<String,Object> map_u = q.query(sql, new MapHandler(),"0001");  
  48.         System.out.println(map_u);  
  49.     }  
  50.     //多行結果集,List<map>
  51.     @Test
  52.     publicvoid testQuery4() throws SQLException{  
  53.         String sql = "select * from user_info";  
  54.         QueryRunner q = new TxQueryRunner();  
  55.         List<Map<String,Object>> list_map_u = q.query(sql, new MapListHandler());  
  56.         System.out.println(list_map_u);  
  57.     }  
  58.     //單行單列,ScalarHandler
  59.     @Test
  60.     publicvoid testQuery5() throws SQLException{  
  61.         String sql = "select count(*) from user_info";  
  62.         QueryRunner q = new TxQueryRunner();  
  63.         Object obj = q.query(sql, new ScalarHandler());  
  64.         //select count(*)的結果強轉成Number
  65.         Number n = (Number)obj;  
  66.         System.out.println(n.longValue());  
  67.     }  

正文:JAVA中DBUtils的QueryRunner類實現增刪改查詳解 

 
一.QueryRunner類實現增刪改  
public static void main(String[] args) throws Exception{ //使用自己的工具類,獲取資料庫的連線物件 

Connection conn = MyJDBCUtils.getConnection(); //建立QueryRunner類物件 
QueryRunner qr = new QueryRunner(); 
String sql = "UPDATE gjp_ledger set money=? , ldesc=? where lid=?"; 

Object[] params = {998,"買鑽石",3}; 

int result = qr.update(conn, sql, params); 

System.out.println(result); DbUtils.close(conn);

 }  
二.QueryRunner類獲取查詢結果集ResultSetHandler    

 1.常用Handler  * ArrayHandler 將結果集第一行轉成物件陣列  
                    public static void main(String[] args) throws Exception{    

 Connection conn = MyJDBCUtils.getConnection();    

 String sql = "SELECT * FROM gjp_ledger where lid=?";     //結果集處理方式,ArrayHandler 第一行轉成物件陣列  

   QueryRunner qr = new QueryRunner(); 
    Object[] objects = qr.query(conn, sql, new ArrayHandler(),3);  

   for(Object obj : objects){    

 System.out.println(obj);   

  }    

 }  
* ArrayListHandler 將結果集中的每一行資料都轉成一個物件陣列,再將轉成的多個物件陣列存放到List中  
public static void main(String[] args) throws Exception{     

 Connection conn = MyJDBCUtils.getConnection(); 

String sql = "SELECT * FROM gjp_ledger";

 QueryRunner qr = new QueryRunner(); 
//執行query方法,傳遞連線物件,SQL語句,結果集處理方式ArrayListHandler 

List<Object[]> list = qr.query(conn, sql, new ArrayListHandler());

 for(Object[] objects : list)

{ for(Object obj : objects){ 

System.out.print(obj+" "); 


System.out.println(); 

}

 }  
* BeanHandler 將結果集第一行資料封裝到一個對應的業務類例項中  (1): 定義業務資料類Ledger(實體類,javaBean) 

public class Ledger { 
//要生成空參、有參構造、set和get方法、toString方法 

private int lid; 

private String parent; 

private double money; 

private int sid;

 private String account; 

private String createtime;

 private String ldesc; 

 } 
 (2)測試案例程式碼 
public static void main(String[] args) throws Exception{

Connection conn = MyJDBCUtils.getConnection(); 

String sql = "SELECT * FROM gjp_ledger";

 QueryRunner qr = new QueryRunner(); 
//BeanHandler泛型 ,構造方法(和反射有關係的物件) 
Ledger legder = qr.query(conn, sql, new BeanHandler<Ledger>(Ledger.class));

 System.out.println(legder);

 }  
* BeanListHandler 將結果集中的每一行資料都封裝到一個對應的業務類例項中,再將多個業務類例項物件存放到List裡。  
public static void main(String[] args) throws Exception {

Connection conn = MyJDBCUtils.getConnection(); 

String sql = "SELECT * FROM gjp_ledger"; 
//結果集處理方式,BeanListHandler 每一行資料封裝到業務資料類中

QueryRunner qr = new QueryRunner(); 
List<Ledger> list = qr.query(conn, sql, new BeanListHandler<Ledger>(Ledger.class)); 

for(Ledger ledger : list)

System.out.println(ledger);

 } 

}  
* MapHandler 將結果集中的第一行資料封裝到一個Map中,key是列名,value是對應的值。  
public static void main(String[] args) throws Exception {

Connection conn = MyJDBCUtils.getConnection(); 

String sql = "SELECT * FROM gjp_ledger"; 
//結果集處理方式,MapHandler 封裝到一個Map集合中,儲存鍵值對集合

QueryRunner qr = new QueryRunner(); 
Map<String,Object> map = qr.query(conn, sql,new MapHandler()); 

for(String key : map.keySet()){ 
System.out.println(key+"  "+map.get(key));

 }

 }  
* MapListHandler 將結果集中的每一行資料都封裝到一個Map裡,然後再將多個Map存放到List  
public static void main(String[] args) throws Exception{

Connection conn = MyJDBCUtils.getConnection(); 

String sql = "SELECT * FROM gjp_ledger"; 
//結果集處理方式,MapListHandler 資料中的每一行封裝成Map集合,多個Map集合儲存到List集合 
QueryRunner qr = new QueryRunner(); 
List<Map<String,Object>> list = qr.query(conn, sql,new MapListHandler()); 

for(Map<String,Object> map : list){ 

for(String key : map.keySet()){ 
System.out.print(key+" "+map.get(key)); 


System.out.println();
}

 }  

 *  ColumnListHandler                     將結果集中某一列的資料存放到List中  
public static void main(String[] args)throws Exception {     

Connection conn = MyJDBCUtils.getConnection(); 

String sql = "SELECT * FROM gjp_ledger"; 
//結果集處理方式,ColumnListHandler 資料中一個列,資料儲存到List集合 

QueryRunner qr = new QueryRunner(); //ColumnListHandler構造方法中,寫字串列名 
List<Double> list = qr.query(conn, sql,new ColumnListHandler<Double>("money"));

 for(Double money : list){ System.out.println(money);

 }

 }  
* ScalarHandler 進行單值查詢,如:select count(*) from                                  
 public static void main(String[] args) throws Exception{ 

Connection conn = MyJDBCUtils.getConnection(); 

String sql = "SELECT count(*)as count FROM gjp_ledger"; //結果集處理方式,ScalarHandler 滿足只有1列,1個數據 

QueryRunner qr = new QueryRunner(); //ColumnListHandler構造方法中,寫字串列名 
Long i = qr.query(conn, sql, new ScalarHandler<Long>("count"));

 System.out.println(i);

 }   
 * KeyedHandler將結果集中的每一行資料都封裝為一個Map(List<Map>),再將這些Map再存到一個Map裡,其key為KeyedHandler指定的列,如果沒有指定則使用第一個查詢的欄位。  
public static void main(String[] args) throws Exception{

Connection conn = MyJDBCUtils.getConnection(); 

String sql = "SELECT *  FROM gjp_ledger"; //結果集處理方式,KeyedHandler 

QueryRunner qr = new QueryRunner(); 

Map <String,Map<String,Object>> map= qr.query(conn, sql, new KeyedHandler<String>("lid")); 

System.out.println(map); 

}