JDBC连接数据库之从结果集中获取对象(3)

测试利用反射返回List对象的数据。

	public <T> List<T> getForList(Class<T> clazz, 
			String sql, Object... args) {

		List<T> list = new ArrayList<T>();

		Connection connection = null;
		PreparedStatement preparedStatement = null;
		ResultSet resultSet = null;

		try {
			//1. 得到结果集
			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. 处理结果集, 得到 Map 的 List, 其中一个 Map 对象
			//就是一条记录. Map 的 key 为 reusltSet 中列的别名, Map 的 value
			//为列的值. 
			List<Map<String,Object>>values=
					new ArrayList<Map<String,Object>>();
			ResultSetMetaData rsmd=resultSet.getMetaData();
			Map<String,Object> map=null;
            while(resultSet.next()){
            	//把一条记录放入Map中
               map=new HashMap<String,Object>();
               for(int i=0;i<rsmd.getColumnCount();i++){
            	   String columnLabel=rsmd.getColumnLabel(i+1);
            	   Object value=resultSet.getObject(i+1);
            	   map.put(columnLabel, value);
               }
               values.add(map);
            }
            T bean=null;
            if(values.size()>0){
            	for(Map<String,Object> m:values){
            		bean=clazz.newInstance();
            		for(Map.Entry<String, Object>entry:m.entrySet()){
            			String propertyName=entry.getKey();
            			Object value=entry.getValue();
            			BeanUtils.setProperty(bean, propertyName, value);
            		}
            		list.add(bean);
            	}
            }

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JDBCTools.releaseDB(resultSet, preparedStatement, connection);
		}

		return list;
	}
	public void testGetForList(){
		String sql="select ID id,NAME name,EMAIL email,BIRTH birth from customers";
	}
可以讲方法抽取到DAO.java中。

package com.atguigu.jdbc;


import java.lang.reflect.InvocationTargetException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.beanutils.BeanUtils;

public class DAO {

// INSERT, UPDATE, DELETE 操作都可以包含在其中
public void update(String sql, Object... args) {
Connection connection = null;
PreparedStatement preparedStatement = null;

try {
connection = JDBCTools.getConnection();
preparedStatement = connection.prepareStatement(sql);

for (int i = 0; i < args.length; i++) {
preparedStatement.setObject(i + 1, args[i]);
}

preparedStatement.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCTools.releaseDB(null, preparedStatement, connection);
}
}

// 查询一条记录, 返回对应的对象
public <T> T get(Class<T> clazz, String sql, Object... args) {
List<T> result = getForList(clazz, sql, args);
if(result.size() > 0){
return result.get(0);
}

return null;
}

/**
* 传入 SQL 语句和 Class 对象, 返回 SQL 语句查询到的记录对应的 Class 类的对象的集合
* @param clazz: 对象的类型
* @param sql: SQL 语句
* @param args: 填充 SQL 语句的占位符的可变参数. 
* @return
*/
public <T> List<T> getForList(Class<T> clazz, 
String sql, Object... args) {


List<T> list = new ArrayList<T>();


Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;


try {
//1. 得到结果集
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. 处理结果集, 得到 Map 的 List, 其中一个 Map 对象
//就是一条记录. Map 的 key 为 reusltSet 中列的别名, Map 的 value
//为列的值. 
List<Map<String, Object>> values = 
handleResultSetToMapList(resultSet);

//3. 把 Map 的 List 转为 clazz 对应的 List
//其中 Map 的 key 即为 clazz 对应的对象的 propertyName, 
//而 Map 的 value 即为 clazz 对应的对象的 propertyValue
list = transfterMapListToBeanList(clazz, values);


} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCTools.releaseDB(resultSet, preparedStatement, connection);
}


return list;
}


public <T> List<T> transfterMapListToBeanList(Class<T> clazz,
List<Map<String, Object>> values) throws InstantiationException,
IllegalAccessException, InvocationTargetException {


List<T> result = new ArrayList<T>();


T bean = null;


if (values.size() > 0) {
for (Map<String, Object> m : values) {
bean = clazz.newInstance();
for (Map.Entry<String, Object> entry : m.entrySet()) {
String propertyName = entry.getKey();
Object value = entry.getValue();


BeanUtils.setProperty(bean, propertyName, value);//其中BeanUtils jar包依赖于common-loggingjar包
}
// 13. 把 Object 对象放入到 list 中.
result.add(bean);
}
}


return result;
}


