JavaWeb dbutils執(zhí)行sql命令并遍歷結(jié)果集時(shí)不能查到內(nèi)容的原因分析
JAVAWEB dbutils執(zhí)行sql命令并遍歷結(jié)果集時(shí)不能查到內(nèi)容的原因及處理方法如下所示:
遍歷結(jié)果集時(shí)只遍歷bean對(duì)象才會(huì)只輸出第一行那種內(nèi)容(第一行是輸出了UserEntity類實(shí)例化的對(duì)象),所以這里需要 re.getRepoTableName() 才能通過對(duì)象調(diào)用相對(duì)應(yīng)的內(nèi)容
這樣一來,就可以取到值了


PS:JavaWeb之DBUtils詳細(xì)介紹如下所示:
一、什么是DBUtils及作用
DBUtils是apache公司寫的。DBUtils是java編程中的數(shù)據(jù)庫操作實(shí)用工具,小巧簡(jiǎn)單實(shí)用。
DBUtils封裝了對(duì)JDBC的操作,簡(jiǎn)化了JDBC操作??梢陨賹懘a。
1.對(duì)于數(shù)據(jù)表的讀操作,他可以把結(jié)果轉(zhuǎn)換成List,Array,Set等java集合,便于程序員操作;
2.對(duì)于數(shù)據(jù)表的寫操作,也變得很簡(jiǎn)單(只需寫sql語句)
3.可以使用數(shù)據(jù)源,使用JNDI,數(shù)據(jù)庫連接池等技術(shù)來優(yōu)化性能--重用已經(jīng)構(gòu)建好的數(shù)據(jù)庫連接對(duì)象
二、DBUtils的三個(gè)核心對(duì)象
2.1、QueryRunner類
QueryRunner中提供對(duì)sql語句操作的API.它主要有三個(gè)方法:query() 用于執(zhí)行select,update() 用于執(zhí)行insert update delete,batch() 批處理。等下下面的會(huì)詳細(xì)的介紹這幾種方法的用法。
2.2、ResultSetHandler接口
用于定義select操作后,怎樣封裝結(jié)果集.它總共有9個(gè)常用的實(shí)現(xiàn)類,下面我會(huì)詳細(xì)的為大家介紹怎么去使用。
2.3、DbUtils類
它就是一個(gè)工具類,定義了關(guān)閉資源與事務(wù)處理的方法
三、怎么去使用DBUtils框架
3.1、使用步驟
導(dǎo)入相對(duì)應(yīng)的jar包
創(chuàng)建QueryRunner對(duì)象
使用query方法執(zhí)行select語句
使用ResultSetHandler封裝結(jié)果集
使用DbUtils類釋放資源
3.2、實(shí)例
注:本人使用的是C3P0連接池
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.ResultSetHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.junit.Test;
import com.jxlg.domain.User;
public class TestSelect {
@Test
public void testSelect(){
//創(chuàng)建一個(gè)QueryRunner對(duì)象
QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
try {
// new ResultSetHandler<List<User>>告訴我們?nèi)绾畏庋b結(jié)果集
List<User> list = qr.query("select * from user", new ResultSetHandler<List<User>>(){
@Override
//query語句執(zhí)行select語句后,結(jié)果一返回值的形式傳遞過來
public List<User> handle(ResultSet rs) throws SQLException {
List<User> list = new ArrayList<User>();
while(rs.next()){
User u = new User();
u.setId(rs.getInt(1));
u.setUsername(rs.getString(2));
u.setPassword(rs.getString(3));
u.setEmail(rs.getString(4));
u.setBirthday(rs.getDate(5));
list.add(u);
}
return list;
}
});
for (User user : list) {
System.out.println(user);
}
} catch (SQLException e) {
e.printStackTrace();
}
}
@Test
public void testSelect2(){
//創(chuàng)建一個(gè)QueryRunner對(duì)象
QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
try {
//執(zhí)行sql語句,返回結(jié)果
List<User> list = qr.query("select * from user where id=? and username=?", new BeanListHandler<User>(User.class),1,"tom");
for (User user : list) {
System.out.println(user);
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
四、DBUtils三個(gè)核心對(duì)象詳解
4.1、QueryRunner對(duì)象
4.1.1、構(gòu)造函數(shù)
new QueryRunner(); 它的事務(wù)可以手動(dòng)控制?! ?/p>
也就是說此對(duì)象調(diào)用的方法(如:query、update、batch)參數(shù)中要有Connection對(duì)象。
new QueryRunner(DataSource ds); 它的事務(wù)是自動(dòng)控制的。一個(gè)sql一個(gè)事務(wù)。
此對(duì)象調(diào)用的方法(如:query、update、batrch)參數(shù)中無需Connection對(duì)象。
4.1.2、常用方法





4.2、ResultSetHandler接口
4.2.1、它有9個(gè)結(jié)果處理器
ArrayHandler:適合取1條記錄。把該條記錄的每列值封裝到一個(gè)數(shù)組中Object[]
ArrayListHandler:適合取多條記錄。把每條記錄的每列值封裝到一個(gè)數(shù)組中Object[],把數(shù)組封裝到一個(gè)List中
ColumnListHandler:取某一列的數(shù)據(jù)。封裝到List中。
KeyedHandler:取多條記錄,每一條記錄封裝到一個(gè)Map中,再把這個(gè)Map封裝到另外一個(gè)Map中,key為指定的字段值。
MapHandler:適合取1條記錄。把當(dāng)前記錄的列名和列值放到一個(gè)Map中
MapListHandler:適合取多條記錄。把每條記錄封裝到一個(gè)Map中,再把Map封裝到List中
ScalarHandler:適合取單行單列數(shù)據(jù)
BeanHandler
BeanListHandler
4.2.2、實(shí)例
import static org.junit.Assert.*;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.ArrayHandler;
import org.apache.commons.dbutils.handlers.ArrayListHandler;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.ColumnListHandler;
import org.apache.commons.dbutils.handlers.KeyedHandler;
import org.apache.commons.dbutils.handlers.MapHandler;
import org.apache.commons.dbutils.handlers.MapListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import org.junit.Test;
import com.jxlg.domain.User;
public class TestResultSetHandler {
@Test
public void test1() {
//ArrayHandler:適合取1條記錄。把該條記錄的每列值封裝到一個(gè)數(shù)組中Object[]
QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
try {
Object[] o = qr.query("select * from user where id=?", new ArrayHandler(),5);
for (Object object : o) {
System.out.println(object);
}
} catch (SQLException e) {
e.printStackTrace();
}
}
@Test
public void test2() throws SQLException {
//ArrayListHandler:適合取多條記錄。把每條記錄的每列值封裝到一個(gè)數(shù)組中Object[],把數(shù)組封裝到一個(gè)List中
QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
List<Object[]> list = qr.query("select * from user", new ArrayListHandler());
for (Object[] objects : list) {
for (Object object : objects) {
System.out.println(object);
}
System.out.println("----------------------");
}
}
@Test
public void test3() throws SQLException {
//ColumnListHandler:取某一列的數(shù)據(jù)。封裝到List中
QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
List<Object> list = qr.query("select username,password from user ", new ColumnListHandler(1));
for (Object object : list) {
System.out.println(object);
}
}
@Test
public void test4() throws SQLException {
//KeyedHandler:取多條記錄,每一條記錄封裝到一個(gè)Map中,
//再把這個(gè)Map封裝到另外一個(gè)Map中,key為指定的字段值。
QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
//大的Map的key是表中的某列數(shù)據(jù),小的Map的key是表的列名,所以大的map的key用的是Object類型,小的是String。
Map<Object, Map<String, Object>> map = qr.query("select * from user", new KeyedHandler(1));
for (Map.Entry<Object, Map<String,Object>> m : map.entrySet()) {
System.out.println(m);//就是id至,因?yàn)樵O(shè)置了“1”.
for (Map.Entry<String, Object> mm : m.getValue().entrySet()) {
System.out.println(mm);//取出小map中的key和value
}
System.out.println("--------------------");
}
}
@Test
public void test5() throws SQLException {
//MapHandler:適合取1條記錄。把當(dāng)前記錄的列名和列值放到一個(gè)Map中
QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
Map<String, Object> map = qr.query("select * from user", new MapHandler());
for (Map.Entry<String, Object> m : map.entrySet()) {
System.out.println(m.getKey()+"\t"+m.getValue());
//默認(rèn)取第一行數(shù)據(jù),需要去其它行用where加條件
}
}
@Test
public void test6() throws SQLException {
//MapListHandler:適合取多條記錄。把每條記錄封裝到一個(gè)Map中,再把Map封裝到List中
QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
List<Map<String, Object>> list = qr.query("select * from user", new MapListHandler());
for (Map<String, Object> map : list) {
for (Map.Entry<String, Object> m : map.entrySet()) {
System.out.println(m);
}
System.out.println("-----------");
}
}
@Test
public void test7() throws SQLException {
//ScalarHandler:適合取單行單列數(shù)據(jù)
QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
Object o = qr.query("select * from user", new ScalarHandler(2));
System.out.println(o);
}
@Test
public void test8() throws SQLException {
//BeanHandler:適合取單行單列數(shù)據(jù)
QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
User user = qr.query("select * from user", new BeanHandler<User>(User.class));
System.out.println(user);
}
}
五、使用DBUtils做一個(gè)增刪改查的例子
import static org.junit.Assert.*;
import java.sql.SQLException;
import java.util.Date;
import javax.crypto.spec.OAEPParameterSpec;
import org.apache.commons.dbutils.QueryRunner;
import org.junit.Test;
public class TestInCURD {
@Test
public void testInsert() {
//創(chuàng)建一個(gè)QueryRunner對(duì)象
QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
try {
qr.update("insert into user (username,password,email,birthday)values(?,?,?,?)", "guapi","4646","guapi@163.com",new Date());
} catch (SQLException e) {
e.printStackTrace();
}
}
@Test
public void testUpdate() {
//創(chuàng)建一個(gè)QueryRunner對(duì)象
QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
try {
qr.update("update user set username=?,password=? where id=4 ", "meizimeizi","520520");
} catch (SQLException e) {
e.printStackTrace();
}
}
@Test
public void testDelete() {
//創(chuàng)建一個(gè)QueryRunner對(duì)象
QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
try {
qr.update("delete from user where id=? ",4);
} catch (SQLException e) {
e.printStackTrace();
}
}
@Test
public void testBatch() {
//創(chuàng)建一個(gè)QueryRunner對(duì)象
QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
try {
Object[][] params = new Object[10][]; //高維代表執(zhí)行多少次sql語句
for(int i =0;i<params.length;i++){
params[i] =new Object[]{"guapi"+i,"4646","guapi@163.com",new Date()};
}
qr.batch("insert into user (username,password,email,birthday)values(?,?,?,?)", params );
} catch (SQLException e) {
e.printStackTrace();
}
}
}
總結(jié)
以上所述是小編給大家介紹的JavaWeb dbutils執(zhí)行sql命令并遍歷結(jié)果集時(shí)不能查到內(nèi)容的原因分析,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家的支持!
相關(guān)文章
SpringBoot使用Apache?POI實(shí)現(xiàn)導(dǎo)入導(dǎo)出Excel文件
Apache?POI?是一個(gè)強(qiáng)大的?Java?庫,用于處理?Microsoft?Office?文檔,下面我們來看看SpringBoot如何使用Apache?POI導(dǎo)入導(dǎo)出Excel文件功能吧2025-01-01
利用Redis實(shí)現(xiàn)延時(shí)處理的方法實(shí)例
這篇文章主要給大家介紹了關(guān)于利用Redis實(shí)現(xiàn)延時(shí)處理的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用Redis具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03
Java面向?qū)ο缶幊讨衒inal關(guān)鍵字的使用方法詳解
這篇文章主要介紹了Java面向?qū)ο缶幊讨衒inal關(guān)鍵字的使用方法詳解,包括對(duì)內(nèi)部匿名類無法訪問外面的非 final 的變量問題的解讀,需要的朋友可以參考下2016-06-06
java實(shí)現(xiàn)微信企業(yè)付款到個(gè)人功能
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)微信企業(yè)付款到個(gè)人功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-09-09

