JAVAはDAO層基本CRUD操作を実現

34196 ワード

shh 2フレームワークの様々な操作の利便性に伴い、ますます多くのJAVA WEB開発者がこれらのフレームワークに参加することで開発効率を高めることを選択しているが、これらのフレームワークの使用を理解していない場合、プロジェクトを手に入れると盲目的にこれらのフレームワークを選択して系統的なアーキテクチャの構築を行うことは、多くの不要な資源の浪費をもたらす可能性がある.
      プロジェクト開発において、データベースのCRUD操作は一般的に避けられない操作であり、hibernateパッケージは完璧であるが、本人はこのフレームワークの下層原理をよく知らないため、使用するたびに心の底が底をついていないと感じ、コードが異常になると、迅速かつ効果的に解決できないことが多い.コード異常処理リスクを自分の制御可能範囲内に制御するためには、まずデータのCRUD永続化操作(DAO)を自分の方法でJDBCでカプセル化し、自分のコードをよりよく管理することを決定する.Hibernateフレームワークの使用については,まずそのいくつかの下位実装原理を理解してから,プロジェクトの必要に応じて適宜選択して使用する. 
      以下、DAO層データベースの基本的なCRUD操作に関するJAVA実装について具体的に説明します(ここではMySQLを例に挙げていますが、他のデータベースは一部修正するだけです).
      メモ:この例を試用するには、与えられた順序で対応するクラスを順番に作成するだけです.また、プロジェクトlibディレクトリの下にmysqlリンクjarパッケージを追加します.
  (1)データソース定数クラスの定義
package com.jkitn.jkits.common;

/**
 *         
 * @author xdweleven
 * @version 1.0
 */
public class JdbcConfig {
	 /**       */
	 public static final String DRIVERCLASSNAME = "com.mysql.jdbc.Driver";
	 /**    URL */
	 public static final String URL = "jdbc:mysql://localhost:3306/app_jkit";
	 /**        */
	 public static final String USERNAME = "root";
	 /**       */
	 public static final String PASSWORD = "root";
}

(2)結果セット(ResultSet)からpojoオブジェクトへのマッピングの定義
package com.jkitn.jkits.dao.common;

import java.lang.reflect.Field;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 *   :      pojo     
 * @author xdweleven
 * @version 1.0 
 */
public class RowMapper{
	private Class objectClass;
	
	public RowMapper(Class objectClass) {
		this.objectClass = objectClass;
	}
	
