java web 通用查询_javaWeb_JDBC_利用反射以及JDBC元数据编写通用的查询方法

JDBC利用反射以及元数据编写通用的查询方法[*****]

1.如何获取元数据

Java 通过JDBC获得连接以后,得到一个Connection 对象,可以从这个对象获得有关数据库管理系统的各种信息,包括数据库中的各个表,

表中的各个列,数据类型,触发器,存储过程等各方面的信息。根据这些信息,JDBC可以访问一个实现事先并不了解的数据库。

获取这些信息的方法都是在DatabaseMetaData类的对象上实现的,而DataBaseMetaData对象是在Connection对象上获得的。

2.元数据操作类——DatabaseMetaData类

DatabaseMetaData 类中提供了许多方法用于获得数据源的各种信息,通过这些方法可以非常详细的了解数据库的信息:

(1).getURL():返回一个String类对象,代表数据库的URL。

(2).getUserName():返回连接当前数据库管理系统的用户名。

(3).isReadOnly():返回一个boolean值,指示数据库是否只允许读操作。

(4).getDatabaseProductName():返回数据库的产品名称。

(5).getDatabaseProductVersion():返回数据库的版本号。

(6).getDriverName():返回驱动驱动程序的名称。

(7).getDriverVersion():返回驱动程序的版本号。

3.结果集元数据类---ResultSetMetaData 类

(1).ResultSetMetaData 类是可以描述ResultSet的元数据对象,可用于获取关于 ResultSet 对象中列的类型和属性信息的对象;

(2).如何获取ResultSetMetaData对象

调用ResultSet的getMetaData()方法

(3).相关的方法

A.getColumnName(int column):获取指定列的名称

B.getColumnCount():返回当前 ResultSet 对象中的列数。

C.getColumnTypeName(int column):检索指定列的数据库特定的类型名称。

D.getColumnDisplaySize(int column):指示指定列的最大标准宽度,以字符为单位。

E.isNullable(int column):指示指定列中的值是否可以为 null。

F.isAutoIncrement(int column):指示是否自动为指定列进行编号,这样这些列仍然是只读的

4.编写通用方法的步骤

(1). 得到 ResultSet 对象

(2). 得到 ResultSetMetaData 对象

(3). 创建一个 Map 对象, 键: SQL 查询的列的别名, 值: 列的值

(4). 处理结果集. 利用 ResultSetMetaData 填充 3 对应的 Map 对象

(5). 若 Map 不为空集, 利用反射创建 clazz 对应的对象

5.代码实现

//通用方法

/**

* 通用的查询方法:可以根据传入的 SQL、Class 对象返回 SQL 对应的记录的对象

* @param clazz: 描述对象的类型

* @param sql: SQL 语句。可能带占位符

* @param args: 填充占位符的可变参数。

* @return

*/

public static T get(Class clazz, String sql, Object... args) {

T entity = null;

Connection connection = null;

PreparedStatement preparedStatement = null;

ResultSet resultSet = null;

try {

//1. 得到 ResultSet 对象

connection = JDBCTools.getConnection();

preparedStatement = connection.prepareStatement(sql);

for (int i = 0; i < args.length; i++) {

preparedStatement.setObject(i + 1, args[i]);

}

resultSet = preparedStatement.executeQuery();

//2. 得到 ResultSetMetaData 对象

ResultSetMetaData rsmd = resultSet.getMetaData();

//3. 创建一个 Map 对象, 键: SQL 查询的列的别名,

//值: 列的值

Map values = new HashMap<>();

//4. 处理结果集. 利用 ResultSetMetaData 填充 3 对应的 Map 对象

if(resultSet.next()){

for(int i = 0; i < rsmd.getColumnCount(); i++){

String columnLabel = rsmd.getColumnLabel(i + 1);

Object columnValue = resultSet.getObject(i + 1);

values.put(columnLabel, columnValue);

}

}

//5. 若 Map 不为空集, 利用反射创建 clazz 对应的对象

if(values.size() > 0){

entity = clazz.newInstance();

//5. 遍历 Map 对象, 利用反射为 Class 对象的对应的属性赋值.

for(Map.Entry entry: values.entrySet()){

String fieldName = entry.getKey();

Object value = entry.getValue();

ReflectionUtils.setFieldValue(entity, fieldName, value);

}

}

} catch (Exception e) {

e.printStackTrace();

} finally {

JDBCTools.releaseDB(resultSet, preparedStatement, connection);

}

return entity;

}

//测试代码

public static void main(String[] args) {

String sql = "SELECT * from student WHERE studentName = ?";

String sql2 = "select id id,studentName studentName,age age,nativePlace nativePlace from student "

+ "where studentName = ?";

Student stu = get(Student.class, sql, "王五");

System.out.println(sql2);

Student stu2 = get(Student.class, sql2, "李四");

System.out.println(stu);

System.out.println(stu2);

}

6.流程转化关系

数据库--->记录--->结果集--->遍历结果集,获取结果集中的相关信息--->比较实体对象和结果集中的信息,如果相等,则分别把结果填充

到对应的实体对象的属性值上,并返回。如果不相等,报出异常。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值