DBUtils(DataSourceUtils提供數據源)
DBUtils是apache組織的一個工具類,jdbc的框架,更方便我們使用
使用步驟:
1.導入jar包(commons-dbutils-1.4.jar,c3p0-0.9.1.2.jar)
1.1導入DataSourceUtils類(如何導入並配置)
2.創建一個queryrunner類
queryrunner作用:操作sql語句
構造方法:
new QueryRunner(Datasource ds);//ds爲一個數據源 eg:DataSourceUtils.getDataSource();
3.編寫sql
4.執行sql
uery(..):執行r操作
update(…):執行cud操作
(1)導入步驟:(我使用的數據庫是MySQL)
一.導入jar包(c3p0-0.9.1.2.jar)
c3p0-0.9.1.2.jar
commons-dbutils-1.4.jar
mysql-connector-java-5.0.8-bin.jar
(2).其實只是使用的話,只看兩個類(DbUtils 和QueryRunner)和一個接口(ResultSethandler)就可以了。
1,DbUtils
DbUtils是一個爲做一些諸如關閉連接、裝載JDBC驅動程序之類的常規工作提供有用方法的類,它裏面所有的方法都是靜態的。
這個類裏的重要方法有:
close():
DbUtils類提供了三個重載的關閉方法。這些方法檢查所提供的參數是不是NULL,
如果不是的話,它們就關閉連接、聲明和結果集(ResultSet)。
CloseQuietly:
CloseQuietly這一方法不僅能在連接、聲明或者結果集(ResultSet)爲NULL情況下避免關閉,
還能隱藏一些在程序中拋出的SQLEeception。如果你不想捕捉這些異常的話,這對你是非常有用的。
在重載CloseQuietly方法時,特別有用的一個方法是closeQuietly(Connection conn,Statement stmt,ResultSet rs),
這是因爲在大多數情況下,連接、聲明和結果集(ResultSet)是你要用的三樣東西,而且在最後的塊你必須關閉它們。
使用這一方法,你最後的塊就可以只需要調用這一方法即可。
CommitAndCloseQuietly(Connection conn):
這一方法用來提交連接,然後關閉連接,並且在關閉連接時不向上拋出在關閉時發生的一些SQL異常。
LoadDriver(String driveClassName):這一方法裝載並註冊JDBC驅動程序,如果成功就返回TRUE。
使用這種方法,你不需要去捕捉這個異常ClassNotFoundException。使用loadDrive方法,編碼就變得更容易理解,
你也就得到了一個很好的Boolean返回值,這個返回值會告訴你驅動類是不是已經加載成功了。
2,ResultSetHandler
這一接口執行處理一個jaca.sql.ResultSet,將數據轉變並處理爲任何一種形式,這樣有益於其應用而且使用起來更容易。
這一組件提供了ArrayHandler, ArrayListHandler, BeanHandler, BeanListHandler, MapHandler, MapListHandler, and ScalarHandler等執行程序。
ResultSetHandler接口提供了一個單獨的方法:Object handle (java.sql.ResultSet .rs)。
因此任何ResultSetHandler 的執行需要一個結果集(ResultSet)作爲參數傳入,然後才能處理這個結果集,再返回一個對象。
因爲返回類型是java.lang.Object,所以除了不能返回一個原始的Java類型之外,其它的返回類型並沒有什麼限制。
如果你發現這七個執行程序中沒有任何一個提供了你想要的服務,你可以自己寫執行程序並使用它。
3,QreryRunner
這個類使執行SQL查詢簡單化了,它與ResultSetHandler串聯在一起有效地履行着一些平常的任務,它能夠大大減少你所要寫的編碼。
QueryRunner類提供了兩個構造器:其中一個是一個空構造器,另一個則拿一個 javax.sql.DataSource 來作爲參數。
因此,在你不用爲一個方法提供一個數據庫連接來作爲參數的情況下,提供給構造器的數據源(DataSource) 被用來獲得一個新的連接並將繼續進行下去。
這一類中的重要方法包括以下這些:
query(Connection conn, String sql, Object[] params, ResultSetHandler rsh):
這一方法執行一個選擇查詢,在這個查詢中,對象陣列的值被用來作爲查詢的置換參數。
這一方法內在地處理PreparedStatement 和ResultSet 的創建和關閉。
ResultSetHandler對把從 ResultSet得來的數據轉變成一個更容易的或是應用程序特定的格式來使用。
query(String sql, Object[] params, ResultSetHandler rsh):
這幾乎與第一種方法一樣;唯一的不同在於它不將數據庫連接提供給方法,
並且它是從提供給構造器的數據源(DataSource) 或使用的setDAtaSource 方法中重新獲得的。
query(Connection conn, String sql, ResultSetHandler rsh):
這執行一個不要參數的選擇查詢。
update(Connection conn, String sql, Object[] params):
這一方法被用來執行一個插入、更新或刪除操作。對象陣列爲聲明保存着置換參數。
到此爲止,說明工作就差不多了,下面就實戰一下,進入DBUtils使用詳解二。
一,使用遵從以下步驟:
1.加載JDBC驅動程序類,並用DriverManager來得到一個數據庫連接conn。
2.實例化 QueryRunner,得到實例化對象qRunner。
3. qRunner.update()方法,執行增改刪的sql命令,
qRunner.query()方法,得到結果集。
二,實戰
1,連接類ConnectDb:import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Connection;
public class ConnectDb {
private static String driveClassName = "com.mysql.jdbc.Driver";
private static String url = "jdbc:mysql://192.168.1.161:3306/test?useUnicode=true&characterEncoding=utf8";
private static String user = "root";
private static String password = "e-playnow";
public static Connection Connect(){
Connection conn = null;
//load driver
try {
Class.forName(driveClassName);
} catch (ClassNotFoundException e) {
System.out.println("load driver failed!");
e.printStackTrace();
}
//connect db
try {
conn = DriverManager.getConnection(url, user, password);
} catch (SQLException e) {
System.out.println("connect failed!");
e.printStackTrace();
}
return conn;
}
}
數據庫表:
CREATE TABLE `user` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(50) NOT NULL,
`age` tinyint(10) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8
Bean:
package Beans;
public class UserBean {
private int id;
private String name;
private int age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
2,Demo:
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;
import org.apache.commons.dbutils.DbUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import Beans.UserBean;
public class main {
public static void main(String[] args) throws SQLException {
insert_test();
del_test();
}
static void insert_test() throws SQLException{
Connection conn = ConnectDb.Connect();
//創建SQL執行工具
QueryRunner qRunner = new QueryRunner();
//執行SQL插入
int n = qRunner.update(conn, "insert into user(name,age) values('xxx',22)");
System.out.println("成功插入" + n + "條數據!");
//關閉數據庫連接
DbUtils.closeQuietly(conn);
}
static void select_test() throws SQLException{
Connection conn = ConnectDb.Connect();
//創建SQL執行工具
QueryRunner qRunner = new QueryRunner();
@SuppressWarnings("unchecked")
List<UserBean> list = (List<UserBean>) qRunner.query(conn, "select id,name,age from user", new BeanListHandler(UserBean.class));
//輸出查詢結果
for (UserBean user : list) {
System.out.println(user.getAge());
}
//關閉數據庫連接
DbUtils.closeQuietly(conn);
}
static void update_test() throws SQLException{
Connection conn = ConnectDb.Connect();
//創建SQL執行工具
QueryRunner qRunner = new QueryRunner();
//執行SQL插入
int n = qRunner.update(conn, "update user set name = 'xxx',age=28");
System.out.println("成功更新" + n + "條數據!");
//關閉數據庫連接
DbUtils.closeQuietly(conn);
}
static void del_test() throws SQLException{
Connection conn = ConnectDb.Connect();
//創建SQL執行工具
QueryRunner qRunner = new QueryRunner();
//執行SQL插入
int n = qRunner.update(conn, "DELETE from user WHERE name='xxx';");
System.out.println("刪除成功" + n + "條數據!");
//關閉數據庫連接
DbUtils.closeQuietly(conn);
}
}