JavaWeb dbutils執(zhí)行sql命令并遍歷結(jié)果集時不能查到內(nèi)容的原因分析
JAVAWEB dbutils執(zhí)行sql命令并遍歷結(jié)果集時不能查到內(nèi)容的原因及處理方法如下所示:
遍歷結(jié)果集時只遍歷bean對象才會只輸出第一行那種內(nèi)容(第一行是輸出了UserEntity類實(shí)例化的對象),所以這里需要 re.getRepoTableName() 才能通過對象調(diào)用相對應(yīng)的內(nèi)容
這樣一來,就可以取到值了
PS:JavaWeb之DBUtils詳細(xì)介紹如下所示:
一、什么是DBUtils及作用
DBUtils是apache公司寫的。DBUtils是java編程中的數(shù)據(jù)庫操作實(shí)用工具,小巧簡單實(shí)用。
DBUtils封裝了對JDBC的操作,簡化了JDBC操作。可以少寫代碼。
1.對于數(shù)據(jù)表的讀操作,他可以把結(jié)果轉(zhuǎn)換成List,Array,Set等java集合,便于程序員操作;
2.對于數(shù)據(jù)表的寫操作,也變得很簡單(只需寫sql語句)
3.可以使用數(shù)據(jù)源,使用JNDI,數(shù)據(jù)庫連接池等技術(shù)來優(yōu)化性能--重用已經(jīng)構(gòu)建好的數(shù)據(jù)庫連接對象
二、DBUtils的三個核心對象
2.1、QueryRunner類
QueryRunner中提供對sql語句操作的API.它主要有三個方法:query() 用于執(zhí)行select,update() 用于執(zhí)行insert update delete,batch() 批處理。等下下面的會詳細(xì)的介紹這幾種方法的用法。
2.2、ResultSetHandler接口
用于定義select操作后,怎樣封裝結(jié)果集.它總共有9個常用的實(shí)現(xiàn)類,下面我會詳細(xì)的為大家介紹怎么去使用。
2.3、DbUtils類
它就是一個工具類,定義了關(guān)閉資源與事務(wù)處理的方法
三、怎么去使用DBUtils框架
3.1、使用步驟
導(dǎo)入相對應(yīng)的jar包
創(chuàng)建QueryRunner對象
使用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)建一個QueryRunner對象 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)建一個QueryRunner對象 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三個核心對象詳解
4.1、QueryRunner對象
4.1.1、構(gòu)造函數(shù)
new QueryRunner(); 它的事務(wù)可以手動控制?! ?/p>
也就是說此對象調(diào)用的方法(如:query、update、batch)參數(shù)中要有Connection對象。
new QueryRunner(DataSource ds); 它的事務(wù)是自動控制的。一個sql一個事務(wù)。
此對象調(diào)用的方法(如:query、update、batrch)參數(shù)中無需Connection對象。
4.1.2、常用方法
4.2、ResultSetHandler接口
4.2.1、它有9個結(jié)果處理器
ArrayHandler:適合取1條記錄。把該條記錄的每列值封裝到一個數(shù)組中Object[]
ArrayListHandler:適合取多條記錄。把每條記錄的每列值封裝到一個數(shù)組中Object[],把數(shù)組封裝到一個List中
ColumnListHandler:取某一列的數(shù)據(jù)。封裝到List中。
KeyedHandler:取多條記錄,每一條記錄封裝到一個Map中,再把這個Map封裝到另外一個Map中,key為指定的字段值。
MapHandler:適合取1條記錄。把當(dāng)前記錄的列名和列值放到一個Map中
MapListHandler:適合取多條記錄。把每條記錄封裝到一個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條記錄。把該條記錄的每列值封裝到一個數(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:適合取多條記錄。把每條記錄的每列值封裝到一個數(shù)組中Object[],把數(shù)組封裝到一個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:取多條記錄,每一條記錄封裝到一個Map中, //再把這個Map封裝到另外一個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)前記錄的列名和列值放到一個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:適合取多條記錄。把每條記錄封裝到一個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做一個增刪改查的例子
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)建一個QueryRunner對象 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)建一個QueryRunner對象 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)建一個QueryRunner對象 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)建一個QueryRunner對象 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é)果集時不能查到內(nèi)容的原因分析,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家的支持!
相關(guān)文章
基于Java實(shí)現(xiàn)一個自己的HTTP瀏覽器
這篇文章主要為大家詳細(xì)介紹了如何基于Java實(shí)現(xiàn)一個自己的HTTP瀏覽器,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-01-01SpringMVC實(shí)現(xiàn)參數(shù)校驗(yàn)配置方法
這篇文章主要介紹了SpringMVC實(shí)現(xiàn)參數(shù)校驗(yàn)的配置方式,Spring MVC會拋出MethodArgumentNotValidException異常,并將錯誤信息綁定到相應(yīng)的字段上,感興趣的朋友跟隨小編一起看看吧2024-03-03JavaBean valication驗(yàn)證實(shí)現(xiàn)方法示例
這篇文章主要介紹了JavaBean valication驗(yàn)證實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了JavaBean valication驗(yàn)證相關(guān)概念、原理、用法及操作注意事項(xiàng),需要的朋友可以參考下2020-03-03springboot中的靜態(tài)資源加載順序優(yōu)先級
這篇文章主要介紹了springboot中的靜態(tài)資源加載順序優(yōu)先級,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09java常用工具類之?dāng)?shù)據(jù)庫連接類(可以連接多種數(shù)據(jù)庫)
這篇文章主要介紹了java常用工具類之?dāng)?shù)據(jù)庫連接類,可以連接多種數(shù)據(jù)庫,代碼中包含詳細(xì)注釋,需要的朋友可以參考下2014-07-07JavaWeb實(shí)現(xiàn)文件上傳與下載的方法
這篇文章主要介紹了JavaWeb實(shí)現(xiàn)文件上傳與下載的方法的相關(guān)資料,需要的朋友可以參考下2016-01-01