`

DAO通过JDBC层访问数据库获取对象的简单封装

    博客分类:
  • JDBC
阅读更多

前段时间做了个小项目由于是用JDBC来访问数据库所以通过查询来获得数据后免不了会通过实体的set方法来将对象返回到service层,这样一来工作量无形中又加了许多,而且一个方法里大量的代码都是用来封装对象,所以我就根据需要写了个简单的实体封装工具类,感兴趣的朋友可以优化、指正下:

 

package com.etc.utils;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * @Title: DAO.java
 * @Package com.etc.utils
 * @Description: DAO工具类
 * @author dc
 * @date 2012-11-28 下午10:09:43
 * @version V1.0
 */
public class DAOUtil {
	/**
	 * 根据类型和结果集来得到封装的单个对象
	 * 
	 * @param clazz
	 *            :实体类的Class对象
	 * @param rs
	 *            :JDBC查询的结果集
	 * @return
	 * @throws SQLException
	 * @throws InstantiationException
	 * @throws IllegalAccessException
	 * @throws InvocationTargetException
	 */
	public static synchronized <T> T enityEncapsulation(Class<T> clazz,
			ResultSet rs) throws SQLException, InstantiationException,
			IllegalAccessException, InvocationTargetException {
		ResultSetMetaData rsm = rs.getMetaData();
		Method[] methods = clazz.getDeclaredMethods();
		int column = rsm.getColumnCount();// 得到列数
		T obj = null;
		while (rs.next()) {
			obj = clazz.newInstance();// 创建对象实例
			for (int i = 1; i <= column; i++) {
				String set = "set" + rsm.getColumnName(i);
				for (Method method : methods) {
					// 根据数据库的列名(这里没考虑别名)实体的属性名来判断该调用的set方法
					if (method.getName().toLowerCase()
							.equals(set.toLowerCase())) {
						// 根据set方法的参数类型来确定从结果集里拿数据的方式
						// (这里的类型只有3种是应为项目只需要3种所有我没有加其他的类型)
						if (method.getGenericParameterTypes()[0]
								.equals(Integer.TYPE)) {
							method.invoke(obj, rs.getInt(i));
						} else if (method.getGenericParameterTypes()[0]
								.equals(Date.class)) {
							method.invoke(obj, rs.getDate(i));
						} else {
							method.invoke(obj, rs.getString(i));
						}
					}
				}
			}
		}
		return obj;
	}

	/**
	 * 根据类型和结果集来得到封装的对象的集合
	 * 
	 * @param clazz
	 *            :实体类的Class对象
	 * @param rs
	 *            :JDBC查询的结果集
	 * @return 返回的是list的集合(根据项目需要)
	 * @throws SQLException
	 * @throws InstantiationException
	 * @throws IllegalAccessException
	 * @throws InvocationTargetException
	 */
	public static synchronized <T> List<T> enitysEncapsulation(Class<T> clazz,
			ResultSet rs) throws SQLException, InstantiationException,
			IllegalAccessException, InvocationTargetException {
		ResultSetMetaData rsm = rs.getMetaData();
		Method[] methods = clazz.getDeclaredMethods();
		int column = rsm.getColumnCount();
		List<T> list = new ArrayList<T>();
		while (rs.next()) {
			T obj = clazz.newInstance();
			for (int i = 1; i <= column; i++) {
				String set = "set" + rsm.getColumnName(i);
				for (Method method : methods) {
					if (method.getName().toLowerCase()
							.equals(set.toLowerCase())) {
						if (method.getGenericParameterTypes()[0]
								.equals(Integer.TYPE)) {
							method.invoke(obj, rs.getInt(i));
						} else if (method.getGenericParameterTypes()[0]
								.equals(Date.class)) {
							method.invoke(obj, rs.getDate(i));
						} else {
							method.invoke(obj, rs.getString(i));
						}
					}
				}
			}
			list.add(obj);
		}
		return list;
	}
}

 使用方法挺简单的:

1.得到List集合

 

	/**
	 * 查询所有部门信息
	 * 
	 * @return 所有部门信息List
	 */
	@Override
	public List<Department> selAllDept() {
		List<Department> depts = null;
		conn = DButil.getConnection();
		try {
			ps = conn.prepareStatement("select dt1.dept_id,dt1.dept_name,dt2.dept_name as sup_dept_name,dt1.dept_dspt from t_department dt1,t_department dt2 where dt1.sup_dept_id = dt2.dept_id order by dt1.dept_id");
			rs = ps.executeQuery();
			Class<Department> clazz=Department.class;
			depts=DAOUtil.enitysEncapsulation(clazz, rs);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			DButil.close(rs, ps, conn);
		}
		return depts;
	}

 2.得到单个实体

 

	public Department selDept(int dept_id) {
		Connection conn = DButil.getConnection();
		Department dept=null;
		
		try {
			ps= conn.prepareStatement("select t1.*,t2.dept_name as sup_dept_name from t_department t1,t_department t2 where t1.sup_dept_id=t2.dept_id and t1.dept_id=?");
		    ps.setInt(1, dept_id);
            rs = ps.executeQuery();
          
            Class<Department> clazz =Department.class;
            dept=DAOUtil.enityEncapsulation(clazz, rs);
		
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			DButil.close(rs, ps, conn);
		}
		return dept;
	}

 注意:数据库里的列名和实体类的属性名字和类型要对应不然得理想的数据

分享到:
评论

相关推荐

    Java之JDBC连接MySQL数据库实现增删改查(2018 使用Dao层实现 完美封装解决硬编码问题 使用预编译对象PreparedStatement)

    Java之JDBC连接数据库实现增删改查(2018 使用Dao层实现 完美封装解决硬编码问题 使用预编译对象PreparedStatement) 配置文件 db.properties(保存数据库账号和密码等) 工具类 JDBCUtil.java(抽取公共部分,解决硬...

    Java之JDBC连接数据库实现增删改查(2018 使用Dao层实现 完美封装解决硬编码问题)

    Java之JDBC连接数据库实现增删改查(2018 使用Dao层实现 完美封装解决硬编码问题) 配置文件 db.properties(保存数据库账号和密码等) 工具类 JDBCUtil.java(抽取公共部分,解决硬编码问题) 用户账号实体类 User....

    JDBC数据库连接池DBCP jsp页面直接获取DAO层数据 demo

    本示例"JDBC数据库连接池DBCP jsp页面直接获取DAO层数据 demo"展示了如何利用Apache的DBCP数据源实现数据库连接池,并通过jsp页面直接调用DAO层获取数据。以下将详细讲解这个过程中的关键知识点。 首先,我们来了解...

    Jsp+Dao+Jdbc+Servelet 用户完整登录

    3. **DAO(Data Access Object)**:DAO模式是一种设计模式,用于封装对数据库的访问操作,使得业务逻辑与数据访问层分离。在登录系统中,DAO类会包含连接数据库、执行SQL查询(例如,查询用户是否存在并验证密码)...

    使用DAO访问数据库的例子(189KB)

    总结来说,DAO模式在Java中用于简化数据库操作,通过提供接口来封装数据访问细节。这个例子中的“DaoLib”可能包含了实现这些功能的源代码,包括DAO接口、实现类、JDBC操作以及可能的事务管理和连接池配置。通过学习...

    java 使用jdbc封装连接数据库

    通过这个简单的封装,新手可以快速掌握Java通过JDBC连接MySQL数据库的基本步骤,为进一步的数据库操作打下基础。在实际项目中,还可以结合ORM框架如Hibernate或MyBatis,进一步简化数据库操作。

    JDBC技术操纵数据库

    JDBC(Java Database ...通过这个实验,学生可以学习到如何在Java Web应用中利用JDBC与数据库进行交互,以及如何设计简单的DAO层来处理数据。这是一个很好的实践项目,有助于理解数据库操作的核心概念和实际应用。

    JSP通过JDBC驱动各种数据库方法

    9. 代码分离:为了遵循MVC(Model-View-Controller)设计模式,通常会将数据库操作封装到JavaBeans或者DAO(Data Access Object)中,JSP主要负责展示视图,而业务逻辑和数据访问则交给后台处理。 10. JDBC优化:...

    JDBC数据访问对象学习资料

    总结起来,JDBC数据访问对象学习资料将引导你理解如何在MVC架构中使用JDBC进行数据访问层的封装,包括DAO设计模式的应用,JDBC的基本操作流程,以及如何在实际项目中优化和提升数据访问的效率。通过学习,你将能够更...

    如何加快JDBC设计中JSP数据库访问速度

    总结来说,为了加速JSP中的JDBC数据库访问,我们可以: 1. 使用MVC设计模式,将数据库访问逻辑分离到Model中。 2. 创建封装数据库操作的JSP动作,通过自定义标签库实现,以减少JSP页面上的Java代码。 3. 利用`...

    JDBC与Java数据库程序设计

    在实际开发中,为提高代码可读性和复用性,通常会使用DAO(数据访问对象)模式封装JDBC操作。另外,还有许多优秀的ORM(对象关系映射)框架,如Hibernate和MyBatis,它们简化了JDBC的使用,提供了更高的抽象层。 ...

    使用JDBC操作数据库

    在实际开发中,为了增强代码的健壮性和可维护性,我们还会使用连接池(如C3P0、HikariCP等)来管理数据库连接,以及使用DAO(数据访问对象)模式封装数据库操作,使业务逻辑与数据访问层分离。 总的来说,JDBC为...

    jdbc操作oracle数据库(增删改查).docx

    JDBC 操作 Oracle 数据库(增删改查) JDBC(Java Database Connectivity)是一种Java API,用于连接和操作关系...通过使用 DAO 模式和示例代码,可以更好地封装数据访问逻辑和实现 JDBC 操作 Oracle 数据库的功能。

    用于实习jdbc的数据库连接封装类

    java用于jdbc的连接的实现类,在数据库连接的时候直接new出来就OK了!DAO层自己加写...

    ifunsu封装基于springjdbc的dao层api

    标题"ifunsu封装基于springjdbc的dao层api"指的是一个特定的项目或库,名为ifunsu,它已经对Spring JDBC进行了封装,以创建更易用的数据访问对象(DAO)层API。DAO层是应用程序中负责与数据库进行交互的部分,通常...

    自己写一个DAO 实现对jdbc dbcp封装 开源小组件

    在IT行业中,数据库访问对象(DAO)是一种设计模式,它为应用程序提供了一种与数据库交互的方式,隔离了业务逻辑层和数据访问层。本组件"自己写的一个DAO 实现对jdbc dbcp封装 开源小组件"是作者学习研究的成果,...

    用java的面向对象语言来操作关系型数据库 dao层.zip

    本压缩包文件“dao层.zip”显然关注的是数据访问对象(Data Access Object, DAO)层的设计,这是一个在Java应用中常见的用于数据库操作的抽象层。 DAO层的主要目的是将业务逻辑与数据存储机制分离,这样可以减少...

Global site tag (gtag.js) - Google Analytics