/**
* 处理结果集, 得到 Map 的一个 List, 其中一个 Map 对象对应一条记录
* 
* @param resultSet
* @return
* @throws SQLException
*/
public List<Map<String, Object>> handleResultSetToMapList(
ResultSet resultSet) throws SQLException {
// 5. 准备一个 List<Map<String, Object>>:
// 键: 存放列的别名, 值: 存放列的值. 其中一个 Map 对象对应着一条记录
List<Map<String, Object>> values = new ArrayList<Map<String, Object>>();


List<String> columnLabels = getColumnLabels(resultSet);
Map<String, Object> map = null;


// 7. 处理 ResultSet, 使用 while 循环
while (resultSet.next()) {
map = new HashMap<String, Object>();


for (String columnLabel : columnLabels) {
Object value = resultSet.getObject(columnLabel);
map.put(columnLabel, value);
}


// 11. 把一条记录的一个 Map 对象放入 5 准备的 List 中
values.add(map);
}
return values;
}


/**
* 获取结果集的 ColumnLabel 对应的 List
* 
* @param rs
* @return
* @throws SQLException
*/
private List<String> getColumnLabels(ResultSet rs) throws SQLException {
List<String> labels = new ArrayList<String>();


ResultSetMetaData rsmd = rs.getMetaData();
for (int i = 0; i < rsmd.getColumnCount(); i++) {
labels.add(rsmd.getColumnLabel(i + 1));
}


return labels;
}


// 返回某条记录的某一个字段的值 或 一个统计的值(一共有多少条记录等.)
public <E> E getForValue(String sql, Object... args) {

//1. 得到结果集: 该结果集应该只有一行, 且只有一列
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;


try {
//1. 得到结果集
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()){
return (E) resultSet.getObject(1);
}
} catch(Exception ex){
ex.printStackTrace();
} finally{
JDBCTools.releaseDB(resultSet, preparedStatement, connection);
}
//2. 取得结果

