mysql筆記九——Dbutils的使用(增刪改查,事務)
阿新 • • 發佈:2019-01-03
DbUtils :提供如關閉連線、裝載JDBC驅動程式等常規工作的工具類,裡面的所有方法都是靜態的
DBUtils是java程式設計中的資料庫操作實用工具,小巧簡單實用
1.對於資料表的讀操作,他可以把結果轉換成List,Array,Set等java集合,便於程式設計師操作; 2.對於資料表的寫操作,也變得很簡單(只需寫sql語句) 3.可以使用資料來源,使用JNDI,資料庫連線池等技術來優化效能--重用已經構建好的資料庫連線物件,而不像php,asp那樣,費時費力的不斷重複的構建和析構這樣的物件。
DBUtils包括3個包:
org.apache.commons.dbutils
DBUtils封裝了對JDBC的操作,簡化了JDBC操作,可以少寫程式碼。
- org.apache.commons.dbutils
DbUtils 關閉連結等操作
QueryRunner 進行查詢的操作
- org.apache.commons.dbutils.handlers
1.ArrayHandler :將ResultSet中第一行的資料轉化成物件陣列
2.ArrayListHandler將ResultSet中所有的資料轉化成List ,List中存放的是Object[]
3.BeanHandler :將ResultSet中第一行的資料轉化成類物件
4.BeanListHandler :將ResultSet中所有的資料轉化成List,List中存放的是類物件
5.ColumnListHandler :將ResultSet中某一列的資料存成List,List中存放的是Object物件
6.KeyedHandler :將ResultSet中存成對映,key為某一列對應為Map。Map中存放的是資料
7.MapHandler :將ResultSet中第一行的資料存成Map對映
8.MapListHandler :將ResultSet中所有的資料存成List 。List中存放的是Map
9.ScalarHandler :將ResultSet中一條記錄的其中某一列的資料存成Object
- org.apache.commons.dbutils.wrappers
SqlNullCheckedResultSet :對ResultSet進行操作,改版裡面的值
StringTrimmedResultSet :去除ResultSet中中欄位的左右空格。Trim()
- 主要方法:
1.DbUtils類:啟動類
2.ResultSetHandler介面:轉換型別介面
3.MapListHandler類:實現類,把記錄轉化成List
BeanListHandler類:實現類,把記錄轉化成List,使記錄為JavaBean型別的物件
4.Query Runner類:執行SQL語句的類
另外,還有一個dbutils擴充套件包commons-dbutils-ext.jar,主要是對dbutils的擴充套件 功能,簡化了其操作
下面我通過程式碼來演示具體的操作:
增加操作
@Test//使用dbUtils工具的資料庫插入程式碼實現
public void dbUtilInsert() throws SQLException{
DataSource pool=C3p0Pool.getPool();
QueryRunner qr=new QueryRunner(pool);
//statement方式
String sql="insert into stud values('A001','張三')";
qr.update(sql);
//prepareStatement方式
String sql2="insert into stud(id,name) values(?,?)";
qr.update(sql2,"A002","Jack");
dbUtilQuery();
}
- 刪除操作
@Test//使用dbUtils工具的資料庫刪除程式碼實現
public void dbUtilDelete() throws SQLException{
DataSource pool=C3p0Pool.getPool();
QueryRunner qr=new QueryRunner(pool);
String sql="delete from stud where name='李白'";
qr.update(sql);
String sql2="delete from stud where name=?";
qr.update(sql2,"大哥");
dbUtilQuery();
}
- 修改操作
@Test//使用dbUtils工具的資料庫更改程式碼實現
public void dbUtilUpdate() throws SQLException{
DataSource pool=C3p0Pool.getPool();
QueryRunner qr=new QueryRunner(pool);
//statement方式
String sql="update stud set name='李白' where id='A002' ";
qr.update(sql);
//prepareStatement方式
String sql2="update stud set name=? where id=?";
qr.update(sql2,"大哥","A001");
dbUtilQuery();
}
每次增刪改操作後都會關閉連結,導致拿到的不是同一個連線
- 查詢操作
@Test//使用dbUtils工具的資料庫查詢程式碼實現,封裝成beanList
public void dbUtilQuery() throws SQLException{
DataSource ds=new ComboPooledDataSource();
QueryRunner qr=new QueryRunner(ds);
String sql="select * from stud";
List<Stud> studs=qr.query(sql, new BeanListHandler<Stud>(Stud.class) );
System.out.println(studs);
}
@Test///封裝成MapList
public void dbUtilQuery2() throws SQLException{
DataSource ds=new ComboPooledDataSource();
QueryRunner qr=new QueryRunner(ds);
String sql="select * from stud";
List<Map<String, Object>> studs=qr.query(sql, new MapListHandler() );
System.out.println(studs);
}
@Test//封裝成BeanList---查詢帶引數
public void dbUtilQuery3() throws Exception{
DataSource ds=new ComboPooledDataSource();
QueryRunner qr=new QueryRunner(ds);
String sql = "select id,name,address,age from person where name like ? and age>? ";
List<Person> persons = qr.query(sql,new BeanListHandler<Person>(Person.class),"%a%",25);
System.out.println(persons);
}
演示擴充套件包commons-dbutilss-ext.jar的功能
注意,要在JavaBean上加不同的註解
//注意,下面的用法要生效,必須給值物件添加註解
@Test//封裝成BeanList---直接通過JavaBean的位元組碼查詢
public void dbUtilQuery4() throws Exception{
DataSource ds=new ComboPooledDataSource();
ExtQueryRunner eqr=new ExtQueryRunner(ds);
//不用sql語句,,直接查詢Bean-List
List<Person> persons=eqr.query(Person.class);//給JavaBean物件加註解
System.out.println(persons);
}
@Test//封裝成BeanList---直接通過JavaBean的位元組碼查詢
public void dbUtilQuery5() throws Exception{
DataSource ds=new ComboPooledDataSource();
ExtQueryRunner eqr=new ExtQueryRunner(C3p0Pool.getCon());
Stud stud=new Stud();
stud.setId("A112");
stud.setName("Tom");
eqr.save(stud);//用save不能贏update
// eqr.update(stud);//update只能用於更新(看原始碼可以知道要在Stud的Id欄位加上@ID註解
dbUtilQuery2();
}
- 演示批處理功能
@Test//演示批處理功能
public void batch() throws SQLException{
DataSource pool=C3p0Pool.getPool();
QueryRunner qr=new QueryRunner(pool);
for(int i=1;i<=100;i++){
String sql="insert into stud(id,name) values(?,?)";
String str=("000"+i);
str=str.substring(str.length()-3);
String id1="A"+str;
String id2="B"+str;
Object[][] params={{id1,"Alice"+i},{id2,"Bob"+i}};
qr.batch(sql, params);
}
}
- 演示事務功能
@Test//演示事務功能
public void saveTx() {
//※注意,實現事務功能時,要傳入con物件,且多條語句共處一個事務時,要傳入同一個con物件。但如果不實現事務功能,可以有傳入con物件
DataSource pool=C3p0Pool.getPool();
QueryRunner qr=new QueryRunner(pool);
Connection con=null;
try {
con=C3p0Pool.getCon();
con.setAutoCommit(false);
//注意
qr.update(con,"insert into person(id,name,address,age) values(?,?,?,?)","P010","Jack","華南",50);
qr.update(con,"insert into person(id,name,address,age) values(?,?,?,?)","P010","Jack","華南","500");
con.commit();
} catch (SQLException e) {
try {
con.rollback();
System.out.println("事務回滾");
} catch (SQLException e1) {
e1.printStackTrace();
}
}finally{
if(con!=null){
try {
con.setAutoCommit(true);
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
C3p0Pool.getTl().set(null);
}
}
}
- 工具類
C3p0Pool.java
package c3p0PoolUse;
import java.sql.Connection;
import java.sql.SQLException;
import javax.sql.DataSource;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class C3p0Pool {
private static DataSource pool=new ComboPooledDataSource();//讀取配置檔案
private static ThreadLocal<Connection> tl=new ThreadLocal<Connection>();
public static Connection getCon() throws SQLException{
Connection con =tl.get();
if(con==null){
con=pool.getConnection();
tl.set(con);
}
return con;
}
public static DataSource getPool() {
return pool;
}
public static ThreadLocal<Connection> getTl() {
return tl;
}
}
- javaBean類
Stud.java(注意看註解)
package dbUtil;
import org.apache.commons.dbutils.ext.Column;
import org.apache.commons.dbutils.ext.Id;
import org.apache.commons.dbutils.ext.Table;
@Table(value="stud")
public class Stud {
@Id(value="id")
private String id;
@Column(value="NAME")
private String name;
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Stud other = (Stud) obj;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
return true;
}
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;
}
@Override
public String toString() {
return "Stud [id=" + id + ", name=" + name + "]";
}
}
Person.java(注意看註解)
package dbUtil;
import org.apache.commons.dbutils.ext.Column;
import org.apache.commons.dbutils.ext.Table;
@Table(value = "person")
public class Person {
private String id;
private String name;
@Column(value="address")//無效
private String addr;
private Integer age;
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 getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", addr=" + addr
+ ", age=" + age + "]";
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
return result;
}
@Override
public 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;
}
}
注意,需要匯入dbutils和c3p0所需的工具包
commons-dbutils-ext.jar
commons-dbutils-1.4.jar
c3p0-0.9.1.2.jar
c3p0-config.xml