JDBC学习笔记(5)——利用反射及JDBC元数据编写通用的查询方法
JDBC元数据
1)DatabaseMetaData
/**
* 了解即可:DatabaseMetaData是描述数据库的元数据对象
* 可以由Connection得到
*/
具体的应用代码:
@Test
public void testDatabaseMetaData(){
Connection connection=null;
ResultSet resultSet=null;
try {
connection=JDBCTools.getConnection();
DatabaseMetaData data=connection.getMetaData();
//1.可以得到数据库本身的一些基本的信息
//得到数据库的版本号
int version=data.getDatabaseMajorVersion();
System.out.println(version);
//2.得到连接数据库的用户名
String user=data.getUserName();
System.out.println(user);
//3.得到MySQl中有哪些数据库
resultSet=data.getCatalogs();
while(resultSet.next()){
System.out.println(resultSet.getString(1));
}
} catch (Exception e) {
e.printStackTrace();
}finally{
JDBCTools.release(resultSet, null, connection);
}
}
2)ResultSetMetaData
/**
* ResultSetMetaData:描述结果集的元数据
* 可以得到结果集中的基本信息:结果集中有哪些列,列名,列的别名等等;
*/
具体的代码应用:
@Test
public void testResultSetMetaData(){
Connection connection=null;
PreparedStatement preparedStatement=null;
ResultSet resultSet=null;
try {
connection=JDBCTools.getConnection();
String sql="select id,name,email,birth"+
" from customers";
preparedStatement=connection.prepareStatement(sql);
resultSet=preparedStatement.executeQuery();
ResultSetMetaData rsmd=resultSet.getMetaData();
//得到列数
int columnCount=rsmd.getColumnCount();
System.out.println(columnCount);
for(int i=0;i<columnCount;i++){
//得到列名
String columnName=rsmd.getColumnName(i+1);
//得到列的别名
String columnLabel=rsmd.getColumnLabel(i+1);
System.out.println(columnName+":"+columnLabel);
} } catch (Exception e) {
e.printStackTrace();
}finally{
JDBCTools.release(resultSet, preparedStatement, connection);
}
}
【温馨提示】孤立的技术是没有价值的,结合具体的应用才能彰显其魅力
我们的查询操作,对于不同的数据表examstudent和customers,会有不同的代码编写过程,利用反射和JDBC元数据可以编写通用的方法进行对不同数据表的查询。
在此之前我们是这样做的:
查询customers表中的字段以及字段值:
public Customer getCustomer(String sql, Object... args) {
Customer customer = null;
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
connection = JDBCTools.getConnection();
preparedStatement = connection.prepareStatement(sql);
for (int i = 0; i < args.length; i++) {
preparedStatement.setObject(i + 1, args[i]);
}
resultSet = preparedStatement.executeQuery();
if (resultSet.next()) {
// student = new Student(resultSet.getInt(1),
// resultSet.getInt(2),
// resultSet.getString(3), resultSet.getString(4),
// resultSet.getString(5), resultSet.getString(6),
// resultSet.getInt(7));
customer = new Customer();
customer.setId(resultSet.getInt(1));
customer.setName(resultSet.getString(2));
customer.setEmail(resultSet.getString(3));
customer.setBirth(resultSet.getDate(4));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCTools.release(resultSet, preparedStatement, connection);
}
return customer;
}
查询examstudent表中的字段以及字段值:
public Student getStudent(String sql, Object... args) {
Student student = null;
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
connection = JDBCTools.getConnection();
preparedStatement = connection.prepareStatement(sql);
for (int i = 0; i < args.length; i++) {
preparedStatement.setObject(i + 1, args[i]);
}
resultSet = preparedStatement.executeQuery();
if (resultSet.next()) {
student = new Student(resultSet.getInt(1), resultSet.getInt(2),
resultSet.getString(3), resultSet.getString(4),
resultSet.getString(5), resultSet.getString(6),
resultSet.getInt(7));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCTools.release(resultSet, preparedStatement, connection);
}
return student;
}
元数据:元数据就是描述数据的数据
可以看到两个操作有共同的步骤,不同的地方代码相似度也很高,于是我们就可以在此基础上编写一个通用的方法实现我们查询数据表的操作。
元
/**
* ResultSetMetaData:
* 1).是描述ResultSet的元数据对象,即从中可以获取到 结果集中有多少列,列名是什么。。。
* 2).如何使用呢? 1.得到ResultSetMetaData对象: 调用ResultSet的getMetaData()方法
* 2.ResultSetMetaData有哪些好用的方法?
*
* >int getColumnCount():SQL语句中包含哪些列
* >String getColumn(int column):获取指定列的别名,其中索引从1开始
*
*/
具体的代码实现:
public <T> T get(Class<T> classz, String sql, Object... args) {
T entity = null;
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
connection = JDBCTools.getConnection();
preparedStatement = connection.prepareStatement(sql);
for (int i = 0; i < args.length; i++) {
preparedStatement.setObject(i + 1, args[i]);
}
resultSet = preparedStatement.executeQuery();
ResultSetMetaData rsmd = resultSet.getMetaData();
Map<String, Object> values = new HashMap<String, Object>();
if (resultSet.next()) {
for (int i = 0; i < rsmd.getColumnCount(); i++) {
String columnLabel = rsmd.getColumnLabel(i + 1);
Object columnValue = resultSet.getObject(columnLabel);
values.put(columnLabel, columnValue);
}
}
if (values.size() > 0) {
entity = classz.newInstance();
for (Map.Entry<String, Object> entry : values.entrySet()) {
String fieldName = entry.getKey();
Object fieldValue = entry.getValue();
ReflectionUtils
.setFieldValue(entity, fieldName, fieldValue);
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCTools.release(resultSet, preparedStatement, connection);
}
// 返回包含查询信息的实体类对象
return entity;
}
get方法的编写实现步骤:
/**
* 1.先利用SQL进行查询,得到结果集
* 2.利用反射创建实体类的对象:创建Student对象
* 3.获取结果集的列的别名:idCard、studentName
* 4.再获取结果集的每一列的值,结合3得到一个Map,键是列的别名:值;列的值:{flowid:5,type=6,idCard:xxx...} 列的别名和我们实体类的属性字段名一致
* 5.再利用反射为2的对应的属性赋值 属性:Map的键 属性值:Map的键值
*/
我们写一个@test方法测试一下:
@Test
public void testGet() {
String sql = "select id,name,email,birth "
+ " from customers where id=?";
System.out.println(sql);
Customer customer = get(Customer.class, sql, 3);
System.out.println(customer);
sql = "select flow_id flowId,type, idcard idCard, exam_card examCard,"
+ "student_name studentName,location,grade from examstudent where "
+ " flow_id=?";
System.out.println(sql);
Student student = get(Student.class, sql, 3);
System.out.println(student);
}
运行结果:
select id,name,email,birth from customers where id=?
Customer [id=3, name=ABCD, email=mike@163.com, birth=1992-06-07]
select flow_id flowId,type, idcard idCard, exam_card examCard,student_name studentName,location,grade from examstudent where flow_id=?
Student [flowId=3, type=6, idCard=371522199206078411, examCard=2015534083, studentName=li, location=dalian, grade=87]
BeanUtils包的使用
BeanUtils工具包是由Apache公司所开发,主要是方便程序员对Bean类能够进行简便的操作。
在使用BeanUtils工具包之前我们需要的Jar包有以下几种:
(1) BeanUtils相关包
commons-beanutils-1.8.3.jar
commons-beanutils-1.8.3-javadoc.jar
commons-beanutils-1.8.3-javadoc.jar
commons-beanutils-bean-collections-1.8.3.jar
commons-beanutils-core-1.8.3.jar
(2) Logic4j相关包
commons-logging.jar
log4j.jar
既然要对Bean对象进行操作,那么就需要一个Bean的测试类,我们以下面为所测试的Bean类

1 public class Student {
2
3
4
5 private String name;
6
7 private int age;
8
9 private Date birth;
10
11
12
13
14
15 public String getName() {
16
17 return name;
18
19 }
20
21 public void setName(String name) {
22
23 this.name = name;
24
25 }
26
27 public int getAge() {
28
29 return age;
30
31 }
32
33 public void setAge(int age) {
34
35 this.age = age;
36
37 }
38
39 public Date getBirth() {
40
41 return birth;
42
43 }
44
45 public void setBirth(Date birth) {
46
47 this.birth = birth;
48
49 }
50
51
52
53 }

一、先赋值Bean对象里的字段属性,然后再取值:

1 @Test
2
3 public void test01() throws Exception{
4
5 //1.加载类
6
7 Class clss = Class.forName("com.L.introspector.Student");
8
9 //2.创建Bean对象
10
11 Student st = (Student) clss.newInstance();
12
13 //3.通过BeanUtils给对象属性赋值
14
15 BeanUtils.setProperty(st, "name", "L。");
16
17 //4.输出对象属性值
18
19 String str = BeanUtils.getProperty(st, "name");
20
21 System.out.println(str);
22
23 }

BeanUtils的setProperty(object,name,value)方法需要的参数分别是
Object=加载类的对象
Name=类属性的名称
Value=所赋的值;
BeanUtils的getProperty(object,name)方法的返回值是String类型,所以可以直接输出;
因此我们的get方法中的代码:
ReflectionUtils.setFieldValue(entity, fieldName, fieldValue);可以更改为
BeanUtils.setProperty(entity, fieldName, fieldValue);
本文为博主原创文章,转载请注明出处:http://www.cnblogs.com/ysw-go/
1、本博客的原创原创文章,都是本人平时学习所做的笔记,如有错误,欢迎指正。
2、如有侵犯您的知识产权和版权问题,请通知本人,本人会即时做出处理文章。
3、本博客的目的是知识交流所用,转载自其它博客或网站,作为自己的参考资料的,感谢这些文章的原创人员
JDBC学习笔记(5)——利用反射及JDBC元数据编写通用的查询方法的更多相关文章
- 【转】JDBC学习笔记(5)——利用反射及JDBC元数据编写通用的查询方法
转自:http://www.cnblogs.com/ysw-go/ JDBC元数据 1)DatabaseMetaData /** * 了解即可:DatabaseMetaData是描述数据库的元数据对象 ...
- Java -- JDBC_利用反射及 JDBC 元数据编写通用的查询方法
先利用 SQL 进行查询,得到结果集: 利用反射创建实体类的对象:创建对象: 获取结果集的列的别名: 再获取结果集的每一列的值, 结合 3 得到一个 Map,键:列的别名,值:列的值: 再利用反射为 ...
- <五>JDBC_利用反射及JDBC元数据编写通用的查询方法
此类针对javaBean类写了一个通用的查询方法,List<javaBean> 通用查询更新中...:通过学习,深刻体会到学会反射就等于掌握了java基础的半壁江山! 一.使用JDBC驱动 ...
- java攻城狮之路--复习JDBC(利用BeanUtils、JDBC元数据编写通用的查询方法;元数据;Blob;事务;批量处理)
1.利用BeanUtils的前提得要加入以下两个jar包: commons-beanutils-1.8.0.jar commons-logging-1.1.1.jar package com.shel ...
- JDBC--利用反射及JDBC元数据编写通用的查询方法
1.JDBC元数据(ResuleSetMetaData):描述ResultSet的元数据对象,可以从中获取到结果集中的列数和列名等: --使用ResultSet类的getMetaData()方法获得R ...
- JDBC课程5--利用反射及JDBC元数据(ResultSetMetaData)编写通用的查询方法
/**-利用反射及JDBC元数据编写通用的查询方法 * 1.先利用SQl语句进行查询,得到结果集--> * 2.查找到结果集的别名:id--> * 3.利用反射创建实体类的对象,创建aut ...
- JDBC 学习笔记(十)—— 使用 JDBC 搭建一个简易的 ORM 框架
1. 数据映射 当我们获取到 ResultSet 之后,显然这个不是我们想要的数据结构. 数据库中的每一个表,在 Java 代码中,一定会有一个类与之对应,例如: package com.gerrar ...
- MYSQL 之 JDBC(六): 增删改查(四)利用反射及JDBC元数据编写通用的查询
1.先利用SQL进行查询,得到结果集2.利用反射创建实体类的对象:创建Student对象3.获取结果集的列的别名:idCard.studentName4.再获取结果集的每一列的值,结合3得到一个Map ...
- 利用反射及jdbc元数据实现通用的查询方法
---------------------------------------------------------------------------------------------------- ...
随机推荐
- 抽象工厂在ADO.Net中的应用
https://msdn.microsoft.com/zh-cn/library/ms971499.aspx http://www.c-sharpcorner.com/UploadFile/moses ...
- 删除 GPT 保护分区
问题: 将内置和/或外置硬盘连接到 Windows XP 32 位操作系统时,将无法访问硬盘,“磁盘管理”将会报告该硬盘包含 GPT 保护分区.在此状态下,将无法对硬盘进行重新分区和格式化. 原因: ...
- android截屏:保存一个view的内容为图片并存放到SD卡
项目中偶尔会用到截屏分享,于是就有了下面这个截屏的方法~ 下面得saveImage()方法就是保存当前Activity对应的屏幕所有内容的截屏保存. private void saveImage() ...
- bzoj4025
首先我们要知道,怎么去维护一个是否是二分图 二分图的充要条件:点数>=2且无奇环 重点就是不存在奇环,怎么做呢 考虑随便维护一个图的生成树,不难发现,如果一条边加入后,形成奇环的话就不是二分图 ...
- 试图从数据库 ‘UFData_001_2003' 中提取的逻辑页 (1:10720) 属于对象 '0',而非对象 'syscolumns'
数据库可以使用,可以备份,但对备份进行恢复时报错,使用sp_attach_db对两个物理文件进行连接时,报同样错误: 服务器: 消息 605,级别 21,状态 1,行 1 试图从数据库 ‘UFData ...
- FTP出现211-Extension supported 停止的解决方法
FTP出问题211-Extension supported 停止的解决方法 FTP出问题211-Extension supported 停止的解决方法 FLASHFXP FTP上传登录时提示Exten ...
- 利用ffmpeg解码h264流的代码
这里也直接给出代码: h264dec.h: #pragma once #include "tdll.h" #include "avcodec.h" #inclu ...
- 持有对象:总结JAVA中的常用容器和迭代器,随机数 速查
JAVA使用术语“Collection”来指代那些表示集合的对象,JAVA提供的接口很多,首先我们先来记住他们的层次结构: java集合框架的基本接口/类层次结构 java.util.Collecti ...
- 【转】iOS中定时器NSTimer的使用
原文网址:http://www.cnblogs.com/zhulin/archive/2012/02/02/2335866.html 1.初始化 + (NSTimer *)timerWithTimeI ...
- Oracle 不同故障的恢复方案
之前在Blog中对RMAN 的备份和恢复做了说明,刚看了下,在恢复这块还有知识点遗漏了. 而且恢复这块很重要,如果DB 真要出了什么问题,就要掌握对应的恢复方法. 所以把DB的恢复这块单独拿出来说明一 ...