	/**
	 *             
	 * @param rs    
	 * @param rowNum     
	 * @return
	 * @throws SQLException
	 */
	public T mapRow(ResultSet rs, int rowNum) throws SQLException {
		try {
			T object = objectClass.newInstance(); 
			//           
			ResultSetMetaData metaData = rs.getMetaData();
			int columnNum = metaData.getColumnCount();
			Field[] fields = object.getClass().getDeclaredFields();
			//         ,    ,    null.
			for (int i = 0; i < fields.length; i++) {
				Field field = fields[i];
				int flag = 0;
				for (int j = 1; j <= columnNum; j++) {
					if (metaData.getColumnName(j).toLowerCase().equals(field.getName().toLowerCase())) {
						flag = 1;
						break;
					}
				}
				field.setAccessible(true);
				if (flag == 1) {
					this.typeMapper(field, object, rs);
				}else {
					field.set(object, null);
				}	
				field.setAccessible(false);
			}
			return object;
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 *              
	 * @param rs
	 * @return
	 */
	public List mapRows(ResultSet rs){
		int rowNum = 0;
		List objList = new ArrayList();
		try {
			while(rs.next()){
				objList.add(this.mapRow(rs, rowNum++));
			}
			rs.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return objList;
	}
	
	
	/**
	 *      
	 * @param field
	 * @param obj
	 * @param rs
	 * @throws IllegalArgumentException
	 * @throws IllegalAccessException
	 * @throws SQLException
	 */
	private void typeMapper(Field field, Object obj, ResultSet rs) {
		String typeName = field.getType().getName(); //       
		try {
			if (typeName.equals("java.lang.String")) {
				field.set(obj, rs.getString(field.getName()));
			} else if (typeName.equals("int")
					|| typeName.equals("java.lang.Integer")) {
				field.set(obj, rs.getInt(field.getName()));
			} else if (typeName.equals("long")
					|| typeName.equals("java.lang.Long")) {
				field.set(obj, rs.getLong(field.getName()));
			} else if (typeName.equals("float")
					|| typeName.equals("java.lang.Float")) {
				field.set(obj, rs.getFloat(field.getName()));
			} else if (typeName.equals("double")
					|| typeName.equals("java.lang.Double")) {
				field.set(obj, rs.getDouble(field.getName()));
			} else if (typeName.equals("boolean")
					|| typeName.equals("java.lang.Boolean")) {
				field.set(obj, rs.getBoolean(field.getName()));
			} else if (typeName.equals("java.util.Date")) {
				field.set(obj, rs.getTimestamp(field.getName()));
			} else {
			}
		} catch (IllegalArgumentException e) {			
			e.printStackTrace();
		} catch (IllegalAccessException e) {			
			e.printStackTrace();
		} catch (SQLException e) {			
			e.printStackTrace();
		}
	}
}

  (3)データベース接続支援クラスDBConnの定義
package com.jkitn.jkits.common;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

import com.jkitn.jkits.dao.common.RowMapper;

/**
 *           DBConn
 * @author xdweleven
 * @version 1.0 
 */
public class DBConn {
    private Connection conn = null;
    private PreparedStatement pstmt = null;
    private ResultSet rs = null; 
    
    /**
     *         
     * @return          
     */
    public Connection getConn(){        
        try {                     
			//        
            Class.forName(JdbcConfig.DRIVERCLASSNAME);
            //   Connection    ,    MySQL        
            conn = DriverManager.getConnection(JdbcConfig.URL, JdbcConfig.USERNAME, JdbcConfig.PASSWORD);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }    
        return conn;
    }

	/**
	 *        (       )
	 * @param sql     sql  
	 * @param objs                
	 * @return null
	 * @throws Exception 
	 */
	public int execUpdate(String sql, Object ...objs) throws Exception{
			//        
			pstmt = this.getConn().prepareStatement(sql);
			if(objs != null && objs.length > 0){
				for(int i = 0; i < objs.length; i++){
					pstmt.setObject(i+1, objs[i]);
				}
			}
			//       
			int result = pstmt.executeUpdate();
			//     ,    
			this.close(rs, pstmt, conn);
			return result;
	}

	/**
	 *        
	 * @param sql    sql  
	 * @param objs                
	 * @return  T List    ,             
	 * @throws Exception 
	 */
	public  List execQuery(String sql, RowMapper mapper, Object ...objs) throws Exception{
		//        
		pstmt = this.getConn().prepareStatement(sql);
		if(objs != null && objs.length > 0){
			for(int i = 0; i < objs.length; i++){
				pstmt.setObject(i+1, objs[i]);
			}
		}
		//       
		rs = pstmt.executeQuery();
		//           
		List result = mapper.mapRows(rs);
		//     ,    
		this.close(rs, pstmt, conn);
		return result;
	}	
	
	/**
	 *      SQL        
	 * @param sql SQL  
	 * @param params   
	 * @return      
	 */
	public ResultSet queryForResultSet(String sql, Object... objs) throws Exception{
		//        
		pstmt = conn.prepareStatement(sql);
		if(objs != null && objs.length > 0){
			for(int i = 0; i < objs.length; i++){
				pstmt.setObject(i+1, objs[i]);
			}
		}
		//       
		rs = pstmt.executeQuery();
		//     ,    
		this.close(null, pstmt, conn);
		return rs;
	}
	
	/**
	 *        ,         
	 * @param rs   、ppst     、conn   
	 * @return null
	 * @throws Exception 
	 */
	public void close(ResultSet rs, PreparedStatement ppst, Connection conn) throws Exception{
		if(rs != null){
			rs.close();
		}
		if(ppst != null){ 
			ppst.close();
		}
		if(conn != null){
			conn.close();
		}
	}
}

 (4)汎用ページングクエリーエンティティークラスの定義
package com.jkitn.jkits.common;

import java.util.List;

/**
 *   :           
 * @author xdweleven
 * @version 1.0
 */
public class PageBean {
	private int totalRows; //     
	private int totalPages; //    
	private int curPage; //     
	private int prePage; //      
	private int nextPage; //      
	private int rowsPerPage; //          
	private List pageList; //        
	
    /**
     *      bean  
     * @param totalRows     
     * @param rowsPerPage         
     */
	public void initPageBean(int totalRows, int rowsPerPage){
		this.rowsPerPage = rowsPerPage;
		this.totalRows = totalRows;
		this.totalPages = (this.totalRows-1)/this.rowsPerPage + 1;
		//      
		if(this.curPage == 1){
			this.setPrePage(1);
		}else{
			this.setPrePage(this.curPage-1);
		}
		//      
		if(this.curPage == this.totalPages){
			this.setNextPage(this.totalPages);
		}else{
			this.setNextPage(this.curPage + 1);
		}
	}
	
	/**
	 *   SQLServer       
	 * @param sql   sql  
	 * @param curPage    
	 * @param rowsPerPage       
	 */
	public String getPageSQLServer(String sql, int curPage, int rowsPerPage){
		String afterFrom = sql.toLowerCase().substring(sql.indexOf("from"));
		String pageSql = null;
		if(afterFrom.indexOf("where") == -1){
			 pageSql = "select top "+ rowsPerPage + " * "+afterFrom
			+" where id not in(select top "+rowsPerPage*(curPage-1)+" id "
			+afterFrom+" order by id desc)"+"order by id desc";
		}else{
			pageSql = "select top "+ rowsPerPage + " * "+afterFrom
			+" and id not in(select top "+rowsPerPage*(curPage-1)+" id "
			+afterFrom+" order by id desc)"+"order by id desc";
		}
		return pageSql;
	}
	
	/**
	 *   MySql  sql  
	 * @param sql   sql  
	 * @param curPage    
	 * @param rowsPerPage       
	 * @return     SQL  
	 */
	public String getPageMySQL(String sql, int curPage, int rowsPerPage){
		String pageSql = sql+" limit "+ (curPage-1)*rowsPerPage+","+rowsPerPage;
		return pageSql;
	}
	
	/**
	 *   Oracle      
	 * @param sql   sql  
	 * @return     SQL  
	 */
	public String getOrclPageSql(String sql){
		int begin = (curPage - 1) * rowsPerPage;
		int end = begin + rowsPerPage;
		StringBuffer pagingSelect = new StringBuffer(300);
		pagingSelect.append("select * from ( select row_.*, rownum rownum_ from ( ");
		pagingSelect.append(sql);
		pagingSelect.append(" ) row_ where rownum <= "+end+") where rownum_ > "+begin);
		return pagingSelect.toString();
	}
	
	public List getPageList() {
		return pageList;
	}

	public void setPageList(List pageList) {
		this.pageList = pageList;
	}
	public int getTotalRows() {
		return totalRows;
	}

	public void setTotalRows(int totalRows) {
		this.totalRows = totalRows;
	}

	public int getTotalPages() {
		return totalPages;
	}

	public void setTotalPages(int totalPages) {
		this.totalPages = totalPages;
	}

	public int getCurPage() {
		return curPage;
	}

	public void setCurPage(int curPage) {
		this.curPage = curPage;
	}

	public int getPrePage() {
		return prePage;
	}

	public void setPrePage(int prePage) {
		this.prePage = prePage;
	}

	public int getNextPage() {
		return nextPage;
	}

	public void setNextPage(int nextPage) {
		this.nextPage = nextPage;
	}

	public int getRowsPerPage() {
		return rowsPerPage;
	}

	public void setRowsPerPage(int rowsPerPage) {
		this.rowsPerPage = rowsPerPage;
	}
}

 (5)SQL文を定義する一般的なメソッドツールクラス
package com.jkitn.jkits.util;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 *   :           SQL          
 * @author xdweleven
 * @version 1.0 
 */
public class SQLUtil {	
	/**
	 *            SQL  ,              
	 * @param obj      SQL     
	 * @param tableName                
	 * @return       SQL  、SQL            Map  
	 */
	public static Map generateInsertExceptNull(Object obj, String tableName) {
		StringBuffer columnStrBuf = new StringBuffer(); //           
		StringBuffer paramStrBuf = new StringBuffer(); //   SQL          
		List paramValues = new ArrayList(); //        
		List paramsType = new ArrayList(); //        
		//                    
		List fieldList = ReflectionUtil.getNotNullField(obj);
		try {
			for (int i = 0; i < fieldList.size(); i++) {
				Field field = (Field) fieldList.get(i);
				field.setAccessible(true);
				//         
				columnStrBuf.append(field.getName());
				if (i != fieldList.size() - 1) {
					columnStrBuf.append(",");
				}
				
				//     SQL        
				if("class java.util.Date".equals(field.getType().toString())
						&& field.get(obj) != null){
					String timeStr = DateUtil.formatDate((Date)field.get(obj), "yyyy-MM-dd HH:mm:ss");
					paramStrBuf.append("to_date(?, 'yyyy-MM-dd HH24:mi:ss')");
					paramValues.add(timeStr);
					//            
					paramsType.add(getOrclDataType(field.getType().toString()));
				}else{
					paramStrBuf.append("?");
					paramValues.add(field.get(obj));
					//            
					paramsType.add(getOrclDataType(field.getType().toString()));
				}
				
				if (i != fieldList.size() - 1) {
					paramStrBuf.append(",");
				}
			}
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
		//        SQL  
		StringBuffer sb = new StringBuffer();
		sb.append("insert into ");
		sb.append(tableName);
		sb.append(" (");
		sb.append(columnStrBuf);
		sb.append(") ");
		sb.append("values");
		sb.append(" (");
		sb.append(paramStrBuf);
		sb.append(")");
		//     SQL  、SQL                map     
		Map sqlMap = new HashMap();
		sqlMap.put("sql", sb.toString());
		sqlMap.put("paramsValues", paramValues.toArray());
		sqlMap.put("paramsTypes", paramsType.toArray());
		return sqlMap;
	}

	/**
	 *            SQL  ,             ,        ,    ,       null.
	 * @param obj      SQL     
	 * @param tableName                
	 * @param keyColumn        
	 * @return       SQL  、SQL            Map  
	 * @throws IllegalAccessException 
	 * @throws IllegalArgumentException 
	 */
	public static Map generateInsertWithNull(Object obj, 
			String tableName, String keyColumn) throws IllegalArgumentException, IllegalAccessException {
		StringBuffer columnStrBuf = new StringBuffer(); 
		StringBuffer paramStrBuf = new StringBuffer(); //   SQL          
		List columnNameList = new ArrayList(); //           
		List paramValues = new ArrayList(); //        
		List paramsType = new ArrayList(); //        
		Field[] fields = obj.getClass().getDeclaredFields();
		for(int i = 0; i < fields.length; i++){
			fields[i].setAccessible(true);
			//         
			if(!fields[i].getName().equalsIgnoreCase(keyColumn)){ //         SQL        
				columnStrBuf.append(fields[i].getName());
				columnNameList.add(fields[i].getName());
				if (i != fields.length - 1) {
					columnStrBuf.append(",");
				}
				if("class java.util.Date".equals(fields[i].getType().toString())
						&& fields[i].get(obj) != null){
					String timeStr = DateUtil.formatDate((Date)fields[i].get(obj), "yyyy-MM-dd HH:mm:ss");
					paramStrBuf.append("to_date(?, 'yyyy-MM-dd HH24:mi:ss')");
					paramValues.add(timeStr);
					//            
					paramsType.add(getOrclDataType(fields[i].getType().toString()));
				}else{
					paramStrBuf.append("?");
					paramValues.add(fields[i].get(obj));
					//            
					paramsType.add(getOrclDataType(fields[i].getType().toString()));
				}
				if (i != fields.length - 1) {
					paramStrBuf.append(",");
				}
			}
		}
		//        SQL  
		StringBuffer sb = new StringBuffer();
		sb.append("insert into ");
		sb.append(tableName);
		sb.append(" (");
		sb.append(columnStrBuf);
		sb.append(") ");
		sb.append("values");
		sb.append(" (");
		sb.append(paramStrBuf);
		sb.append(")");
		//     SQL  、SQL       map     
		Map sqlMap = new HashMap();
		
	/*		
		System.out.println(sb.toString());
		System.out.println(columnNameList.toString());
		System.out.println(paramValues.toString());
		System.out.println(paramsType.toString());
	*/		
		sqlMap.put("sql", sb.toString());
		sqlMap.put("columnNameList", columnNameList.toArray());
		sqlMap.put("paramsValues", paramValues.toArray());
		sqlMap.put("paramsTypes", paramsType.toArray());
		return sqlMap;
	}
	
	
	/**
	 *            SQL  
	 * @param obj      SQL     
	 * @param tableName                
	 * @param keyColumn           
	 * @return       SQL         
	 */
	public static Object[] generateUpdate(Object obj, String tableName, String keyColumn) {
		StringBuffer columnSB = new StringBuffer();
		List params = new ArrayList();
		Object keyValue = null;
		//                 
		List fieldList = ReflectionUtil.getNotNullField(obj);
		try {
			for (int i = 0; i < fieldList.size(); i++) {
				Field field = (Field) fieldList.get(i);
				field.setAccessible(true);

				if (field.getName().equalsIgnoreCase(keyColumn)) {
					keyValue = field.get(obj);
				} else {
					columnSB.append(field.getName());	
					if("class java.util.Date".equals(field.getType().toString())
							&& field.get(obj) != null){
						String timeStr = DateUtil.formatDate((Date)field.get(obj), "yyyy-MM-dd HH:mm:ss");
						columnSB.append("=to_date(?, 'yyyy-MM-dd HH24:mi:ss')");
						params.add(timeStr);
					}else{
						columnSB.append("=?");
						params.add(field.get(obj));
					}
					if (i != fieldList.size() - 1) {
						columnSB.append(",");
					}
				}
			}
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
		if (keyValue == null) {
			throw new IllegalArgumentException("    [" + tableName+ "]     '"+keyColumn+"'      .");
		}else{
			params.add(keyValue);
		}
		StringBuffer sb = new StringBuffer();
		sb.append("update ");
		sb.append(tableName);
		sb.append(" set ");
		if(columnSB.length() >= 0){
			sb.append(columnSB);
		}else{
			sb.append(keyColumn);
			sb.append("=? ");
			params.add(keyValue);
		}		
		sb.append(" where ");
		sb.append(keyColumn);
		sb.append("=? ");
		return new Object[] { sb.toString(), params.toArray() };
	}
	
	/**
	 *   java       Oracle         
	 * @param javaType java    
	 * @return   Oracle          
	 */
	public static int getOrclDataType(String javaType){
		if("class java.lang.String".equals(javaType)){
			return java.sql.Types.VARCHAR;
		}else if("class java.lang.Integer".equals(javaType) || "int".equals(javaType)){
			return java.sql.Types.INTEGER;
		}else if("class java.lang.Double".equals(javaType) || "double".equals(javaType)){
			return java.sql.Types.DOUBLE;
		}else if("class java.lang.Float".equals(javaType) || "float".equals(javaType)){
			return java.sql.Types.FLOAT;
		}else if("char".equals(javaType)){
			return java.sql.Types.CHAR;
		}else if("class java.lang.Long".equals(javaType) || "long".equals(javaType)){
			return java.sql.Types.NUMERIC;
		}else if("class java.util.Date".equals(javaType)){
			return java.sql.Types.DATE;
		}else{
			return java.sql.Types.VARCHAR;
		}
	}

	/**
	 *   SQL    where   where      
	 * @param obj where       
	 * @return         where  
	 * @throws Exception 
	 * @throws  
	 */
	public static Map generateWhereStr(Object obj) throws  Exception{
		StringBuffer whereStrBuf = new StringBuffer(); // where  
		List whereParamValues = new ArrayList(); // where       
		whereStrBuf.append("  where 1 = 1 ");
		if(obj != null){
			Field[] fields = obj.getClass().getDeclaredFields();
			for(int i = 0; i < fields.length; i++){
				fields[i].setAccessible(true);
				Object columnName = fields[i].get(obj);
				if(columnName != null && !"".equals(columnName)){
					whereStrBuf.append(" and ");
					whereStrBuf.append(fields[i].getName());
					whereStrBuf.append("=?");
					whereParamValues.add(columnName);
				}
			}			
		}
		Map whereMap = new HashMap();
		
/*		System.out.println(whereStrBuf.toString());
		System.out.println(whereParamValues);
		*/
		whereMap.put("whereStr", whereStrBuf.toString());
		whereMap.put("whereParamValues", whereParamValues.toArray());
		return whereMap;
	}

}

 (6)拡張JAVAオブジェクトの反射ツールクラス
package com.jkitn.jkits.util;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

/**
 *   :  JAVA       
 * @author xdweleven
 * @version 1.0 
 */
public class ReflectionUtil {

	/**
	 *                
	 * @param obj       
	 * @param fieldName       
	 * @param value    
	 */
	public static void setFieldValue(Object obj, String fieldName, Object value) {
		Class extends Object> c = obj.getClass();
		try {
			Field field = null;
			Field[] fields = c.getDeclaredFields();
			for(int i = 0; i < fields.length; i++){
				String fieldNameTemp = fields[i].getName();
				if(fieldNameTemp.equalsIgnoreCase(fieldName)){
					field = c.getDeclaredField(fieldNameTemp);
					field.setAccessible(true);
					field.set(obj, value);
					return;
				}
			}	
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}
	
	/**
	 *                
	 * @param obj       
	 * @param fieldName       
	 */
	public static Object getFieldValue(Object obj, String fieldName) {
		Class extends Object> c = obj.getClass();
		Field[] fields = c.getDeclaredFields();
		try {
			for(int i = 0; i < fields.length; i++){
				if(fields[i].getName().equalsIgnoreCase(fieldName)){
					fields[i].setAccessible(true);
					return fields[i].get(obj);
				}
			}
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
		return null;
	}

	/**
	 *                 
	 * @param obj       
	 * @return                   
	 */
	public static List getNotNullField(Object obj) {
		Class extends Object> c = obj.getClass();
		List list = new ArrayList();
		try {
			Field[] fields = c.getDeclaredFields();
			for(int i = 0; i < fields.length; i++){
				fields[i].setAccessible(true);
				if(fields[i].get(obj) != null){
					list.add(fields[i]);
				}
			}
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
		return list;
	}	 
}

 (7)実装データベースを定義するCRUD基本操作BaseDao
package com.jkitn.jkits.dao.common;

import java.io.Serializable;
import java.sql.ResultSet;
import java.util.List;
import java.util.Map;

import com.jkitn.jkits.common.DBConn;
import com.jkitn.jkits.common.PageBean;
import com.jkitn.jkits.util.ReflectionUtil;
import com.jkitn.jkits.util.SQLUtil;

/**
 *   :        CRUD       。
 * @author xdweleven
 * @version 1.0 
 */
public class BaseDao{
	//          
    private DBConn dbconn = new DBConn();
	/**          */
	public static final String TB_PREFIX = "tb_jkit_";
	/**            */
	public static final String SELECT_TB_PREFIX = "select * from tb_jkit_";
	/**       */
	public static final String ASC = "asc";
	/**      */
	public static final String DESC = "desc";

	/**
	 *   ID     
	 * @param classType     
	 * @param columnName       
	 * @param id     
	 * @return       
	 */
	public  T queryById(Class classType, String columnName, Serializable id) 
			throws Exception{
		StringBuffer sqlBuffer = new StringBuffer();
		sqlBuffer.append(SELECT_TB_PREFIX);
		sqlBuffer.append(this.toLowerCaseFirstOne(classType.getSimpleName()));
		sqlBuffer.append(" where ");
		sqlBuffer.append(columnName);
		sqlBuffer.append(" = ? ");
		this.showSQL(sqlBuffer.toString());
		return dbconn.execQuery(sqlBuffer.toString(), new RowMapper(classType),
					new Object[]{id}).get(0);
	}
	
	/**
	 *       class       
	 * @param classType     
	 * @return         
	 */
	public  List queryAll(Class classType) throws Exception{
		String sql = SELECT_TB_PREFIX + this.toLowerCaseFirstOne(classType.getSimpleName());
		this.showSQL(sql);
		return dbconn.execQuery(sql, new RowMapper(classType));
	}
	
	 /**
     *              ,                   
     * @param classType     
     * @param orderColumn     
     * @param ascOrDesc      :asc    ,desc    
     * @return         
     */
	public  List queryAllWithOrder(Class classType, String orderColumn, 
			String ascOrDesc) throws Exception{
		StringBuffer sqlBuffer = new StringBuffer();
		sqlBuffer.append(SELECT_TB_PREFIX);
		sqlBuffer.append(this.toLowerCaseFirstOne(classType.getSimpleName()));
		sqlBuffer.append(" order by ");
		sqlBuffer.append(orderColumn);
		sqlBuffer.append(" ");
		sqlBuffer.append(ascOrDesc);
		this.showSQL(sqlBuffer.toString());
		return dbconn.execQuery(sqlBuffer.toString(), new RowMapper(classType));
	}
	
	/**
     *     SQL         
     * @param sql     
     * @param classType     
     * @param params SQL    
     * @return         
     */
	public  List query(String sql, Class classType, Object... params) 
			  throws Exception{
		this.showSQL(sql);
		return dbconn.execQuery(sql, new RowMapper(classType), params);
	}
	
	/**
     *     SQL         
     * @param sql     
     * @param classType     
     * @param params SQL    
     * @return         
     */
	public  T queryForObj(String sql, Class classType, Object... params) 
			throws Exception{
		this.showSQL(sql);
		return dbconn.execQuery(sql, new RowMapper(classType), params).get(0);
	}
	
    /**
     *             
     * @param sql    SQL  
     * @param classType     
     * @param curPage     
     * @param rowsPerPage         
     * @param params SQL    
     * @return            
     */
	public  PageBean queryByPage(String sql, Class classType, int curPage, 
			int rowsPerPage, Object... params) throws Exception{
		 //       
		 int totalRows = this.getTotalRows(sql, params);
		 PageBean pageBean = new PageBean();
		 pageBean.setCurPage(curPage); //       
		 pageBean.initPageBean(totalRows, rowsPerPage); //             
		 //           (MySql)
		 String pageSql = pageBean.getPageMySQL(sql, curPage, rowsPerPage);
		 this.showSQL(pageSql);
		 //       
		 pageBean.setPageList(dbconn.execQuery(sql, new RowMapper(classType), params));
		 return pageBean;
	}
	
	 /**
     *          ,              ,               ,  ,
	 *                       :class  _       _SEQ,
	 *      class Users,         id,                USERS_ID_SEQ.
     * @param obj     
     * @param sequenceKeyColumn             ,    ,   null。
     * @return          
	 * @throws IllegalAccessException 
	 * @throws IllegalArgumentException 
     */
	public  int insert(T obj, String sequenceKeyColumn) throws Exception{
		String tableName = TB_PREFIX + this.toLowerCaseFirstOne(obj.getClass().getSimpleName());
		//               SQL               
		Map sqlMap = SQLUtil.generateInsertWithNull(obj, tableName, sequenceKeyColumn);
		String sql = sqlMap.get("sql").toString(); // SQL  
		Object[] paramsValues = (Object[])sqlMap.get("paramsValues"); // SQL      
		// int[] paramsTypes = this.parseArrayToInt((Object[])sqlMap.get("paramsTypes")); //      
		this.showSQL(sql);
		return dbconn.execUpdate(sql, paramsValues);
	}
	
    /**
     *     
     * @param obj         
     * @param keyColumn              
     * @return          
     */
	public  int update(T obj, String keyColumn) throws Exception{
		String tableName = TB_PREFIX + this.toLowerCaseFirstOne(obj.getClass().getSimpleName());
		//             SQL       
		Object[] updateSql = SQLUtil.generateUpdate(obj, tableName, keyColumn);
		this.showSQL(updateSql[0].toString());
		return dbconn.execUpdate(updateSql[0].toString(), (Object[])updateSql[1]);
	}
	
	/**
     *     
     * @param obj         
     * @param keyColumn          
     * @return          
     */
	public  int delete(T obj, String keyColumn) throws Exception{
		//         
		Object keyValue = ReflectionUtil.getFieldValue(obj, keyColumn);
		if(keyValue == null){
			throw new RuntimeException("["+obj.getClass()+"]      '"+keyColumn+"'      .");
		}
		StringBuffer sqlBuffer = new StringBuffer();
		sqlBuffer.append("delete from ");
		sqlBuffer.append(TB_PREFIX);
		sqlBuffer.append(this.toLowerCaseFirstOne(obj.getClass().getSimpleName()));
		sqlBuffer.append(" where ");
		sqlBuffer.append(keyColumn);
		sqlBuffer.append(" = ? ");
		this.showSQL(sqlBuffer.toString());
		return dbconn.execUpdate(sqlBuffer.toString(), keyValue.toString());
	}
	
	/**
     *            
     * @param classType     
     * @param keyColumn ID         
     * @param id       
     * @return         
     */
	public  int deleteById(Class classType, String keyColumn, Serializable id) 
			throws Exception{
		StringBuffer sqlBuffer = new StringBuffer();
		sqlBuffer.append("delete from ");
		sqlBuffer.append(TB_PREFIX);
		sqlBuffer.append(this.toLowerCaseFirstOne(classType.getSimpleName()));
		sqlBuffer.append(" where ");
		sqlBuffer.append(keyColumn);
		sqlBuffer.append(" = ? ");
		this.showSQL(sqlBuffer.toString());
		return dbconn.execUpdate(sqlBuffer.toString(), id);
	}
	
	 /**
     *              
     * @param classType     
     * @param idColumnName        
     * @param ids           
     */
	public  int deleteByIds(Class classType, String idColumnName,
			Serializable[] ids) throws Exception{
		StringBuffer sqlBuffer = new StringBuffer();
		sqlBuffer.append("delete from ");
		sqlBuffer.append(TB_PREFIX);
		sqlBuffer.append(this.toLowerCaseFirstOne(classType.getSimpleName()));
		sqlBuffer.append(" where ");
		sqlBuffer.append(idColumnName);
		sqlBuffer.append(" = ? ");
		this.showSQL(sqlBuffer.toString());
		int rowNums = 0; //       
		for(int i = 0; i < ids.length; i++){
			rowNums += this.deleteById(classType, idColumnName, ids[i]);
		}
		return rowNums;
	}
	
    /**
     *     
     * @param sql      SQL  
     * @param params SQL       
     * @return         
     */
	public int update(String sql, Object... params) throws Exception{
		this.showSQL(sql);
		return dbconn.execUpdate(sql, params);
	}
	
	/**
     *       
     * @param objs           
     * @param keyColumn       
     */
	public  int batchUpdate(List objs, String keyColumn) throws Exception{
		if(objs == null || objs.isEmpty()){
			return 0;
		}
		int updateNum = 0;
		//             SQL       
		for(int i = 0; i < objs.size(); i++){
			T obj = objs.get(i);
			updateNum += this.update(obj, keyColumn);
		}
		return updateNum;
	}
	
	 /**
     *       
     * @param objs           
     * @param keyColumn         
	 * @throws IllegalAccessException 
	 * @throws IllegalArgumentException 
     */
	public  int batchInsert(List objs, String keyColumn) throws Exception {
		if(objs == null || objs.isEmpty()){
			return 0;
		}
		int updateNum = 0;
		//             SQL       
		for(int i = 0; i < objs.size(); i++){
			T obj = objs.get(i);
			updateNum += this.insert(obj, keyColumn);
		}
		return updateNum;
	}
	
	/**
	 *          SQL  
	 * @param sql     SQL  
	 * @param params SQL     
	 * @return       
	 * @throws Exception
	 */
	public int getTotalRows(String sql, Object... params) throws Exception{
		String totalRowsSql = "select count(*) totalRows from ( "+sql+" )";
		this.showSQL(totalRowsSql);
		ResultSet rs = dbconn.queryForResultSet(totalRowsSql, params);
		while(rs.next()){
			return rs.getInt("totalRows");
		}
		return 0;
	}
	
    /**
     *     
     * @param sql      SQL  
     * @param params SQL       
     * @return         
     */
	public int delete(String sql, Object... params) throws Exception{
		this.showSQL(sql);
		return dbconn.execUpdate(sql, params);
	}
	
    /**
     *              (MySql)
     * @param classType     
     * @param seqColName       
     * @return                 
     */
	public  int getNextAutoIncrementVal(Class classType, String seqColName) throws Exception{
		StringBuffer sqlBuf = new StringBuffer();
		sqlBuf.append("select max(");
		sqlBuf.append(seqColName);
		sqlBuf.append(")+1 nextId from ");
		sqlBuf.append(TB_PREFIX);
		sqlBuf.append(this.toLowerCaseFirstOne(classType.getSimpleName()));
		this.showSQL(sqlBuf.toString());
	    ResultSet rs = dbconn.queryForResultSet(sqlBuf.toString());
	    if(rs.next()){
	    	return rs.getInt("nextId");
	    }else{
	    	return 0;
	    }
	}	

	/**
	 *       
	 * @param str        
	 * @return             
	 */
	public String toLowerCaseFirstOne(String str){
	     if(Character.isLowerCase(str.charAt(0))){
	          return str;
	     }else{
	         return (new StringBuilder()).append(Character.toLowerCase(str.charAt(0))).
	        		 append(str.substring(1)).toString();
	     }
	}
	
	/**
	 *       
	 * @param str        
	 * @return            
	 */
	public String toUpperCaseFirstOne(String str){
	     if(Character.isUpperCase(str.charAt(0))){
	         return str;
	     }else{
	         return (new StringBuilder()).append(Character.toUpperCase(str.charAt(0))).
	        		 append(str.substring(1)).toString();
	     }
	}

    /**
     *   SQL  
     * @param sql
     */
    public void showSQL(String sql){
    	System.out.println(sql);
    }
    
}

        以上は、自身の理解に基づいてパッケージ化された一般的なDAOレイヤの操作であり、導入ラインの2つのプロジェクトに運用されており、BUGはまだ報告されていない.しかし、効率の面では、個人的には最適化が必要なところがたくさんあると思います.例えば、一括削除操作は、私のパソコンのテストの結果、JDBCが持参した一括操作を使用すると、上記の簡単なサイクルの操作速度よりも遅いと思いますが、この部分の効率はまだ大きな向上の余地があると思います.ITカードを持って教えてほしいと思っています.あまり感謝しません.