JavaWeb dbutils执行sql命令并遍历结果集时不能查到内容的原因分析
作者:绮萝酶 发布时间:2022-04-11 22:50:02
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命令并遍历结果集时不能查到内容的原因分析的支持!
来源:http://www.cnblogs.com/kinome/archive/2017/12/22/8085588.html


猜你喜欢
- 1、对称二叉树【OJ链接】分为以下几种情况:二叉树为空,是对称二叉树二叉树不为空,其左子树或者右子树为空,不是对称二叉树二叉树不为空,左右子
- 代码如果不进行格式化的处理,那么在查阅上会浪费不少的时间。今天我们要说的是字符串的格式化处理,作为基础编程内容,相信大家都字符串都不陌生。我
- 蓝牙设置相关界面,以下是通过C#方式打开的几个方式,记录一下蓝牙设置界面1.控制面板命令bthprops.cpl可以用控制面板 contro
- 微信公众号,仿照企业号的思路,增加了标签管理的功能,对关注的粉丝可以设置标签管理,实现更加方便的分组管理功能。开发者可以使用用户标签管理的相
- 封装在如何理解面向对象这篇文章中,提到所谓的封装就是“功能都给你做好了,你不必去理解它是怎么写出来的,直接使用即可。”。但你得清楚一点,那就
- 制作开机Logo 方法一: Drivers/video/logo/logo_linux_clut224.ppm是默认的启
- 一、匿名结构体struct{ char name[20]; int age;}s1;匿名
- 页面:上传文件时的关键词:enctype="multipart/form-data"<%@ page langua
- FilterInputStream 介绍FilterInputStream 的作用是用来“封装其它的输入流,并为它们提供额外的功能”。它的常
- 今天一位同事想写一个全屏幕截图的代码。当然要实现的第一步是能够获取整个屏幕的位图,记得Win32 API的CreateDC, BitBlt等
- 前台代码: <asp:Button ID="Button1" runat="server" T
- java数组初始化赋初值方法一int[] vis1;//声明未初始化 vis1=new in
- 1、@Valid与@Validated的区别1.1 基本区别@Valid:Hibernate validation校验机制@Validate
- 下面给大家介绍几种比较常见的解决办法,具体内容如下:1.有时候eclipse不自动编译,把project clean一下,让R.java重新
- 目录int和Integer的区别及自动装箱和自动拆箱Integer和int的对比,如下所示:自动装箱和自动拆箱:Integer的自动拆装箱的
- 用函数指针变量调用函数指针变量也可以指向一个函数。一个函数在编译时被分配给一个入口地址。这个函数入口地址就称为函数的指针。可以用一个指针变量
- java的jar是一个打包工具,用于将我们编译后的class文件打包起来,这里面主要是举一个例子用来说明这个工具的使用。在C盘下的temp文
- Android init.rc文件详解本文主要来自$ANDROID_SOURCE/system/init/readme.txt的翻译.1 简
- 使用类的全权名: System.Text.StringBuilder sb = new System.Text.StringBuilder(
- Android Studio安装后发现所有的中文,不管是界面上的还是输出的log中的中文都变成小框框 可以肯定是字体的问题 解决