return null;
}

}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本书提供了JDBCTMAPI的权威教程与参考·~JDBCAPI技术支持使用JavaTM编程语言进行通用数据访问,该版本进行了更新和扩展,覆盖整个JDBC 3.0API的内容,包括。iava.sql包和易于构建服务器端应用程序的javax.sql包。 除了介绍JDBC 3.0 API规范外,本书还包含了更深层次的解释——从循序渐进的教程到每一个类和接口的全面参考。 对于那些学习Java技术的新手而言,本书还介绍了Java编程语言和SQL的基础知识。以此为起点,您将学习如何建立数据库、如何建立连接、如何从结果集中获取值以及如何使用准备语句,从而学会创建完整的JDBC应用程序。另外,本书提供了很多示例,也举例说明了执行通用任务的方法。然后,本书转向更高级的主题,集中介绍JDBC 3.0API的一些高级功能,如可滚动和可更新的结果集、批量更新、SQL99数据类型、定制映射、保存点、语句池以及自动生成键等。 除了深入介绍JDBC元数据API之外,本书还给出了行集的最新信息。行集技术支持以JavaBeansTM组件来处理数据集。此外,本书还介绍了JdbcRowSet、CachedRowSet、WebRowSet、JoinRowSet和FilteredRowSet对象的标准实现。 本书对JDBCAPI的每个类和接口(从Array到XADataSource)都提供了简洁但完整的信息。每个类不但包含用例的概述,还包含方法和域的详尽解释。 文有关SQL类型和Java编程语言的类型之间的映射关系的章节、附录A、JDBC 2.0和3.0API新特征的总结以及术语表,对所有数据库程序员来说都是必不可少的资源。
本书提供了JDBCTMAPI的权威教程与参考·~JDBCAPI技术支持使用JavaTM编程语言进行通用数据访问,该版本进行了更新和扩展,覆盖整个JDBC 3.0API的内容,包括。iava.sql包和易于构建服务器端应用程序的javax.sql包。 除了介绍JDBC 3.0 API规范外,本书还包含了更深层次的解释——从循序渐进的教程到每一个类和接口的全面参考。 对于那些学习Java技术的新手而言,本书还介绍了Java编程语言和SQL的基础知识。以此为起点,您将学习如何建立数据库、如何建立连接、如何从结果集中获取值以及如何使用准备语句,从而学会创建完整的JDBC应用程序。另外,本书提供了很多示例,也举例说明了执行通用任务的方法。然后,本书转向更高级的主题,集中介绍JDBC 3.0API的一些高级功能,如可滚动和可更新的结果集、批量更新、SQL99数据类型、定制映射、保存点、语句池以及自动生成键等。 除了深入介绍JDBC元数据API之外,本书还给出了行集的最新信息。行集技术支持以JavaBeansTM组件来处理数据集。此外,本书还介绍了JdbcRowSet、CachedRowSet、WebRowSet、JoinRowSet和FilteredRowSet对象的标准实现。 本书对JDBCAPI的每个类和接口(从Array到XADataSource)都提供了简洁但完整的信息。每个类不但包含用例的概述,还包含方法和域的详尽解释。 文有关SQL类型和Java编程语言的类型之间的映射关系的章节、附录A、JDBC 2.0和3.0API新特征的总结以及术语表,对所有数据库程序员来说都是必不可少的资源。
### 回答1: JDBCJava连接数据库的标准API,使用JDBC连接数据库的步骤如下: 1. 加载数据库驱动程序:使用`Class.forName()`方法加载数据库驱动程序,例如: ```java Class.forName("com.mysql.jdbc.Driver"); ``` 2. 创建连接对象:使用`DriverManager.getConnection()`方法创建数据库连接对象,例如: ```java Connection conn = DriverManager.getConnection(url, username, password); ``` 其,`url`是数据库连接字符串,`username`和`password`是数据库的用户名和密码。 3. 创建执行SQL语句的Statement对象:使用`Connection.createStatement()`方法创建Statement对象,例如: ```java Statement stmt = conn.createStatement(); ``` 4. 执行SQL语句:使用`Statement.execute()`、`Statement.executeQuery()`或`Statement.executeUpdate()`方法执行SQL语句,例如: ```java ResultSet rs = stmt.executeQuery("SELECT * FROM users"); ``` 5. 处理查询结果:如果执行的是查询语句,需要使用ResultSet对象获取查询结果,例如: ```java while (rs.next()) { String name = rs.getString("name"); int age = rs.getInt("age"); // ... } ``` 6. 关闭连接:使用`Connection.close()`方法关闭连接对象,例如: ```java conn.close(); ``` 注意,连接对象、Statement对象和ResultSet对象都需要在使用完毕后关闭,以释放资源。 ### 回答2: JDBCJava Database Connectivity)是Java语言操作数据库的标准接口,通过JDBC可以连接和操作各种类型的数据库。下面是JDBC连接数据库的基本步骤: 1. 加载数据库驱动程序:使用Class.forName()方法加载并注册数据库驱动程序。例如,如果要连接MySQL数据库,需要加载并注册com.mysql.jdbc.Driver类。 2. 建立数据库连接:使用DriverManager类的getConnection()方法建立和数据库的连接。该方法需要传递数据库的URL、用户名和密码等参数。例如,如果要连接MySQL数据库,URL的格式为jdbc:mysql://主机名:端口号/数据库名。 3. 创建Statement对象:使用Connection对象的createStatement()方法创建一个Statement对象,用于执行SQL语句。 4. 执行SQL语句:使用Statement对象的executeQuery()方法执行查询操作,或者使用executeUpdate()方法执行插入、更新或删除等操作。这些方法接收SQL语句作为参数。 5. 处理查询结果:如果执行的是查询操作,则使用ResultSet对象来处理查询结果。可以使用ResultSet的next()方法遍历结果集,并使用getXXX()方法获取结果集中的数据。 6. 关闭连接和资源:使用Statement、ResultSet和Connection等对象完成相应的操作后,需要调用它们的close()方法来关闭连接和释放资源。这可以通过在finally块实现。 JDBC连接数据库的过程可以通过以上步骤来完成,这些步骤可以用于连接不同类型的数据库,只需根据具体情况修改相应的数据库驱动程序和连接参数。 ### 回答3: JDBCJava数据库连接)是Java编程语言用于与数据库进行交互的一种标准方式。使用JDBC连接数据库需要经过以下步骤: 1. 加载数据库驱动:首先,需要加载适用于所使用的数据库的驱动程序。通过使用Class.forName()方法加载特定数据库的驱动类,通常是通过将驱动程序的JAR文件添加到项目的类路径实现。 2. 建立数据库连接:通过使用DriverManager类的getConnection()方法,提供数据库的URL、用户名和密码来建立与数据库的连接。URL包括数据库的类型、主机名、端口号以及要连接的特定数据库的名称等信息。 3. 创建执行语句:一旦连接建立,可以使用Connection对象的createStatement()方法来创建一个Statement对象或PreparedStatement对象,用于执行要在数据库上执行的SQL语句。 4. 执行SQL语句:使用Statement对象或PreparedStatement对象的executeQuery()方法来执行查询语句,或使用executeUpdate()方法来执行更新语句。 5. 处理结果:如果执行的是查询语句,可以使用ResultSet对象来检索数据库返回的结果集中的数据。通过遍历结果集并提取所需的数据,可以实现对数据库的数据进行操作。 6. 关闭连接:在完成与数据库的交互后,需要关闭数据库连接,释放相关资源。可以使用Connection对象的close()方法来关闭连接。需要注意的是,应该始终在使用完数据库连接后关闭连接,以防止资源泄漏和数据库连接池的耗尽。 以上就是连接数据库时使用JDBC的一般步骤,具体的实现可以根据所使用的具体数据库和编程要求进行调整。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值