dao中通过oracle查询list,从数据库得到的结果集存放到List集合中

一、业务阐述

在开发中查询的数据库结果集,既要连接数据库、执行数据库操作、关闭数据库,还要把结果集的记录人为的设置到自己封装的DAO中等一系列的重复代码。

本文主要是想解决:用户只需要得到数据库连接,写sql语句,自己封装dao,其余的操作由封转的小框架解决这些重复的工作,用户得到的只是一个集合List。

List里面的元素有集合Map其中key是数据库中的字段类型,value是字段类型对应的值这个函数

DBUtil.executeQuery(con, sql)

List还提供集合元素存放的是dao对象,一条数据库记录对应一个dao对象,此函数是

DBUtil.executeQuery(con, sql,Vehicle.class)

以下提供源码的叙述

二、源码解说

测试类

Main.java代码

f3360644493f501869c6df8b23eb66ed.png

package com.hewen.dao.manage;

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.util.List;

public class Main

{

public static void main(String[] args)

{

Connection con;

try {

con = DBTest.getCon();

} catch (SQLException e) {

e.printStackTrace();

return;

}

PreparedStatement pst = null;

ResultSet rs = null;

String sql = "select * from t_vehicle t where t.vehicle_id<4";

/**

* 该方法用到的技术是通过结果集的列属性的性质得到,没有用到反射机制

* 这个测试用例也是把查询的结果集放到List集合

* 里面的元素是集合Map,key是数据库中的字段类型,value是

* 字段类型对应的值,

* 查询的结果如:[{KIND_ID=1, DEF_FLAG=null, CHANNELNO=1, SN=陆震,(822)22911,13771000789,

* BUYDATE=2010-02-26, DELETETIME=null, STAMP=2010-02-26, REGDATE=null, ISDELETED=0,

* VEHICLE_ID=2, NUMBER_PLATE=苏B10001, VEHICLESTATE=待命状态(对应现场返回), USEDATE=2010-02-26,

* INTERPHONENO=null, NUMBER_PLATE_TYPE_ID=4, TEL2=null, STYLE=null, COLOR=null,

* INTERPHONEID=null, LASTMAINTAINTIME=null, INITDISTANCE=0, LAST_UPDATE_TIME=2010-02-26,

*  REMARK=null, TEL=null, SUPERVISER=null},

*  {KIND_ID=3, DEF_FLAG=null, CHANNELNO=1, SN=陆震,

*  (822)22911,13771000789, BUYDATE=2010-02-26, DELETETIME=null, STAMP=2010-02-26,

*  REGDATE=null, ISDELETED=0, VEHICLE_ID=3, NUMBER_PLATE=苏B90003,

*  VEHICLESTATE=待命状态(对应现场返回), USEDATE=2010-02-26, INTERPHONENO=null,

*  NUMBER_PLATE_TYPE_ID=4, TEL2=13151000793, STYLE=面包车, COLOR=白, INTERPHONEID=null,

*  LASTMAINTAINTIME=null, INITDISTANCE=0, LAST_UPDATE_TIME=2010-02-26, REMARK=null,

*   TEL=22916, SUPERVISER=杨兴华}]

*/

try {

List list=DBUtil.executeQuery(con, sql);

System.out.println(list);

} catch (SQLException e) {

e.printStackTrace();

}

/**

* 这个测试用例只是把查询的结果集中的某一条记录映射到了dao对象中,

* 查询的结果如:

* vehicle:vehicle_id: 2 numberPlate: 苏B10001 deleteDate: null

vehicle:vehicle_id: 3 numberPlate: 苏B90003 deleteDate: null

*/

/*  try {

pst = con.prepareStatement(sql);

rs = pst.executeQuery();

while(rs.next()){

Vehicle r = (Vehicle) DBUtil.getFirstObjectFromRs(rs, Vehicle.class);

System.out.println("vehicle:" + r);

}

} catch (SQLException e) {

e.printStackTrace();

}finally{

DBUtil.closeRs(rs);

DBUtil.closePst(pst);

DBUtil.closeCon(con);

}*/

/**

* 方法是用的反射机制

* 这个测试用例是测试executeQuery函数,把查询的结果集放到List集合

* 并且集合元素存放的是dao对象,一条数据库记录对应一个dao对象,

* 打印出来的结果如:

* [vehicle_id: 2 numberPlate: 苏B10001 deleteDate: null,

* vehicle_id: 3 numberPlate: 苏B90003 deleteDate: null]

*

*/

/*  try {

List list=DBUtil.executeQuery(con, sql,Vehicle.class);

System.out.println(list);

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}*/

}

}

封装dao DBUtil类

Java代码

f3360644493f501869c6df8b23eb66ed.png

package com.hewen.dao.manage;

import java.lang.reflect.InvocationTargetException;

import java.lang.reflect.Method;

import java.lang.reflect.Type;

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.ResultSetMetaData;

import java.sql.SQLException;

import java.sql.Statement;

import java.sql.Types;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

/***

* 注意利用查询出数据库的一条记录映射到相应的dao中,写相应的dao一定要注意字段,一定

* 要与数据库的记录字段相对应,大小写可以忽略,但是字段不一致就返回错误的数据

*

* private static Object getValueFromRs(ResultSet rs, String fieldName, Type t) throws SQLException

* 此接口有个小的问题就是如果,获取的字段值是空值或者为null,而你自己的需求就是想要获取的字段为一个

* 默认的值,那就只需要客户该写这个方法,进行判断就可以

* @author Administrator

*

*/

public class DBUtil {

/**<

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值