MySQL---数据库从入门走向大神系列(十五)-Apache的DBUtils框架使用
DBUtils簡介:
commons-dbutils 是 Apache 組織提供的一個開源 JDBC工具類庫,它是對JDBC的簡單封裝,學習成本極低,并且使用dbutils能極大簡化jdbc編碼的工作量,同時也不會影響程序的性能。因此dbutils成為很多不喜歡hibernate的公司的首選(嗯~商業競爭…..)。
commons-dbutilsAPI介紹:
org.apache.commons.dbutils.QueryRunner org.apache.commons.dbutils.ResultSetHandler工具類 org.apache.commons.dbutils.DbUtilsQueryRunner類講解
該類簡單化了SQL查詢,它與ResultSetHandler組合在一起使用可以完成大部分的數據庫操作,能夠大大減少編碼量。
QueryRunner類提供了兩個構造方法:
1、默認的構造方法
2、需要一個 javax.sql.DataSource 來作參數的構造方法。
QueryRunner類的主要方法
public Object query(Connection conn, String sql, Object[] params, ResultSetHandler rsh) throws SQLException:
執行一個查詢操作,在這個查詢中,對象數組中的每個元素值被用來作為查詢語句的置換參數。該方法會自行處理 PreparedStatement 和 ResultSet 的創建和關閉。
public Object query(String sql, Object[] params, ResultSetHandler rsh) throws SQLException:
幾乎與第一種方法一樣;唯一的不同在于它不將數據庫連接提供給方法,并且它是從提供給構造方法的數據源(DataSource) 或使用的setDataSource 方法中重新獲得 Connection。
public Object query(Connection conn, String sql, ResultSetHandler rsh) throws SQLException : 執行一個不需要置換參數的查詢操作。
public int update(Connection conn, String sql, Object[] params) throws SQLException
用來執行一個更新(插入、更新或刪除)操作。
public int update(Connection conn, String sql) throws SQLException:
用來執行一個不需要置換參數的更新操作。
JAR包準備:
commons-dbutils-1.6.jar(基本包):
http://commons.apache.org/proper/commons-dbutils/download_dbutils.cgi
commons-dbutils-ext.jar(擴展包):
https://github.com/chenhaoxiang/Java/tree/master/Database-support-package
代碼演示:
首先準備數據庫:
create database hncu character set utf8;use hncu;create table person(id varchar(30) primary key,name varchar(30),address varchar(30),age int );insert into person(id,name,address,age) values('P001','張三','湖南長沙',20); insert into person(id,name,address,age) values('P002','李四','中國北京',25); insert into person(id,name,address,age) values('P003','李白','武漢',56); insert into person(id,name,address,age) values('P004','張三豐','武當三',78); insert into person(id,name,address,age) values('P005','Tom','美國紐約',34); insert into person(id,name,address,age) values('P006','Jack','美國舊金山',28);Connection池是用的c3p0Pool類的:
http://blog.csdn.net/qq_26525215/article/details/52212260
不使用dbUtils工具的數據庫查詢代碼實現
@Test//原來不使用dbUtils工具的數據庫查詢代碼實現public void jdbcQuery() throws SQLException{List<Person> persons = new ArrayList<Person>();Connection con = C3p0Pool.getConnection();String sql = "select * from person";Statement st = con.createStatement();ResultSet rs = st.executeQuery(sql);while(rs.next()){Person p = new Person();p.setId(rs.getString("id"));p.setName(rs.getString("name"));p.setAddr(rs.getString("address"));p.setAge(Integer.parseInt(rs.getString("age")));persons.add(p);}for(Person p:persons){System.out.println(p);}}結果:
使用dbUtils工具的數據庫查詢代碼實現
BeanListHandler返回類型為List<>
@Testpublic void dbUtilsQuery() throws SQLException{QueryRunner run = new QueryRunner(C3p0Pool.getDataSource());String sql = "select * from person";List<Person> persons = run.query(sql,new BeanListHandler<Person>(Person.class));for(Person p:persons){System.out.println(p);}} 數據庫的字段名為:address、 public String addr;//這里的名字如果和數據庫的字段名不同。會出現讀取值為null的情況//如果要解決,把get和set函數的set/get***寫成和數據的字段名一樣就可以了。setAddress()/getAddress()//或者在查詢的時候取別名如:select id,name,address as addr ,age from person//但是最好還是和數據庫的字段名一樣比較好MapListHandler返回類型為List<Map<String,Object>>
而且注意,這個與前面的依賴person類的不同,這個不依賴person類,
也就是person的成員變量名可以和數據庫的字段名取不同。
DbUtils工具的使用演示: 增刪改–用update()
只演示 增,刪和改類似:
@Testpublic void save() throws SQLException{QueryRunner run = new QueryRunner(C3p0Pool.getDataSource());//statement方式//run.update("insert into person(id,name,address,age) values('P007','Rose','湖南長沙',22) ");//prepareStatement方式run.update("insert into person(id,name,address,age) values(?,?,?,?)", "P008","Marry","中國西安",34);}如果使用prepareStatement方式,注意參數個數或類型 與 “?”號必須匹配,否則會出異常 。
為 增添加事務處理:
@Testpublic void saveTx() throws SQLException{QueryRunner run = new QueryRunner(C3p0Pool.getDataSource());Connection con = C3p0Pool.getConnection();try {con.setAutoCommit(false);run.update(con, "insert into person(id,name,address,age) values(?,?,?,?)","P011","Tom","浙江杭州",24);run.update(con, "insert into person(id,name,address,age) values(?,?,?,?)","P012","Gimo","江蘇蘇州",45);con.commit();} catch (Exception e) {if(con!=null){con.rollback();System.out.println("事務回滾了...");}}finally{if(con!=null){con.setAutoCommit(true);con.close();}}}注意,實現事務功能時,要傳入con對象,且多條語句共處一個事務時,要傳入同一個con對象。但如果不實現事務功能,可以不傳入con對象。
查詢的結果集封裝
封裝成BeanList
@Testpublic void query2() throws SQLException{QueryRunner run = new QueryRunner(C3p0Pool.getDataSource());//封裝成BeanList: 如果值對象中的屬性名和表中的字段名不一致,那么該屬性的值返回的是null//解決方法是采用別名,或者修改set**/get**名List<Person> persons = run.query("select id,name,address addr,age from person ",new BeanListHandler<Person>(Person.class) );//用屬性名 當 字段別名for(Person p:persons){System.out.println(p);}}封裝成MapList
@Testpublic void query3() throws SQLException{QueryRunner run = new QueryRunner(C3p0Pool.getDataSource());String sql = "select * from person";List<Map<String, Object>> persons = run.query(sql, new MapListHandler());for(Map<String, Object> p:persons){System.out.println(p);}}封裝成BeanList—查詢帶參數
@Testpublic void query4() throws SQLException{QueryRunner run = new QueryRunner(C3p0Pool.getDataSource());String sql = "select id,name,address,age from person where name like ? and age > ?";List<Person> persons = run.query(sql, new BeanListHandler<Person>(Person.class),"%o%",34);for(Person p:persons){System.out.println(p);}}演示批處理功能
@Testpublic void batch() throws SQLException{QueryRunner run = new QueryRunner(C3p0Pool.getDataSource());for(int i=1;i<=100;i++){String sql = "insert into person values(?,?,?,?)";String str = "000"+i;str=str.substring(str.length()-3, str.length());String id1="A"+str;String id2="B"+str;String params[][]={{id1,"Alice"+i,"中國",i+""},{id2,"Bob"+i,"湖南",i+""}};run.batch(sql, params);}}演示擴展包commons-dbutilss-ext.jar的功能
封裝成BeanList—直接通過JavaBean的字節碼查詢所有
注意,下面的用法要生效,必須給值對象添加注解@Table(value = “person”)
@Test public void query5(){ExtQueryRunner run = new ExtQueryRunner(C3p0Pool.getDataSource());List<Person> persons = run.query(Person.class);//不用sql語句,,直接查詢Bean-Listfor(Person p:persons){System.out.println(p);}}封裝成JavaBean—直接通過JavaBean對象存儲進數據庫
@Testpublic void save3(){ExtQueryRunner run = new ExtQueryRunner(C3p0Pool.getDataSource());Person p = new Person();p.setId("A000");p.setName("梨子");p.setAddress("中國");p.setAge(20);run.save(p);//不用sql語句,直接存對象System.out.println(p);}注意:使用此功能時,需要在JavaBean對象中的每個成員變量上都加上@Column注解!!!
還有注意這里的JavaBean中的addr與數據庫的字段名address是不同的,所以需要在JavaBean對象的addr屬性上加上一句注解:
@Column(value=”address”)
Person.java
package cn.hncu.dbutils;import org.apache.commons.dbutils.ext.Column; import org.apache.commons.dbutils.ext.Table;/*** @author 陳浩翔** 2016-8-15*/ @Table(value = "person") public class Person {@Columnprivate String id;@Columnprivate String name;@Column(value="address")public String addr;//這里的名字如果和數據庫的字段名不同。會出現讀取值為null的情況//如果要解決,把get和set函數的set/get***寫成和數據的字段名一樣就可以了。//或者在查詢的時候取別名如:select id,name,address as addr ,age from person//但是最好還是和數據庫的字段名一樣比較好@Columnprivate Integer age;public Person() {super();}public String getId() {return id;}public void setId(String id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getAddress() {return addr;}public void setAddress(String addr) {this.addr = addr;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}@Overridepublic int hashCode() {final int prime = 31;int result = 1;result = prime * result + ((id == null) ? 0 : id.hashCode());return result;}@Overridepublic boolean equals(Object obj) {if (this == obj)return true;if (obj == null)return false;if (getClass() != obj.getClass())return false;Person other = (Person) obj;if (id == null) {if (other.id != null)return false;} else if (!id.equals(other.id))return false;return true;}@Overridepublic String toString() {return "[id=" + id + ", name=" + name + ", addr=" + addr+ ", age=" + age + "]";}}轉載請附上原文博客鏈接:
http://blog.csdn.net/qq_26525215
總結
以上是生活随笔為你收集整理的MySQL---数据库从入门走向大神系列(十五)-Apache的DBUtils框架使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 乡间小路的唯美句子162个
- 下一篇: Tomcat7基于Redis的Sessi