DAO는 JDBC 레이어를 통해 데이터베이스에 액세스하여 객체의 간단한 패키지를 가져옵니다.

5584 단어 DAOjdbc봉인
얼마 전에 작은 프로젝트를 만들었는데 JDBC로 데이터베이스에 접근하기 때문에 조회를 통해 데이터를 얻은 후에 실체적인 set 방법을 통해 대상을 서비스 층으로 되돌려준다. 그러면 작업량이 어느새 많이 추가되고 한 방법에 대량의 코드가 대상을 봉인하는 데 사용되기 때문에 나는 필요에 따라 간단한 실체 봉인 도구 종류를 썼다. 관심 있는 친구는 최적화하고 바로잡을 수 있다.
 
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. 리스트 컬렉션 받기
 
	/**
	 *         
	 * 
	 * @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;
	}

주의: 데이터베이스에 있는 열 이름과 실체 클래스의 속성 이름과 유형은 이상적인 데이터에 대응해야 합니다

좋은 웹페이지 즐겨찾기