首页 > 开发 > Java > 正文

JavaWeb dbutils执行sql命令并遍历结果集时不能查到内容的原因分析

2024-07-13 10:15:19
字体:
来源:转载
供稿:网友

JAVAWEB dbutils执行sql命令并遍历结果集时不能查到内容的原因及处理方法如下所示:

遍历结果集时只遍历bean对象才会只输出第一行那种内容(第一行是输出了UserEntity类实例化的对象),所以这里需要 re.getRepoTableName() 才能通过对象调用相对应的内容

这样一来,就可以取到值了

javaweb,dbutils,sql命令,sql遍历结果集

 

javaweb,dbutils,sql命令,sql遍历结果集

PS:JavaWeb之DBUtils详细介绍如下所示:

 

一、什么是DBUtils及作用

  DBUtils是apache公司写的。DBUtils是java编程中的数据库操作实用工具,小巧简单实用。

  DBUtils封装了对JDBC的操作,简化了JDBC操作。可以少写代码。

  1.对于数据表的读操作,他可以把结果转换成List,Array,Set等java集合,便于程序员操作;

  2.对于数据表的写操作,也变得很简单(只需写sql语句)

  3.可以使用数据源,使用JNDI,数据库连接池等技术来优化性能--重用已经构建好的数据库连接对象

二、DBUtils的三个核心对象

  2.1、QueryRunner类

    QueryRunner中提供对sql语句操作的API.它主要有三个方法:query() 用于执行select,update() 用于执行insert update delete,batch() 批处理。等下下面的会详细的介绍这几种方法的用法。

  2.2、ResultSetHandler接口

    用于定义select操作后,怎样封装结果集.它总共有9个常用的实现类,下面我会详细的为大家介绍怎么去使用。

  2.3、DbUtils类

    它就是一个工具类,定义了关闭资源与事务处理的方法

三、怎么去使用DBUtils框架

  3.1、使用步骤

    导入相对应的jar包

    创建QueryRunner对象

      使用query方法执行select语句

      使用ResultSetHandler封装结果集

      使用DbUtils类释放资源

  3.2、实例

    注:本人使用的是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(){ //创建一个QueryRunner对象 QueryRunner qr = new QueryRunner(C3P0Util.getDataSource()); try {  // new ResultSetHandler<List<User>>告诉我们如何封装结果集  List<User> list = qr.query("select * from user", new ResultSetHandler<List<User>>(){  @Override  //query语句执行select语句后,结果一返回值的形式传递过来  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(){ //创建一个QueryRunner对象 QueryRunner qr = new QueryRunner(C3P0Util.getDataSource()); try {  //执行sql语句,返回结果  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、构造函数

         new QueryRunner(); 它的事务可以手动控制。                    

也就是说此对象调用的方法(如:query、update、batch)参数中要有Connection对象。

           new QueryRunner(DataSource ds); 它的事务是自动控制的。一个sql一个事务。                           

此对象调用的方法(如:query、update、batrch)参数中无需Connection对象。

    4.1.2、常用方法 

javaweb,dbutils,sql命令,sql遍历结果集

   javaweb,dbutils,sql命令,sql遍历结果集

        javaweb,dbutils,sql命令,sql遍历结果集

        javaweb,dbutils,sql命令,sql遍历结果集

        javaweb,dbutils,sql命令,sql遍历结果集

  4.2、ResultSetHandler接口

    4.2.1、它有9个结果处理器

      ArrayHandler:适合取1条记录。把该条记录的每列值封装到一个数组中Object[]
      ArrayListHandler:适合取多条记录。把每条记录的每列值封装到一个数组中Object[],把数组封装到一个List中
      ColumnListHandler:取某一列的数据。封装到List中。
      KeyedHandler:取多条记录,每一条记录封装到一个Map中,再把这个Map封装到另外一个Map中,key为指定的字段值。
      MapHandler:适合取1条记录。把当前记录的列名和列值放到一个Map中
      MapListHandler:适合取多条记录。把每条记录封装到一个Map中,再把Map封装到List中
      ScalarHandler:适合取单行单列数据
      BeanHandler
      BeanListHandler

    4.2.2、实例       

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条记录。把该条记录的每列值封装到一个数组中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:适合取多条记录。把每条记录的每列值封装到一个数组中Object[],把数组封装到一个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:取某一列的数据。封装到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是表中的某列数据,小的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至,因为设置了“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条记录。把当前记录的列名和列值放到一个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());  //默认取第一行数据,需要去其它行用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:适合取单行单列数据 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:适合取单行单列数据 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() { //创建一个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() { //创建一个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() { //创建一个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() { //创建一个QueryRunner对象 QueryRunner qr = new QueryRunner(C3P0Util.getDataSource()); try {  Object[][] params = new Object[10][]; //高维代表执行多少次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(); } }}

总结

以上所述是小编给大家介绍的JavaWeb dbutils执行sql命令并遍历结果集时不能查到内容的原因分析,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对VeVb武林网的支持!


注:相关教程知识阅读请移步到JAVA教程频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表