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 = connprepareStatement(sql);
for (int i = 0; i < parslength; i++) {
pssetObject(i+1, pars[i]);
}
rs = psexecuteQuery();
//根据查询结果获得该rs对应的ResultSetMetaData对象
ResultSetMetaData rsmd = rsgetMetaData();
//获得返回的列的数量
int count = rsmdgetColumnCount();
//该数组存放列的名称
String[] columns = new String[count];
//向数组中存放列的名称
for (int i = 0; i < columnslength; i++) {
columns[i] = rsmdgetColumnLabel(i+1);
}
//如果结果中有数据存在
if(rsnext())
{
//根据pojo的class反射获得其对象
obj = clazznewInstance();
//获得pojo所有的方法
Method[] methods = objgetClass()getMethods();
for (int i = 0; i < columnslength; i++) {
//根据列名获得set方法<由于没有映射文件,要求pojo中的属性必须和列名相同>
String column = columns[i];
String methodName = "set" + columnsubstring(0,1)toUpperCase() + columnsubstring(1);
//根据获得的方法数组去迭代 如果方法名称和上面获得的set方法相同 就执行这个方法
for (int j = 0; j < methodslength; j++) {
Method method = methods[j];
if(methodgetName()equals(methodName))
{
methodinvoke(obj, rsgetObject(column));
}
}
}
}
} catch (Exception e) {
eprintStackTrace();
} finally{
close(rs,ps,conn);
}
return obj;
}
真要做能用的查询,还是使用xml配置文件或者注解好些。比较灵活,性能也要好些。
用元数据都是比较耗费性能的,而且也比较麻烦。
分析如下:
--1select SC1S# from SC SC1 JOIN SC SC2 ON SC1S#=SC2S#
WHERE SC1C#='001' AND SC2C#='002' AND SC1score>SC2score
--2select S#,AVG(score)
平均成绩 from SC group by S#
having AVG(score)>60 --3select StudentS#,
Sname,COUNT() 选课数,SUM(score) 总成绩
from Student JOIN SC on StudentS#=SCS#
group by StudentS#,Sname
扩展资料:
数据库 *** 作的注意事项
1、对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
2、应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:select id from t where num is null
最好不要给数据库留NULL,尽可能的使用 NOT NULL填充数据库
备注、描述、评论之类的可以设置为 NULL,其他的,最好不要使用NULL。
不要以为 NULL 不需要空间,比如:char(100) 型,在字段建立时,空间就固定了, 不管是否插入值(NULL也包含在内),都是占用 100个字符的空间的,如果是varchar这样的变长字段, null 不占用空间。
可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:select id from t where num = 0
3、应尽量避免在 where 子句中使用 != 或 <> *** 作符,否则将引擎放弃使用索引而进行全表扫描。
4、应尽量避免在 where 子句中使用 or 来连接条件,如果一个字段有索引,一个字段没有索引,将导致引擎放弃使用索引而进行全表扫描,如:select id from t where num=10 or Name = 'admin'
可以这样查询:
select id from t where num = 10
union all
select id from t where Name = 'admin'
5、in 和 not in 也要慎用,否则会导致全表扫描,如:select id from t where num in(1,2,3)
对于连续的数值,能用 between 就不要用 in 了:select id from t where num between 1 and 3
很多时候用 exists 代替 in 是一个好的选择:select num from a where num in(select num from b)
用下面的语句替换:select num from a where exists(select 1 from b where num=anum)
6、下面的查询也将导致全表扫描:select id from t where name like ‘%abc%’
若要提高效率,可以考虑全文检索。
7、如果在 where 子句中使用参数,也会导致全表扫描。因为SQL只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择。然 而,如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。
参考资料来源:百度百科:数据库
SQL语言包含以下功能:
一:数据查询语言(DQL:Data Query Language):
其语句,也称为“数据检索语句”,用以从表中获得数据,确定数据怎样在应用程序给出。保留字SELECT是DQL(也是所有SQL)用得最多的动词,其他DQL常用的保留字有WHERE,ORDER BY,GROUP BY和HAVING。这些DQL保留字常与其他类型的SQL语句一起使用。
二:数据 *** 作语言(DML:Data Manipulation Language):
其语句包括动词INSERT,UPDATE和DELETE。它们分别用于添加,修改和删除表中的行。也称为动作查询语言。
三:事务处理语言(TPL):
它的语句能确保被DML语句影响的表的所有行及时得以更新。TPL语句包括BEGIN TRANSACTION,COMMIT和ROLLBACK。
四:数据控制语言(DCL):
它的语句通过GRANT或REVOKE获得许可,确定单个用户和用户组对数据库对象的访问。某些RDBMS可用GRANT或REVOKE控制对表单个列的访问。
五:数据定义语言(DDL):
其语句包括动词CREATE和DROP。在数据库中创建新表或删除表(CREAT TABLE 或 DROP TABLE);为表加入索引等。DDL包括许多与人数据库目录中获得数据有关的保留字。它也是动作查询的一部分。
六:指针控制语言(CCL):
它的语句,像DECLARE CURSOR,FETCH INTO和UPDATE WHERE CURRENT用于对一个或多个表单独行的 *** 作。
以上就是关于怎样写一个通用的JDBC查询方法全部的内容,包括:怎样写一个通用的JDBC查询方法、数据库查询 查询“001”课程比“002”课程成绩高的所有学生的学号、SQL是通用的功能极强的关系数据库标准语言,其中什么语句最常用于实现数据查询功能的 *** 作等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)