首页 热点专区 义务教育 高等教育 出国留学 考研考公

怎样写一个通用的JDBC查询方法

发布网友

我来回答

3个回答

懂视网

package com.platform_db.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.platform_db.dao.IObjectDao;
import com.platform_db.db.DBUtil;

public class ObjectDaoImpl implements IObjectDao{
public List<?> find(String sql,Object[] pars) throws Exception {
PreparedStatement ps = null;
ResultSet rs = null;

Connection conn = DBUtil.openConnection();
ps = conn.prepareStatement(sql);
for (int i = 0;i < pars.length ; i++) {
ps.setObject(i+1, pars[i]);
}
rs = ps.executeQuery();

List<Map<String,Object>> data = new ArrayList<Map<String,Object>>();

ResultSetMetaData md = rs.getMetaData();
int columnCount = md.getColumnCount();
while( rs.next() ){
Map<String , Object> map = new HashMap<String , Object>();
for (int i = 1; i <= columnCount; i++) {
map.put(md.getColumnName(i), rs.getObject(i));
}
data.add(map);
}

rs.close();
ps.close();
conn.close();

return data;
}

public boolean exec(String sql, Object[] pars) throws Exception {
Connection conn = DBUtil.openConnection();
conn.setAutoCommit(false);

PreparedStatement ps = conn.prepareStatement(sql);
for (int i = 0;i < pars.length ; i++) {
ps.setObject(i+1, pars[i]);
}
boolean flag = ps.execute();

conn.commit();
conn.setAutoCommit(true);
ps.close();
conn.close();
return flag;
}

public int[] execBatch(String sql, List<Object[]> list) throws Exception {
Connection conn = DBUtil.openConnection();
conn.setAutoCommit(false);

PreparedStatement ps = conn.prepareStatement(sql);
for(Object[] pars : list){
for (int i = 0;i < pars.length ; i++) {
ps.setObject(i+1, pars[i]);
}
ps.addBatch();
}

int[] counts = ps.executeBatch();

conn.commit();
conn.setAutoCommit(true);
ps.close();
conn.close();

return counts;
}
}

JDBC的crud通用方法

标签:

热心网友

public static Object get(Class clazz,String sql,Object[] pars)
{
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
Object obj = null;

//获得数据库连接
conn = getConnection();
try {
//给sql的参数赋值并执行查询
ps = conn.prepareStatement(sql);
for (int i = 0; i < pars.length; i++) {
ps.setObject(i+1, pars[i]);
}
rs = ps.executeQuery();

//根据查询结果获得该rs对应的ResultSetMetaData对象
ResultSetMetaData rsmd = rs.getMetaData();
//获得返回的列的数量
int count = rsmd.getColumnCount();
//该数组存放列的名称
String[] columns = new String[count];
//向数组中存放列的名称
for (int i = 0; i < columns.length; i++) {
columns[i] = rsmd.getColumnLabel(i+1);
}

//如果结果中有数据存在
if(rs.next())
{
//根据pojo的class反射获得其对象
obj = clazz.newInstance();
//获得pojo所有的方法
Method[] methods = obj.getClass().getMethods();

for (int i = 0; i < columns.length; i++) {
//根据列名获得set方法<由于没有映射文件,要求pojo中的属性必须和列名相同>
String column = columns[i];
String methodName = "set" + column.substring(0,1).toUpperCase() + column.substring(1);

//根据获得的方法数组去迭代 如果方法名称和上面获得的set方法相同 就执行这个方法
for (int j = 0; j < methods.length; j++) {
Method method = methods[j];
if(method.getName().equals(methodName))
{
method.invoke(obj, rs.getObject(column));
}
}
}
}

} catch (Exception e) {
e.printStackTrace();
} finally{
close(rs,ps,conn);
}

return obj;

}

真要做能用的查询,还是使用xml配置文件或者注解好些。比较灵活,性能也要好些。
用元数据都是比较耗费性能的,而且也比较麻烦。

热心网友

Connection conn = getConnection();
List list = new ArrayList();
try{
Statement stmt = conn.createStatement();

ResultSet rs = stmt.executeQuery(SQL);

ResultSetMetaData md = rs.getMetaData();

int columnCount = md.getColumnCount();

while (rs.next()) {

Map map = new HashMap();

for (int i = 1; i <= columnCount; i++) {

map.put(md.getColumnName(i), rs.getObject(i));

}

list.add(map);

}

}catch(SQLException e)
{
e.printStackTrace();
}

return list;
我自己写的,不管什么SQL,都可以查询获取到一个list,如何取list,我想不是这个主题的内容

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com