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

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

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

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

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、常用方法

  

        

        

        

  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命令并遍历结果集时不能查到内容的原因分析,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们的支持!

(0)

相关推荐

  • java配置dbcp连接池(数据库连接池)示例分享

    使用jar包:commons-dbcp-1.4.jar.commons-pool-1.6.jar.commons-logging-1.1.3.jar,另外还有数据库的jdbc驱动,适用java6及以上平台 连接池管理类 复制代码 代码如下: package cn.songxinqiang.samples.commonsdbcp.util; import java.sql.Connection;import java.sql.DatabaseMetaData;import java.sql.SQL

  • java遍历读取整个redis数据库实例

    redis提供了灵活的数据查询方式,最牛的就是key的搜索支持正则表达式. jedis.keys("*");表示搜索所有keyjedis.keys("abc*")表示搜索开头为abc的key数据 遍历了key就能遍历到value. 其实就是一个set 复制代码 代码如下: RedisDO rd = new RedisDO();  rd.open();  Set s = rd.jedis.keys("*");  Iterator it = s.it

  • java实现将结果集封装到List中的方法

    本文实例讲述了java实现将结果集封装到List中的方法.分享给大家供大家参考,具体如下: import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.List; public class TestResultSet { public stati

  • java jdbc连接mysql数据库实现增删改查操作

    jdbc相信大家都不陌生,只要是个搞java的,最初接触j2ee的时候都是要学习这么个东西的,谁叫程序得和数据库打交道呢!而jdbc就是和数据库打交道非常基础的一个知识,也是比较接近底层的,在实际的工作中大家用得更多的其实还是比较成熟的框架,例如Hibernate.Mybatis. 但是作为这些成熟框架的底层的jdbc却也是我们应该去掌握的,只有了解了jdbc的增删改查,这样在以后如果有兴趣去研究Hibernate或者Mybatis的源代码的时候才能更好的去理解这些成熟的框架是如何去实现增删改查

  • java实现jdbc查询结果集result转换成对应list集合

    代码非常的简单,这里就不多废话了,直接奉上 public static <T> List<T> convertToList(ResultSet rs,Class<T> t) throws SQLException { List<Map<String, Object>> list = new ArrayList<Map<String, Object>>(); ResultSetMetaData md = (ResultSet

  • 详解Java的JDBC中Statement与PreparedStatement对象

    一旦获得一个连接,我们可以与数据库进行交互.在JDBC Statement, CallableStatement 和 PreparedStatement 接口定义的方法和属性,使可以发送SQL或PL/SQL命令和从数据库接收数据. 它们还定义方法,帮助Java和数据库使用SQL数据类型之间转换数据的差异. 下表提供了每个接口的用途概要,了解决定使用哪个接口 Statement 对象: 创建Statement对象 在可以使用Statement对象执行SQL语句,需要使用Connection对象的c

  • Java数据库连接PreparedStatement的使用详解

    本文介绍了Java数据库连接PreparedStatement的使用详解,分享给大家,具体如下: 首先了解Statement和PreparedStatement的区别: 由此可见,一般使用PreparedStatement. 操作数据库SU(Course表),其中Course属性有Cno,Cname,Cpno,Ccredit. public class Demo_2 { public static void main(String[] args) { PreparedStatement ps=n

  • Java使用PreparedStatement接口及ResultSet结果集的方法示例

    本文实例讲述了Java使用PreparedStatement接口及ResultSet结果集的方法.分享给大家供大家参考,具体如下: 说明: 1.PreparedStatement接口继承Statement,它的实例包含已编译的SQL语句,执行速度要快于Statement. 2.PreparedStatement继承了Statement的所有功能,三种方法executeUpdate.executeQuery.execute不再需要参数. 3.在JDBC应用中,一般都用PreparedStateme

  • Java使用jdbc连接MySQL数据库实例分析

    本文实例讲述了Java使用jdbc连接MySQL数据库的方法.分享给大家供大家参考,具体如下: 使用jdbc连接数据库: 可以直接在方法中定义url.user.psd等信息,也可以读取配置文件,但是在web项目中肯定是要使用第二种方式的,为了统一,只介绍第二种方式. 步骤 1.创建配置文件db.properties 无论是eclipse还是myeclipse,在工程下右键->new->file,以properties为后缀名就好了. 配置文件内容: #连接数据库的url,如果主机地址是loca

  • Java基于JDBC连接数据库及显示数据操作示例

    本文实例讲述了Java基于JDBC连接数据库及显示数据操作.分享给大家供大家参考,具体如下: 1. 导入jdbc包 java要连接MySQL数据库需要用到JDBC工具(mysql-connector-java-5.1.39-bin.jar),这是一个jar包,不同的数据库对应不同的jar包,这里用的是MySQL数据库jar包,导入很简单,鼠标对项目右击 - Build Path - Configure Build Path - 右侧选Libraries - Add External JARs,选

随机推荐