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命令并遍历结果集时不能查到内容的原因分析,希望对大家有所帮助