怎样写一个通用的JDBC查询方法
只知道要用到ResultSetMetaData这个类,和java的反射机制要求是通用的。不管查询的是什么实体的内容.谢谢...
只知道要用到ResultSetMetaData这个类,和java的反射机制
要求是通用的。不管查询的是什么实体的内容.谢谢 展开
要求是通用的。不管查询的是什么实体的内容.谢谢 展开
2个回答
展开全部
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 = 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配置文件或者注解好些。比较灵活,性能也要好些。
用元数据都是比较耗费性能的,而且也比较麻烦。
景联文科技
2024-06-11 广告
2024-06-11 广告
景联文科技是一家专业AI数据标注公司。目前在全国范围拥有四个大型数据处理基地,智能标注平台涵盖标注工作台和产能管理体系,提供完整的语音、图像、文本、视频的全领域数据处理能力,通过ISO9001、ISO27001、ISO27701等国际认证,...
点击进入详情页
本回答由景联文科技提供
展开全部
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,我想不是这个主题的内容
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,我想不是这个主题的内容
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询