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<String, Object> 对象, 键: SQL 查询的列的别名, 值: 列的值
(4). 处理结果集. 利用 ResultSetMetaData 填充 3 对应的 Map 对象
(5). 若 Map 不为空集, 利用反射创建 clazz 对应的对象

5.代码实现

//通用方法

/**
* 通用的查询方法:可以根据传入的 SQL、Class 对象返回 SQL 对应的记录的对象
* @param clazz: 描述对象的类型
* @param sql: SQL 语句。可能带占位符
* @param args: 填充占位符的可变参数。
* @return
*/
public static <T> T get(Class<T> 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<String, Object> 对象, 键: SQL 查询的列的别名,
//值: 列的值
Map<String, Object> 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<String, Object> 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.流程转化关系

数据库--->记录--->结果集--->遍历结果集,获取结果集中的相关信息--->比较实体对象和结果集中的信息,如果相等,则分别把结果填充
到对应的实体对象的属性值上,并返回。如果不相等,报出异常。

原文地址:https://www.cnblogs.com/nwxayyf/p/10351251.html

时间: 2024-09-30 07:48:28

javaWeb_JDBC_利用反射以及JDBC元数据编写通用的查询方法的相关文章

Java -- JDBC_利用反射及 JDBC 元数据编写通用的查询方法

先利用 SQL 进行查询,得到结果集: 利用反射创建实体类的对象:创建对象: 获取结果集的列的别名: 再获取结果集的每一列的值, 结合 3 得到一个 Map,键:列的别名,值:列的值: 再利用反射为 2 的对应的属性赋值:属性即为 Map 的键,值即为 Map 的值. 使用 JDBC 驱动程序处理元数据 Java 通过JDBC获得连接以后,得到一个Connection 对象,可以从这个对象获得有关数据库管理系统的各种信息,包括数据库中的各个表,表中的各个列,数据类型,触发器,存储过程等各方面的信

JDBC学习笔记——利用反射及JDBC元数据编写通用的查询方法

我们的查询操作,对于不同的数据表examstudent和customers,会有不同的代码编写过程,利用反射和JDBC元数据可以编写通用的方法进行对不同数据表的查询. 在此之前我们是这样做的: 查询customers表中的字段以及字段值: 1 public Customer getCustomer(String sql, Object... args) { 2 Customer customer = null; 3 Connection connection = null; 4 Prepared

【转】JDBC学习笔记(5)——利用反射及JDBC元数据编写通用的查询方法

转自:http://www.cnblogs.com/ysw-go/ JDBC元数据 1)DatabaseMetaData /** * 了解即可:DatabaseMetaData是描述数据库的元数据对象 * 可以由Connection得到 */ 具体的应用代码: 1 @Test 2 public void testDatabaseMetaData(){ 3 Connection connection=null; 4 ResultSet resultSet=null; 5 try { 6 conne

JDBC:利用反射及JDBC元数据编写通用的查询方法

遇到了若干问题: 1.从oracle返回的列名都是大写,再用反射,就找不到相对应得 名字 2.oracle 中number类型 返回来,就变成了BigDecimal public static void main(String[] args){ String sql = "SELECT IDCARD , examcard , " + "studentname ," + "lacation LoCATION,grade " + " FRO

利用反射及jdbc元数据实现通用的查询方法

--------------------------------------------------------------------------------------------------------------------------------------------------------------- 1.customer类: package com.lanqiao.javatest; import java.sql.Date; public class Customer { p

java攻城狮之路--复习JDBC(利用BeanUtils、以及JDBC元数据编写通用的查询方法)

1.利用BeanUtils的前提得要加入以下两个jar包: commons-beanutils-1.8.0.jar commons-logging-1.1.1.jar package com.shellway.jdbcDAO; import java.util.List; import org.junit.Test; public class TestDAO { DAO dao = new DAO(); @Test public void testUpdate() throws Exceptio

JDBC课程5--利用反射及JDBC元数据(ResultSetMetaData)编写通用的查询方法

/**-利用反射及JDBC元数据编写通用的查询方法 * 1.先利用SQl语句进行查询,得到结果集--> * 2.查找到结果集的别名:id--> * 3.利用反射创建实体类的对象,创建author对象--> * 4.获取结果集的列的别名: id,nation,name * 5.再获得结果集的每一列的值, * 结合2得到一个map键值对: 键: 列的别名,值: 列的值: {id=1,nation=中国,name=莫言} * 6.再利用反射为2的对应的属性赋值,属性为Map 的键,值为Map

利用反射机制,获取类的字段、方法、并实现简单调用

这篇文章是为之后要介绍Android的ICO框架做预备的,所以,如果想最近学习Android的ICO框架的同学,可以稍微看一下. 首先,简单介绍一下Java里面的反射. JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. 不知道这样的一段解释,你能否看懂.如果更简单的说,反射就是能够根据你给出类名实例化出一个实实在在的对象.所以,对象的实例

利用EF和C#泛型实现通用分页查询

利用EF和C#泛型实现通用分页查询 Entity Framework 是微软以 ADO.NET 为基础所发展出来的对象关系对应 (ORM) 解决方案,是微软的ORM框架.此框架将数据库中的表信息通过xml与实体类对象相关联,使得开发人员只需要关心实体对象,而不需要手动操作数据库,对实体对象的修改会映射到数据库中,这样大大提高了开发效率.以下代码使用了EF.泛型.泛型委托.lambda.匿名类.dynamic动态类型等知识完成了EF的crud,并且提供了一个高效的通用分页查询方法,采用了延时加载,