javaweb學習筆記(十八):JDBC(4)
DbUtils元件
O/R Mapping:
廣義上,ORM指的是面向物件的物件模型和關係型資料庫的資料結構之間的相互轉換。
狹義上,ORM可以被認為是,基於關係型資料庫的資料儲存,實現一個虛擬的面向物件的資料訪問介面。理想情況下,基於這樣一個面向物件的介面,持久化一個OO物件應該不需要要了解任何關係型資料庫儲存資料的實現細節。
常用O-R Mapping對映工具:
①Hibernate②Ibatis③Commons DbUtils(只是對JDBC簡單封裝)
commons-dbutils 是 Apache 組織提供的一個開源 JDBC工具類庫,它是對JDBC
下載元件,引入jar檔案 : commons-dbutils-1.7.jar,參考javaweb學習筆記(十七):JDBC(3)中的BeanUtils元件的下載。
API:
- org.apache.commons.dbutils.QueryRunner
①QueryRunner(); 無參的構造方法
QueryRunner(DataSource ds)帶參的構造方法。如果呼叫DbUtils元件的操作資料庫方法, 沒有傳入連線物件,那麼在例項化QueryRunner物件的時候需要傳入資料來源物件:
②int update(Connection conn, String sql) throws SQLException等多個過載方法
③Int[] batch(Connection conn, String sql, Object[][] params) 等多個過載方法
- org.apache.commons.dbutils.ResultSetHandler介面
用於處理 java.sql.ResultSet,將資料按要求轉換為另一種形式。
①只有一個單獨的方法:Object handle (java.sql.ResultSet .rs)。
此介面提供的一些實現類物件:
1)BeanHandler: 將結果集中的第一行資料封裝到一個對應的JavaBean例項中。
2) BeanListHandler: 將結果集中的每一行資料都封裝到一個對應的JavaBean例項中,並存 放到List裡。
3) ArrayHandler, 查詢返回結果記錄的第一行,封裝對物件陣列, 即返回:Object[]
4) ArrayListHandler, 把查詢的每一行都封裝為物件陣列,再新增到list集合中
5) ScalarHandler 查詢返回結果記錄的第一行的第一列 (在聚合函式統計的時候用)
6) MapHandler 將結果集中的第一行資料封裝到一個Map裡,key是列名,value就是對 應的值
7)MapListHandler:將結果集中的每一行資料都封裝到一個Map裡,然後再存放到List
工具類:
(三)org.apache.commons.dbutils.DbUtils
提供如關閉連線、裝載JDBC驅動程式等常規工作的工具類,裡面的所有方法都是靜態的。
①public static void close() throws java.sql.SQLException:
有三個過載的關閉方法。這些方法檢查所提供的引數是不是NULL,如果不是的話,就 分別關閉Connection、Statement和ResultSet。
②public static void closeQuietly():
這一類方法不僅能在Connection、Statement和ResultSet為NULL情況下避免關閉,還 能隱藏一些在程式中丟擲的SQLEeception。
③public static void commitAndCloseQuietly(Connection conn):
用來提交連線,然後關閉連線,並且在關閉連線時不丟擲SQL異常。
④public static boolean loadDriver(java.lang.String driverClassName):
這一方裝載並註冊JDBC驅動程式,如果成功就返回true。使用該方法,不需要捕捉這 個異常ClassNotFoundException。
例:DBUtils元件演示:
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
import org.apache.commons.dbutils.DbUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.ResultSetHandler;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.MapHandler;
import org.junit.Test;
import entity.Student;
import util.jdbcUtil;
public class DbUtilsDemo {
@Test
//1.更新
public void test1() throws Exception{
String sql = "delete from student where id=?";
// 連線物件
Connection conn = jdbcUtil.getConnection();
// 建立DbUtils核心工具類物件
QueryRunner qr = new QueryRunner();
//查詢
qr.update(conn, sql,4);
// 關閉
DbUtils.close(conn);
}
@Test
//2.批處理
public void test2() throws Exception{
String sql="INSERT INTO student (NAME,age) VALUES(?,?);";
//獲取連線物件
Connection conn=jdbcUtil.getConnection();
//建立QueryRunner物件
QueryRunner qr=new QueryRunner();
//批量插入
qr.batch(conn, sql, new Object[][] {{"xiaohua001",24},{"xiaohua002",24}});
//使用工具類關閉
DbUtils.close(conn);
}
@Test
//3.查詢,自定義結果集封裝資料
public void test3() throws Exception{
String sql="SELECT * FROM student WHERE id=?;";
//獲取連線物件
Connection conn=jdbcUtil.getConnection();
//建立QueryRunner物件
QueryRunner qr=new QueryRunner();
//查詢
Student stu=qr.query(conn, sql, new ResultSetHandler<Student>() {
@Override
public Student handle(ResultSet rs) throws SQLException {
if(rs.next()) {
Student stu=new Student();
try {
stu.setName(rs.getString("name"));
stu.setAge(rs.getInt("age"));
return stu;
} catch (Exception e) {
e.printStackTrace();
}
}
return null;
}
},7);
//測試
System.out.println(stu);
//使用工具類關閉
DbUtils.close(conn);
}
@Test
//4.查詢,使用ResultSet介面的實現類物件封裝資料
//1)BeanHandler:查詢返回單個物件
public void test4() throws Exception{
String sql="SELECT * FROM student WHERE id=?;";
//獲取連線物件
Connection conn=jdbcUtil.getConnection();
//建立QueryRunner物件
QueryRunner qr=new QueryRunner();
//查詢
Student stu=qr.query(conn,sql,new BeanHandler<Student>(Student.class),7);
//測試
System.out.println(stu);
//使用工具類關閉
DbUtils.close(conn);
}
@Test
//4.查詢,使用ResultSet介面的實現類物件封裝資料
//2)BeanListHandler:查詢返回list集合,集合元素是指定的物件
public void test5() throws Exception{
String sql="SELECT * FROM student";
//獲取連線物件
Connection conn=jdbcUtil.getConnection();
//建立QueryRunner物件
QueryRunner qr=new QueryRunner();
//查詢
List<Student> list=qr.query(conn,sql,new BeanListHandler<Student>(Student.class));
//測試
System.out.println(list);
//使用工具類關閉
DbUtils.close(conn);
}
@Test
//4.查詢,使用ResultSet介面的實現類物件封裝資料
//2) ArrayHandler, 查詢返回結果記錄的第一行,封裝對物件陣列, 即返回:Object[]
//3) ArrayListHandler, 把查詢的每一行都封裝為物件陣列,再新增到list集合中
//4) ScalarHandler 查詢返回結果記錄的第一行的第一列 (在聚合函式統計的時候用)
//5)MapHandler:查詢結果的第一條記錄封裝為map
public void test6() throws Exception{
String sql="SELECT * FROM student";
//獲取連線物件
Connection conn=jdbcUtil.getConnection();
//建立QueryRunner物件
QueryRunner qr=new QueryRunner();
//查詢
//Object[] obj = qr.query(conn, sql, new ArrayHandler());
//List<Object[]> list = qr.query(conn, sql, new ArrayListHandler());
//Long num = qr.query(conn, sql, new ScalarHandler<Long>());
Map<String,Object> map=qr.query(conn,sql,new MapHandler());
//測試
System.out.println(map);
//使用工具類關閉
DbUtils.close(conn);
}
}
執行結果:
Student [name=xiaohua001, age=24, birth=null]
Student [name=xiaohua001, age=24, birth=null]
[Student [name=xiaohua, age=1, birth=null], Student [name=xiaohua, age=2, birth=null], Student [name=xiaohua1, age=24, birth=null], Student [name=xiaohua001, age=24, birth=null], Student [name=xiaohua002, age=24, birth=null], Student [name=xiaohua001, age=24, birth=null], Student [name=xiaohua002, age=24, birth=null], Student [name=xiaohua001, age=24, birth=null], Student [name=xiaohua002, age=24, birth=null], Student [name=xiaohua001, age=24, birth=null], Student [name=xiaohua002, age=24, birth=null]]
{id=2, name=xiaohua, age=1}