반사적으로 쓴 Dao층 추상적인 부류를 이용하여 간단한 조회와 수정을 해결합니다.

7376 단어 Java 학습 노트
dao층은 클래스가 이 추상적인 클래스를 계승하는 것을 실현하고 간단한 조회 수정 코드를 간소화할 수 있다.
예를 들면 다음과 같습니다.
/**
 * @author howroad
 * @Date 2018 3 15 
 * @version 1.0
 */
public class UserDaoImpl extends ABaseDao implements IUserDao{
	@Override
	public int add(UserBean user) {	
		return excuteUpdate("insert into tb_user values(null,?,?,?,now())",user.getUsername(),user.getPassword(),user.getNickname());
	}
	@Override
	public UserBean findById(int id) {
		return fetchSingleEntity("select * from tb_user where id=?", id);
	}
	public List listByNickname(String nickName){
		return fetchList("select * from tb_user where nickname=?",nickName);
	};
}

추상 클래스는 아래와 같다(Java 9). 공부하고 있습니다. 문제를 지적해 주셔서 감사합니다.
package com.project.test;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import com.project.bean.PageBean;

/**dao           sql        javaBean/List/PageBean/     
 * @author howroad
 * @Date 2018 3 18 
 * @version 1.1		       count  long     
 * @version 1.2		       time     
 * @version 1.3		   PagePean   
 * @version 1.4		          null Bug
 * @version 1.5		   pageBean     
 * @version 1.6		     ResultSet preparedStatement    ,    limit  pageBean,     pageBean   ,     ,pageBean      int     ,    !!
 * @version 1.7 	   pgaeBean               bug
 */
public abstract class ABaseDao {
	private final static String URL="jdbc:mysql://127.0.0.1:3306/db_forest_disaster?useUnicode=true&characterEncoding=UTF-8";
	private final static String USER="root";
	private final static String PASSWORD="luhao123";
	static {
		try {
			//    
			Class.forName("com.mysql.jdbc.Driver");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
	private Connection conn=null;
	private Class entityClass=null;
	//java9   newInstance()      
	private Constructor constructor=null;
	private Field[] fields=null;
	@SuppressWarnings("unchecked")
	protected ABaseDao() {
		//       
		ParameterizedType pt=(ParameterizedType)this.getClass().getGenericSuperclass();
		//       
		entityClass= (Class) pt.getActualTypeArguments()[0];
		//           
		try {
			constructor= entityClass.getDeclaredConstructor();
		} catch (Exception e) {
			e.printStackTrace();
		}
		//      Field  
		fields=entityClass.getDeclaredFields();
	}
	
	/**
	 *        
	 * @return     
	 */
	protected Connection getConn() {
		try {
			conn=DriverManager.getConnection(URL,USER,PASSWORD);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return conn;
	}
	
	/**
	 *        
	 */
	protected void close() {
		try {
			if(conn!=null) conn.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	
	/**
	 *      
	 * @param rs    
	 * @param ps    sql PreparedStatement
	 * @param sql     
	 * @param objs      
	 * @return    
	 *   rs ps        rs ps
	 */
	private ResultSet excuteQuery(ResultSet rs,PreparedStatement ps,String sql,Object...objs) {
		try {
			ps=conn.prepareStatement(sql);
			for(int i=0;i fetchList(String sql,Object...objs){
		List list = new ArrayList();
		PreparedStatement ps =null;
		ResultSet rs =null;
		//     
		getConn();
		rs=excuteQuery(rs,ps,sql, objs);
		try {
			while(rs.next()) {
				E entity=constructor.newInstance();
				// E        
				setField(entity, fields, rs);
				//     
				list.add(entity);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			//     
			try {
				if(rs!=null) rs.close();
				if(ps!=null) ps.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
			close();
		}
		return list;
	}
	
	
	/**
	 *           
	 * @param pageSize     
	 * @param pageNo     
	 * @param sql     
	 * @param objs      
	 * @return     PageBean
	 *   :            !!
	 */
	protected PageBean fetchPageBean(int pageNo,int pageSize,String sql,Object...objs){
		getConn();
		//  pageBean         
		PreparedStatement ps = null;
		ResultSet rs = null;
		rs = excuteQuery(rs,ps,sql, objs);
		int countRecord=countRs(rs);
		// limit   sql      
		PreparedStatement ps2 = null;
		ResultSet rs2 = null;
		int position = pageSize * (pageNo-1);
		String sql2=sql+" limit "+position+","+pageSize;
		rs2=excuteQuery(rs2,ps2,sql2, objs);
		//      
		List list = new ArrayList();
		try {
			while(rs2.next()) {
				//          
				E entity=constructor.newInstance();
				setField(entity, fields, rs2);
				//     
				list.add(entity);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			//     ...
			try {
				if(rs2!=null) rs2.close();
				if(rs!=null) rs.close();
				if(ps2!=null) ps2.close();
				if(ps!=null) ps.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
			close();
		}
		return new PageBean(list, pageNo, pageSize, countRecord);
	}
	
	//  :               ,        ...
	public PageBean fetchPageBean2(int pageNo,int pageSize,String sql,Object...objs){
		//            
		PreparedStatement ps = null;
		ResultSet rs = null;
		getConn();
		rs = excuteQuery(rs,ps,sql, objs);
		//  list
		List list = new ArrayList();
		int countRecord = 0;
		int start = pageSize * (pageNo-1);
		int end = start+pageSize;
		try {
			while(rs.next()) {
				//       end,   countRecord  
				if(countRecord>=end) {
					rs.last();
					countRecord=rs.getRow();
					break;
				}
				//            
				if(countRecord>=start) {
					//         
					E entity=constructor.newInstance();
					setField(entity, fields, rs);
					list.add(entity);
				}
				//      
				countRecord++;
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			//    
			try {
				if(rs!=null) rs.close();
				if(ps!=null) ps.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
			close();
		}
		return new PageBean(list, pageNo, pageSize, countRecord);
	}
	
	/**
	 *       ,          javaBean             
	 * @param entity   
	 * @param fields       
	 * @param rs    
	 * @throws Exception 
	 * @throws Exception   
	 */
	private void setField(E entity,Field[] fields,ResultSet rs) throws Exception{
		//          ( )
		int countRow = rs.getMetaData().getColumnCount();
		//    javaBean     ,  javaBean     
		for (int i=0;i

좋은 웹페이지 즐겨찾기