Java 以jdbc作为列表获取整行
我需要从多个表中获取数据,并将每个表导出到excel表中。我不想使用Java 以jdbc作为列表获取整行,java,sql,excel,jdbc,Java,Sql,Excel,Jdbc,我需要从多个表中获取数据,并将每个表导出到excel表中。我不想使用getXXX()方法,因为有很多列,我不知道每列的数据类型。我需要获取整行并存储在结果列表中。 我使用getObject()获取了每一列,还使用MetaData.getColumnClassName()获取了类类型 比如说 Object val = resultSet.getObject(i); 我尝试使用getColumnClassName()将此val强制转换为其实际类型,但强制转换时出现错误 谁能帮帮我吗 公共类行{ p
getXXX()
方法,因为有很多列,我不知道每列的数据类型。我需要获取整行并存储在结果列表中。
我使用getObject()
获取了每一列,还使用MetaData.getColumnClassName()
获取了类类型
比如说
Object val = resultSet.getObject(i);
我尝试使用getColumnClassName()
将此val强制转换为其实际类型,但强制转换时出现错误
谁能帮帮我吗
公共类行{
public Map<Object, Class> row;
public static Map<String, Class> TYPE;
static {
TYPE = new HashMap<String, Class>();
TYPE.put("INTEGER", Integer.class);
TYPE.put("NUMERIC", BigDecimal.class);
TYPE.put("DOUBLE", Double.class);
TYPE.put("VARCHAR2", String.class);
}
public Row() {
row = new HashMap<Object, Class>();
}
public <t> void add(t data) {
row.put(data, data.getClass());
}
public void add(Object data, String sqlType) {
add((Row.TYPE.get(sqlType)) data);
}
public static void formTable(ResultSet rs, List<Row> table) throws SQLException {
if(rs == null)
return;
ResultSetMetaData rsmd = rs.getMetaData();
int colCt = rsmd.getColumnCount();
while(rs.next()) {
Row row = new Row();
for(int i = 0; i < colCt; i++) {
row.add(rs.getObject(i), rsmd.getColumnTypeName(i));
}
table.add(row);
}
}
public static void main(String[] args) {
}
公共地图行;
公共静态地图类型;
静止的{
TYPE=newhashmap();
TYPE.put(“INTEGER”,INTEGER.class);
TYPE.put(“NUMERIC”,BigDecimal.class);
类型。put(“双”,双。类);
TYPE.put(“VARCHAR2”,String.class);
}
公共行(){
行=新HashMap();
}
公共无效添加(t数据){
row.put(data,data.getClass());
}
公共void添加(对象数据,字符串sqlType){
添加((Row.TYPE.get(sqlType))数据);
}
公共静态void formTable(ResultSet rs,List table)引发SQLException{
如果(rs==null)
返回;
ResultSetMetaData rsmd=rs.getMetaData();
int colCt=rsmd.getColumnCount();
while(rs.next()){
行=新行();
for(int i=0;i
}请尝试以下代码:
Connection connection = DriverManager.getConnection("URL", "USERNAME", "PASSWORD");
PreparedStatement statement = connection.prepareStatement("select * from table");
ResultSet resultSet = statement.executeQuery();
if (resultSet != null) {
while (resultSet.next()) {
ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
int type = resultSetMetaData.getColumnType(i);
if (type == Types.VARCHAR || type == Types.CHAR) {
System.out.println(resultSet.getString(i));
} else {
System.out.println(resultSet.getLong(i));
}
}
System.out.println("-----------");
}
}
Connection-Connection=DriverManager.getConnection(“URL”、“用户名”、“密码”);
PreparedStatement=connection.prepareStatement(“从表中选择*);
ResultSet ResultSet=statement.executeQuery();
if(resultSet!=null){
while(resultSet.next()){
ResultSetMetaData ResultSetMetaData=resultSet.getMetaData();
对于(inti=1;i步骤1:获取元数据
ResultSetMetaData rsmd;
rsmd = rs.getMetaData();
int numColumns = rsmd.getColumnCount();
int[] columnsType = new int[numColumns + 1];
columnsType[0] = 0;
for (int i = 1; i <= numColumns; i++)
columnsType[i] = rsmd.getColumnType(i);
ResultSetMetaData rsmd;
rsmd=rs.getMetaData();
int numColumns=rsmd.getColumnCount();
int[]columnsType=新的int[numColumns+1];
columnsType[0]=0;
对于(int i=1;i公共类EXECUTEQUERY实现模块{
私有静态最终日期格式sdf=新的SimpleDataFormat(“yyyy-MM-dd HH:MM:ss”);
私有字符串用户标识;
字符串结果=”;
字符串resp=“”;
静态整数计数=1;
私有最终记录器log=Logger.getLogger(“EXECUTEQUERY”);
私有void dbg(字符串msg){
log.info(userId+“:”+msg);
}
私有无效dbg(例外情况除外){
log.info(例如getMessage());
例如printStackTrace();
}
私有无效uDbg(字符串消息){
log.info(userId+“:”+msg);
}
私有无效uDbg(例外情况除外){
uDbg(例如getMessage());
例如printStackTrace();
}
公共字符串main(UserContext UserContext,String reqXml){
dbg(“收到的查询为”+reqXml);
字符串响应;
userId=userContext.getUserId();
if(userContext.getAction().equals(“EXECUTEQUERY”)){
if(reqXml==null | | reqXml.equals(“”){
result=“!请输入查询”;
}否则{
结果=getQueryResult(userContext,reqXml);
}
}
返回结果;
}
/***
*
*用于在@shyamla yadav创建的后端添加搜索记录
*@param userContext
*@param reqXml
*/
public void addQueryLog(UserContext UserContext,String reqXml){
dbg(“内部addQueryLog方法请求为”+reqXml);
userId=userContext.getUserId();
dbg(userId+“此用户正在从屏幕中选择值”);
System.out.println(“接收请求为”+reqXml);
PreparedStatement pStmt=null;
连接EODCNN=null;
dbg(“接收日志的addQueryLog”+reqXml);
日期=新日期();
java.sql.Date sqlDate=new java.sql.Date(Date.getTime());
eodConn=EODConnectionFactory.getInstance().getFCConnectionFromPool();
试一试{
pStmt=eodConn.prepareStatement(“插入EOD_QRY_EXEC_日志(QRY_EXEC_时间戳、QRY_文本、操作员ID)\n”
+“值(?,?)”;
setTimestamp(1,新的java.sql.Timestamp(System.currentTimeMillis());
pStmt.setString(2,reqXml);
pStmt.setString(3,用户ID);
pStmt.executeQuery();
}catch(SQLException-ex){
dbg(“例外情况为”+ex);
返回;
}
EODConnectionFactory.ReturnFCConnectionPool(eodConn);
返回;
}
/*
此方法返回带分隔符的查询例外表数据。
@夏姆拉尔,
*/
公共字符串getQueryResult(UserContext UserContext,String reqXml){
字符串字段_值=”;
字符串lsitofquery=“”;
字符串结果列表=”;
dbg(“内部getQueryResult方法”);
连接EODCNN=null;
语句stmt=null;
eodConn=EODConnectionFactory.getInstance().getFCConnectionFromPool();
试一试{
stmt=eodConn.createStatement(ResultSet.TYPE\u SCROLL\u敏感,ResultSet.CONCUR\u可更新);
结果集rs=stmt.executeQuery(reqXml);
ResultSetMetaData rsmd=rs.getMetaData();
int columnCount=rsmd.getColumnCount();
dbg(“列总数为:“+columnCount”);
int rsCount=1;
while(rs.next()){
如果(rsCount==1){
对于(inti=1;i0?lsitofquery+“>”:“!表为空”;
addQueryLog(userContext,reqXml);
返回lsitofquery+“>”;
}
}
以及您得到的错误?另外,为什么您不知道您要查询的列?我建议使用Jetcel而不是JDBC。Excel实际上不是关系数据库。我认为了解列名及其类型只会有所帮助here@Woot4M
String s;
Object o;
while (rs.next()) {
for (int i = 1; i <= numColumns; i++) {
if (columnsType[i] == java.sql.Types.NUMERIC || columnsType[i] == java.sql.Types.CHAR || columnsType[i] == java.sql.Types.VARCHAR) {
s = rs.getString(i);
} else if (columnsType[i] == java.sql.Types.NVARCHAR) {
s = rs.getNString(i);
} else if (columnsType[i] == java.sql.Types.BOOLEAN) {
// TODO
} else if (columnsType[i] == java.sql.Types.FLOAT || columnsType[i] == java.sql.Types.DOUBLE) {
// TODO
} else if (columnsType[i] == java.sql.Types.TINYINT || columnsType[i] == java.sql.Types.SMALLINT || columnsType[i] == java.sql.Types.INTEGER || columnsType[i] == java.sql.Types.BIGINT) {
// TODO
} else if (columnsType[i] == java.sql.Types.DATE || columnsType[i] == java.sql.Types.TIMESTAMP) {
// TODO
} else {
o = rs.getObject(i);
}
}
}
public class EXECUTEQUERY implements Module {
private static final DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
private String userId;
String result = "";
String resp = "";
static int count = 1;
private final Logger log = Logger.getLogger("EXECUTEQUERY");
private void dbg(String msg) {
log.info(userId + ":" + msg);
}
private void dbg(Exception ex) {
log.info(ex.getMessage());
ex.printStackTrace();
}
private void uDbg(String msg) {
log.info(userId + " :" + msg);
}
private void uDbg(Exception ex) {
uDbg(ex.getMessage());
ex.printStackTrace();
}
public String main(UserContext userContext, String reqXml) {
dbg("Query recieved is " + reqXml);
String resp;
userId = userContext.getUserId();
if (userContext.getAction().equals("EXECUTEQUERY")) {
if (reqXml == null || reqXml.equals("")) {
result = "!Please Enter the query";
} else {
result = getQueryResult(userContext, reqXml);
}
}
return result;
}
/***
*
* for adding search record in backend created by @shyamlal yadav
* @param userContext
* @param reqXml
*/
public void addQueryLog(UserContext userContext, String reqXml) {
dbg("inside addQueryLog methos request is " + reqXml);
userId = userContext.getUserId();
dbg( userId +"this user is selecting value from screen");
System.out.println("recieve request is " + reqXml);
PreparedStatement pStmt = null;
Connection eodConn = null;
dbg("addQueryLog recieved for log " + reqXml);
Date date = new Date();
java.sql.Date sqlDate = new java.sql.Date( date.getTime());
eodConn = EODConnectionFactory.getInstance().getFCConnectionFromPool();
try {
pStmt = eodConn.prepareStatement("insert into EOD_QRY_EXEC_LOG (QRY_EXEC_TIMESTAMP, QRY_TEXT,OPERATOR_ID)\n"
+ " values (?,?,?)");
pStmt.setTimestamp(1, new java.sql.Timestamp(System.currentTimeMillis()));
pStmt.setString(2, reqXml);
pStmt.setString(3, userId);
pStmt.executeQuery();
} catch (SQLException ex) {
dbg("Exception is " + ex);
return;
}
EODConnectionFactory.returnFCConnectionToPool(eodConn);
return;
}
/*
This method returns query excecuted table data with separators.
@Shaymlal,
*/
public String getQueryResult(UserContext userContext, String reqXml) {
String field_value = "";
String lsitofquery = "";
String resultlist = "";
dbg("Inside getQueryResult method");
Connection eodConn = null;
Statement stmt = null;
eodConn = EODConnectionFactory.getInstance().getFCConnectionFromPool();
try {
stmt = eodConn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
ResultSet rs = stmt.executeQuery(reqXml);
ResultSetMetaData rsmd = rs.getMetaData();
int columnCount = rsmd.getColumnCount();
dbg("Total no of column is:" + columnCount);
int rsCount = 1;
while (rs.next()) {
if (rsCount == 1) {
for (int i = 1; i <= columnCount; i++) {
resultlist += "~" + rsmd.getColumnName(i);
}
}
for (int i = 1; i <= columnCount; i++) {
field_value += "~" + rs.getString(i);
}
field_value = field_value + "~<>";
lsitofquery = resultlist + "~>" + field_value;
rsCount = rsCount + 1;
}
} catch (Exception ex) {
dbg("Exception is " + ex);
return "!Exception invalid query: " + ex;
}
EODConnectionFactory.returnFCConnectionToPool(eodConn);
// return rowCount > 0 ? lsitofquery+">" : "!Table is Empty" ;
addQueryLog(userContext,reqXml);
return lsitofquery + ">";
}
}