JAVA实现DAO层基本CRUD操作

    随着shh2框架各种操作的便利性,越来越多的Java WEB开发人员选择通过加入这些框架以提高开发效率,但是,如果在不了解这些框架使用的场合的情况下,一拿到项目就盲目地选择这些框架进行系统架构的搭建,就有可能造成很多没必要的资源浪费。

      在项目开发中,对数据库的CRUD操作我们一般都是无法避免的操作,虽然hibernate封装的很完美,但是,由于本人对这个框架的底层原理不是很了解,每次使用的时候心里总觉得没底,代码一旦出现异常,很多时候都没法快速有效地解决,因此,为了让代码异常处理风险控制在自己的可控范围内,还是决定先将数据的CRUD持久化操作(DAO)用自己的方式通过JDBC进行一次封装,以便更好地管理自己的代码。关于Hibernate框架的使用,还是先弄懂它的一些底层实现原理后,再根据项目的需要酌情选择使用。 

      下面具体讲讲通过我自己的方式对有关DAO层数据库基本CRUD操作的Java实现(此处已MySQL为例,其他数据库只需做部分修改即可)。

      备注:若要试用本示例,只需按照给出的顺序依次复制代码建立相应的类即可。另外,在项目lib目录下加入mysql链接jar包。

  (1)定义数据源常量类

[java]  view plain  copy
 print ?
  1. package com.jkitn.jkits.common;  
  2.   
  3. /** 
  4.  * 定义数据源常量类 
  5.  * @author xdweleven 
  6.  * @version 1.0 
  7.  */  
  8. public class JdbcConfig {  
  9.      /** 数据库驱动 */  
  10.      public static final String DRIVERCLASSNAME = "com.mysql.jdbc.Driver";  
  11.      /** 数据库URL */  
  12.      public static final String URL = "jdbc:mysql://localhost:3306/app_jkit";  
  13.      /** 数据库用户名 */  
  14.      public static final String USERNAME = "root";  
  15.      /** 数据库密码 */  
  16.      public static final String PASSWORD = "root";  
  17. }  

(2)定义结果集(ResultSet)到pojo对象的映射

[java]  view plain  copy
 print ?
  1. package com.jkitn.jkits.dao.common;  
  2.   
  3. import java.lang.reflect.Field;  
  4. import java.sql.ResultSet;  
  5. import java.sql.ResultSetMetaData;  
  6. import java.sql.SQLException;  
  7. import java.util.ArrayList;  
  8. import java.util.List;  
  9.   
  10. /** 
  11.  * 说明:实现结果集到pojo对象的映射 
  12.  * @author xdweleven 
  13.  * @version 1.0  
  14.  */  
  15. public class RowMapper{  
  16.     private Class objectClass;  
  17.       
  18.     public RowMapper(Class objectClass) {  
  19.         this.objectClass = objectClass;  
  20.     }  
  21.       
  22.     /** 
  23.      * 实现单条记录到对象的映射 
  24.      * @param rs 结果集 
  25.      * @param rowNum 当前行数 
  26.      * @return 
  27.      * @throws SQLException 
  28.      */  
  29.     public T mapRow(ResultSet rs, int rowNum) throws SQLException {  
  30.         try {  
  31.             T object = objectClass.newInstance();   
  32.             // 得到结果集的字段集合  
  33.             ResultSetMetaData metaData = rs.getMetaData();  
  34.             int columnNum = metaData.getColumnCount();  
  35.             Field[] fields = object.getClass().getDeclaredFields();  
  36.             // 设置对象属性的值,若不存在,则设置为null.  
  37.             for (int i = 0; i < fields.length; i++) {  
  38.                 Field field = fields[i];  
  39.                 int flag = 0;  
  40.                 for (int j = 1; j <= columnNum; j++) {  
  41.                     if (metaData.getColumnName(j).toLowerCase().equals(field.getName().toLowerCase())) {  
  42.                         flag = 1;  
  43.                         break;  
  44.                     }  
  45.                 }  
  46.                 field.setAccessible(true);  
  47.                 if (flag == 1) {  
  48.                     this.typeMapper(field, object, rs);  
  49.                 }else {  
  50.                     field.set(object, null);  
  51.                 }     
  52.                 field.setAccessible(false);  
  53.             }  
  54.             return object;  
  55.         } catch (InstantiationException e) {  
  56.             e.printStackTrace();  
  57.         } catch (IllegalAccessException e) {  
  58.             e.printStackTrace();  
  59.         }  
  60.         return null;  
  61.     }  
  62.   
  63.     /** 
  64.      * 实现多条记录到结果集的映射 
  65.      * @param rs 
  66.      * @return 
  67.      */  
  68.     public List mapRows(ResultSet rs){  
  69.         int rowNum = 0;  
  70.         List objList = new ArrayList();  
  71.         try {  
  72.             while(rs.next()){  
  73.                 objList.add(this.mapRow(rs, rowNum++));  
  74.             }  
  75.             rs.close();  
  76.         } catch (SQLException e) {  
  77.             e.printStackTrace();  
  78.         }  
  79.         return objList;  
  80.     }  
  81.       
  82.       
  83.     /** 
  84.      * 类型的映射 
  85.      * @param field 
  86.      * @param obj 
  87.      * @param rs 
  88.      * @throws IllegalArgumentException 
  89.      * @throws IllegalAccessException 
  90.      * @throws SQLException 
  91.      */  
  92.     private void typeMapper(Field field, Object obj, ResultSet rs) {  
  93.         String typeName = field.getType().getName(); // 得到字段类型  
  94.         try {  
  95.             if (typeName.equals("java.lang.String")) {  
  96.                 field.set(obj, rs.getString(field.getName()));  
  97.             } else if (typeName.equals("int")  
  98.                     || typeName.equals("java.lang.Integer")) {  
  99.                 field.set(obj, rs.getInt(field.getName()));  
  100.             } else if (typeName.equals("long")  
  101.                     || typeName.equals("java.lang.Long")) {  
  102.                 field.set(obj, rs.getLong(field.getName()));  
  103.             } else if (typeName.equals("float")  
  104.                     || typeName.equals("java.lang.Float")) {  
  105.                 field.set(obj, rs.getFloat(field.getName()));  
  106.             } else if (typeName.equals("double")  
  107.                     || typeName.equals("java.lang.Double")) {  
  108.                 field.set(obj, rs.getDouble(field.getName()));  
  109.             } else if (typeName.equals("boolean")  
  110.                     || typeName.equals("java.lang.Boolean")) {  
  111.                 field.set(obj, rs.getBoolean(field.getName()));  
  112.             } else if (typeName.equals("java.util.Date")) {  
  113.                 field.set(obj, rs.getTimestamp(field.getName()));  
  114.             } else {  
  115.             }  
  116.         } catch (IllegalArgumentException e) {            
  117.             e.printStackTrace();  
  118.         } catch (IllegalAccessException e) {              
  119.             e.printStackTrace();  
  120.         } catch (SQLException e) {            
  121.             e.printStackTrace();  
  122.         }  
  123.     }  
  124. }  
  (3)定义数据库连接辅助类DBConn

[java]  view plain  copy
 print ?
  1. package com.jkitn.jkits.common;  
  2.   
  3. import java.sql.Connection;  
  4. import java.sql.DriverManager;  
  5. import java.sql.PreparedStatement;  
  6. import java.sql.ResultSet;  
  7. import java.sql.SQLException;  
  8. import java.util.List;  
  9.   
  10. import com.jkitn.jkits.dao.common.RowMapper;  
  11.   
  12. /** 
  13.  * 定义数据库连接辅助类DBConn 
  14.  * @author xdweleven 
  15.  * @version 1.0  
  16.  */  
  17. public class DBConn {  
  18.     private Connection conn = null;  
  19.     private PreparedStatement pstmt = null;  
  20.     private ResultSet rs = null;   
  21.       
  22.     /** 
  23.      * 创建数据库的连接 
  24.      * @return 返回数据库连接对象 
  25.      */  
  26.     public Connection getConn(){          
  27.         try {                       
  28.             // 加载数据库驱动  
  29.             Class.forName(JdbcConfig.DRIVERCLASSNAME);  
  30.             // 创建Connection接口对象,用于获取MySQL数据库的连接对象  
  31.             conn = DriverManager.getConnection(JdbcConfig.URL, JdbcConfig.USERNAME, JdbcConfig.PASSWORD);  
  32.         } catch (ClassNotFoundException e) {  
  33.             e.printStackTrace();  
  34.         } catch (SQLException e) {  
  35.             e.printStackTrace();  
  36.         }      
  37.         return conn;  
  38.     }  
  39.   
  40.     /** 
  41.      * 更新数据库操作(包括增删改操作) 
  42.      * @param sql  待执行sql语句 
  43.      * @param objs 用于设置预编译语句中带入的参数 
  44.      * @return null 
  45.      * @throws Exception  
  46.      */  
  47.     public int execUpdate(String sql, Object ...objs) throws Exception{  
  48.             // 获取预编译环境  
  49.             pstmt = this.getConn().prepareStatement(sql);  
  50.             if(objs != null && objs.length > 0){  
  51.                 for(int i = 0; i < objs.length; i++){  
  52.                     pstmt.setObject(i+1, objs[i]);  
  53.                 }  
  54.             }  
  55.             // 执行更新语句  
  56.             int result = pstmt.executeUpdate();  
  57.             // 断开连接,释放资源  
  58.             this.close(rs, pstmt, conn);  
  59.             return result;  
  60.     }  
  61.   
  62.     /** 
  63.      * 数据库查询操作 
  64.      * @param sql 待执行sql语句 
  65.      * @param objs 用于设置预编译语句中带入的参数 
  66.      * @return 类T的List数据类型,即返回查询到的所有数据信息 
  67.      * @throws Exception  
  68.      */  
  69.     public  List execQuery(String sql, RowMapper mapper, Object ...objs) throws Exception{  
  70.         // 获取预编译环境  
  71.         pstmt = this.getConn().prepareStatement(sql);  
  72.         if(objs != null && objs.length > 0){  
  73.             for(int i = 0; i < objs.length; i++){  
  74.                 pstmt.setObject(i+1, objs[i]);  
  75.             }  
  76.         }  
  77.         // 执行更新语句  
  78.         rs = pstmt.executeQuery();  
  79.         // 执行关系到对象的映射  
  80.         List result = mapper.mapRows(rs);  
  81.         // 断开连接,释放资源  
  82.         this.close(rs, pstmt, conn);  
  83.         return result;  
  84.     }     
  85.       
  86.     /** 
  87.      * 执行执行的SQL语句并返回结果集 
  88.      * @param sql SQL语句 
  89.      * @param params 参数 
  90.      * @return 返回结果集 
  91.      */  
  92.     public ResultSet queryForResultSet(String sql, Object... objs) throws Exception{  
  93.         // 获取预编译环境  
  94.         pstmt = conn.prepareStatement(sql);  
  95.         if(objs != null && objs.length > 0){  
  96.             for(int i = 0; i < objs.length; i++){  
  97.                 pstmt.setObject(i+1, objs[i]);  
  98.             }  
  99.         }  
  100.         // 执行更新语句  
  101.         rs = pstmt.executeQuery();  
  102.         // 断开连接,释放资源  
  103.         this.close(null, pstmt, conn);  
  104.         return rs;  
  105.     }  
  106.       
  107.     /** 
  108.      * 关闭数据库连接,释放所占的系统资源 
  109.      * @param rs结果集、ppst预编译命令、conn数据库 
  110.      * @return null 
  111.      * @throws Exception  
  112.      */  
  113.     public void close(ResultSet rs, PreparedStatement ppst, Connection conn) throws Exception{  
  114.         if(rs != null){  
  115.             rs.close();  
  116.         }  
  117.         if(ppst != null){   
  118.             ppst.close();  
  119.         }  
  120.         if(conn != null){  
  121.             conn.close();  
  122.         }  
  123.     }  
  124. }  

 (4)定义通用分页查询实体类

[java]  view plain  copy
 print ?
  1. package com.jkitn.jkits.common;  
  2.   
  3. import java.util.List;  
  4.   
  5. /** 
  6.  * 说明:实现通用分页查询实体类 
  7.  * @author xdweleven 
  8.  * @version 1.0 
  9.  */  
  10. public class PageBean {  
  11.     private int totalRows; // 总记录数  
  12.     private int totalPages; // 总页数  
  13.     private int curPage; // 当前页码  
  14.     private int prePage; // 上一页页码  
  15.     private int nextPage; // 下一页页码  
  16.     private int rowsPerPage; // 每页显示的记录数   
  17.     private List pageList; // 当前页的数据集  
  18.       
  19.     /** 
  20.      * 初始化分页bean对象 
  21.      * @param totalRows 总记录数 
  22.      * @param rowsPerPage 每页显示的记录数 
  23.      */  
  24.     public void initPageBean(int totalRows, int rowsPerPage){  
  25.         this.rowsPerPage = rowsPerPage;  
  26.         this.totalRows = totalRows;  
  27.         this.totalPages = (this.totalRows-1)/this.rowsPerPage + 1;  
  28.         // 设置上一页  
  29.         if(this.curPage == 1){  
  30.             this.setPrePage(1);  
  31.         }else{  
  32.             this.setPrePage(this.curPage-1);  
  33.         }  
  34.         // 设置下一页  
  35.         if(this.curPage == this.totalPages){  
  36.             this.setNextPage(this.totalPages);  
  37.         }else{  
  38.             this.setNextPage(this.curPage + 1);  
  39.         }  
  40.     }  
  41.       
  42.     /** 
  43.      * 生成SQLServer的分页查询语句 
  44.      * @param sql 原始sql语句 
  45.      * @param curPage 第几页 
  46.      * @param rowsPerPage 每页多少行  
  47.      */  
  48.     public String getPageSQLServer(String sql, int curPage, int rowsPerPage){  
  49.         String afterFrom = sql.toLowerCase().substring(sql.indexOf("from"));  
  50.         String pageSql = null;  
  51.         if(afterFrom.indexOf("where") == -1){  
  52.              pageSql = "select top "+ rowsPerPage + " * "+afterFrom  
  53.             +" where id not in(select top "+rowsPerPage*(curPage-1)+" id "  
  54.             +afterFrom+" order by id desc)"+"order by id desc";  
  55.         }else{  
  56.             pageSql = "select top "+ rowsPerPage + " * "+afterFrom  
  57.             +" and id not in(select top "+rowsPerPage*(curPage-1)+" id "  
  58.             +afterFrom+" order by id desc)"+"order by id desc";  
  59.         }  
  60.         return pageSql;  
  61.     }  
  62.       
  63.     /** 
  64.      * 生成MySql分页sql语句 
  65.      * @param sql 原始sql语句 
  66.      * @param curPage 第几页 
  67.      * @param rowsPerPage 每页多少行  
  68.      * @return 返回分页SQL语句 
  69.      */  
  70.     public String getPageMySQL(String sql, int curPage, int rowsPerPage){  
  71.         String pageSql = sql+" limit "+ (curPage-1)*rowsPerPage+","+rowsPerPage;  
  72.         return pageSql;  
  73.     }  
  74.       
  75.     /** 
  76.      * 生成Oracle分页查询语句 
  77.      * @param sql 原始sql语句 
  78.      * @return 返回分页SQL语句 
  79.      */  
  80.     public String getOrclPageSql(String sql){  
  81.         int begin = (curPage - 1) * rowsPerPage;  
  82.         int end = begin + rowsPerPage;  
  83.         StringBuffer pagingSelect = new StringBuffer(300);  
  84.         pagingSelect.append("select * from ( select row_.*, rownum rownum_ from ( ");  
  85.         pagingSelect.append(sql);  
  86.         pagingSelect.append(" ) row_ where rownum <= "+end+") where rownum_ > "+begin);  
  87.         return pagingSelect.toString();  
  88.     }  
  89.       
  90.     public List getPageList() {  
  91.         return pageList;  
  92.     }  
  93.   
  94.     public void setPageList(List pageList) {  
  95.         this.pageList = pageList;  
  96.     }  
  97.     public int getTotalRows() {  
  98.         return totalRows;  
  99.     }  
  100.   
  101.     public void setTotalRows(int totalRows) {  
  102.         this.totalRows = totalRows;  
  103.     }  
  104.   
  105.     public int getTotalPages() {  
  106.         return totalPages;  
  107.     }  
  108.   
  109.     public void setTotalPages(int totalPages) {  
  110.         this.totalPages = totalPages;  
  111.     }  
  112.   
  113.     public int getCurPage() {  
  114.         return curPage;  
  115.     }  
  116.   
  117.     public void setCurPage(int curPage) {  
  118.         this.curPage = curPage;  
  119.     }  
  120.   
  121.     public int getPrePage() {  
  122.         return prePage;  
  123.     }  
  124.   
  125.     public void setPrePage(int prePage) {  
  126.         this.prePage = prePage;  
  127.     }  
  128.   
  129.     public int getNextPage() {  
  130.         return nextPage;  
  131.     }  
  132.   
  133.     public void setNextPage(int nextPage) {  
  134.         this.nextPage = nextPage;  
  135.     }  
  136.   
  137.     public int getRowsPerPage() {  
  138.         return rowsPerPage;  
  139.     }  
  140.   
  141.     public void setRowsPerPage(int rowsPerPage) {  
  142.         this.rowsPerPage = rowsPerPage;  
  143.     }  
  144. }  

 (5)定义SQL语句的常用方法工具类

[java]  view plain  copy
 print ?
  1. package com.jkitn.jkits.util;  
  2.   
  3. import java.lang.reflect.Field;  
  4. import java.util.ArrayList;  
  5. import java.util.Date;  
  6. import java.util.HashMap;  
  7. import java.util.List;  
  8. import java.util.Map;  
  9.   
  10. /** 
  11.  * 说明:自动生成对象的增删改查SQL语句的通用方法工具类 
  12.  * @author xdweleven 
  13.  * @version 1.0  
  14.  */  
  15. public class SQLUtil {    
  16.     /** 
  17.      * 自动生成插入指定对象的SQL语句,不包括对象属性的值为空的字段 
  18.      * @param obj 待生成插入SQL语句的对象 
  19.      * @param tableName 待插入语句对应的数据库表的名称 
  20.      * @return 返回一个包含SQL语句、SQL语句参数值及参数值类型的Map对象 
  21.      */  
  22.     public static Map generateInsertExceptNull(Object obj, String tableName) {  
  23.         StringBuffer columnStrBuf = new StringBuffer(); // 记录数据表的字段名称  
  24.         StringBuffer paramStrBuf = new StringBuffer(); // 记录SQL语句对应插入的占位符  
  25.         List paramValues = new ArrayList(); // 记录对象参数值  
  26.         List paramsType = new ArrayList(); // 记录参数值类型  
  27.         // 查询待插入对象的属性值不为空的属性名称  
  28.         List fieldList = ReflectionUtil.getNotNullField(obj);  
  29.         try {  
  30.             for (int i = 0; i < fieldList.size(); i++) {  
  31.                 Field field = (Field) fieldList.get(i);  
  32.                 field.setAccessible(true);  
  33.                 // 记录对象属性名称  
  34.                 columnStrBuf.append(field.getName());  
  35.                 if (i != fieldList.size() - 1) {  
  36.                     columnStrBuf.append(",");  
  37.                 }  
  38.                   
  39.                 // 记录插入SQL语句的参数占位符  
  40.                 if("class java.util.Date".equals(field.getType().toString())  
  41.                         && field.get(obj) != null){  
  42.                     String timeStr = DateUtil.formatDate((Date)field.get(obj), "yyyy-MM-dd HH:mm:ss");  
  43.                     paramStrBuf.append("to_date(?, 'yyyy-MM-dd HH24:mi:ss')");  
  44.                     paramValues.add(timeStr);  
  45.                     // 记录对象属性的数据类型  
  46.                     paramsType.add(getOrclDataType(field.getType().toString()));  
  47.                 }else{  
  48.                     paramStrBuf.append("?");  
  49.                     paramValues.add(field.get(obj));  
  50.                     // 记录对象属性的数据类型  
  51.                     paramsType.add(getOrclDataType(field.getType().toString()));  
  52.                 }  
  53.                   
  54.                 if (i != fieldList.size() - 1) {  
  55.                     paramStrBuf.append(",");  
  56.                 }  
  57.             }  
  58.         } catch (Exception e) {  
  59.             throw new RuntimeException(e);  
  60.         }  
  61.         // 生成插入操作的SQL语句  
  62.         StringBuffer sb = new StringBuffer();  
  63.         sb.append("insert into ");  
  64.         sb.append(tableName);  
  65.         sb.append(" (");  
  66.         sb.append(columnStrBuf);  
  67.         sb.append(") ");  
  68.         sb.append("values");  
  69.         sb.append(" (");  
  70.         sb.append(paramStrBuf);  
  71.         sb.append(")");  
  72.         // 将生成的SQL语句、SQL语句参数值及各参数值的数据类型用map保存并返回  
  73.         Map sqlMap = new HashMap();  
  74.         sqlMap.put("sql", sb.toString());  
  75.         sqlMap.put("paramsValues", paramValues.toArray());  
  76.         sqlMap.put("paramsTypes", paramsType.toArray());  
  77.         return sqlMap;  
  78.     }  
  79.   
  80.     /** 
  81.      * 自动生成插入指定对象的SQL语句,包括对象属性的值为空的字段,不包括自增长主键,若不存在,调用时直接置为null. 
  82.      * @param obj 待生成插入SQL语句的对象 
  83.      * @param tableName 待插入语句对应的数据库表的名称 
  84.      * @param keyColumn 数据表主键名称 
  85.      * @return 返回一个包含SQL语句、SQL语句参数值及参数值类型的Map对象 
  86.      * @throws IllegalAccessException  
  87.      * @throws IllegalArgumentException  
  88.      */  
  89.     public static Map generateInsertWithNull(Object obj,   
  90.             String tableName, String keyColumn) throws IllegalArgumentException, IllegalAccessException {  
  91.         StringBuffer columnStrBuf = new StringBuffer();   
  92.         StringBuffer paramStrBuf = new StringBuffer(); // 记录SQL语句对应插入的占位符  
  93.         List columnNameList = new ArrayList(); // 记录数据表的字段名称  
  94.         List paramValues = new ArrayList(); // 记录对象参数值  
  95.         List paramsType = new ArrayList(); // 记录参数值类型  
  96.         Field[] fields = obj.getClass().getDeclaredFields();  
  97.         for(int i = 0; i < fields.length; i++){  
  98.             fields[i].setAccessible(true);  
  99.             // 记录对象属性名称  
  100.             if(!fields[i].getName().equalsIgnoreCase(keyColumn)){ // 非主键列记录插入SQL语句的参数占位符  
  101.                 columnStrBuf.append(fields[i].getName());  
  102.                 columnNameList.add(fields[i].getName());  
  103.                 if (i != fields.length - 1) {  
  104.                     columnStrBuf.append(",");  
  105.                 }  
  106.                 if("class java.util.Date".equals(fields[i].getType().toString())  
  107.                         && fields[i].get(obj) != null){  
  108.                     String timeStr = DateUtil.formatDate((Date)fields[i].get(obj), "yyyy-MM-dd HH:mm:ss");  
  109.                     paramStrBuf.append("to_date(?, 'yyyy-MM-dd HH24:mi:ss')");  
  110.                     paramValues.add(timeStr);  
  111.                     // 记录对象属性的数据类型  
  112.                     paramsType.add(getOrclDataType(fields[i].getType().toString()));  
  113.                 }else{  
  114.                     paramStrBuf.append("?");  
  115.                     paramValues.add(fields[i].get(obj));  
  116.                     // 记录对象属性的数据类型  
  117.                     paramsType.add(getOrclDataType(fields[i].getType().toString()));  
  118.                 }  
  119.                 if (i != fields.length - 1) {  
  120.                     paramStrBuf.append(",");  
  121.                 }  
  122.             }  
  123.         }  
  124.         // 生成插入操作的SQL语句  
  125.         StringBuffer sb = new StringBuffer();  
  126.         sb.append("insert into ");  
  127.         sb.append(tableName);  
  128.         sb.append(" (");  
  129.         sb.append(columnStrBuf);  
  130.         sb.append(") ");  
  131.         sb.append("values");  
  132.         sb.append(" (");  
  133.         sb.append(paramStrBuf);  
  134.         sb.append(")");  
  135.         // 将生成的SQL语句、SQL语句的列名称用map保存并返回  
  136.         Map sqlMap = new HashMap();  
  137.           
  138.     /*       
  139.         System.out.println(sb.toString()); 
  140.         System.out.println(columnNameList.toString()); 
  141.         System.out.println(paramValues.toString()); 
  142.         System.out.println(paramsType.toString()); 
  143.     */        
  144.         sqlMap.put("sql", sb.toString());  
  145.         sqlMap.put("columnNameList", columnNameList.toArray());  
  146.         sqlMap.put("paramsValues", paramValues.toArray());  
  147.         sqlMap.put("paramsTypes", paramsType.toArray());  
  148.         return sqlMap;  
  149.     }  
  150.       
  151.       
  152.     /** 
  153.      * 自动生成更新指定对象的SQL语句 
  154.      * @param obj 待生成更新SQL语句的对象 
  155.      * @param tableName 待更新语句对应的数据库表的名称 
  156.      * @param keyColumn 待更新记录的限定字段 
  157.      * @return 返回一个包含SQL语句及参数值的数组 
  158.      */  
  159.     public static Object[] generateUpdate(Object obj, String tableName, String keyColumn) {  
  160.         StringBuffer columnSB = new StringBuffer();  
  161.         List params = new ArrayList();  
  162.         Object keyValue = null;  
  163.         // 获取属性值不为空的数据表字段名称  
  164.         List fieldList = ReflectionUtil.getNotNullField(obj);  
  165.         try {  
  166.             for (int i = 0; i < fieldList.size(); i++) {  
  167.                 Field field = (Field) fieldList.get(i);  
  168.                 field.setAccessible(true);  
  169.   
  170.                 if (field.getName().equalsIgnoreCase(keyColumn)) {  
  171.                     keyValue = field.get(obj);  
  172.                 } else {  
  173.                     columnSB.append(field.getName());     
  174.                     if("class java.util.Date".equals(field.getType().toString())  
  175.                             && field.get(obj) != null){  
  176.                         String timeStr = DateUtil.formatDate((Date)field.get(obj), "yyyy-MM-dd HH:mm:ss");  
  177.                         columnSB.append("=to_date(?, 'yyyy-MM-dd HH24:mi:ss')");  
  178.                         params.add(timeStr);  
  179.                     }else{  
  180.                         columnSB.append("=?");  
  181.                         params.add(field.get(obj));  
  182.                     }  
  183.                     if (i != fieldList.size() - 1) {  
  184.                         columnSB.append(",");  
  185.                     }  
  186.                 }  
  187.             }  
  188.         } catch (Exception e) {  
  189.             throw new RuntimeException(e);  
  190.         }  
  191.         if (keyValue == null) {  
  192.             throw new IllegalArgumentException("数据表 [" + tableName+ "] 中的字段'"+keyColumn+"'的值不能为空.");  
  193.         }else{  
  194.             params.add(keyValue);  
  195.         }  
  196.         StringBuffer sb = new StringBuffer();  
  197.         sb.append("update ");  
  198.         sb.append(tableName);  
  199.         sb.append(" set ");  
  200.         if(columnSB.length() >= 0){  
  201.             sb.append(columnSB);  
  202.         }else{  
  203.             sb.append(keyColumn);  
  204.             sb.append("=? ");  
  205.             params.add(keyValue);  
  206.         }         
  207.         sb.append(" where ");  
  208.         sb.append(keyColumn);  
  209.         sb.append("=? ");  
  210.         return new Object[] { sb.toString(), params.toArray() };  
  211.     }  
  212.       
  213.     /** 
  214.      * 返回java数据类型对应的Oracle数据库的数据类型值 
  215.      * @param javaType java数据类型 
  216.      * @return 返回Oracle数据表的字段数据类型 
  217.      */  
  218.     public static int getOrclDataType(String javaType){  
  219.         if("class java.lang.String".equals(javaType)){  
  220.             return java.sql.Types.VARCHAR;  
  221.         }else if("class java.lang.Integer".equals(javaType) || "int".equals(javaType)){  
  222.             return java.sql.Types.INTEGER;  
  223.         }else if("class java.lang.Double".equals(javaType) || "double".equals(javaType)){  
  224.             return java.sql.Types.DOUBLE;  
  225.         }else if("class java.lang.Float".equals(javaType) || "float".equals(javaType)){  
  226.             return java.sql.Types.FLOAT;  
  227.         }else if("char".equals(javaType)){  
  228.             return java.sql.Types.CHAR;  
  229.         }else if("class java.lang.Long".equals(javaType) || "long".equals(javaType)){  
  230.             return java.sql.Types.NUMERIC;  
  231.         }else if("class java.util.Date".equals(javaType)){  
  232.             return java.sql.Types.DATE;  
  233.         }else{  
  234.             return java.sql.Types.VARCHAR;  
  235.         }  
  236.     }  
  237.   
  238.     /** 
  239.      * 生成SQL语句中的where子句及where子句中参数值 
  240.      * @param obj where条件子句的对象 
  241.      * @return 返回条件不为空的where子句 
  242.      * @throws Exception  
  243.      * @throws   
  244.      */  
  245.     public static Map generateWhereStr(Object obj) throws  Exception{  
  246.         StringBuffer whereStrBuf = new StringBuffer(); // where子句  
  247.         List whereParamValues = new ArrayList(); // where子句中的参数值  
  248.         whereStrBuf.append("  where 1 = 1 ");  
  249.         if(obj != null){  
  250.             Field[] fields = obj.getClass().getDeclaredFields();  
  251.             for(int i = 0; i < fields.length; i++){  
  252.                 fields[i].setAccessible(true);  
  253.                 Object columnName = fields[i].get(obj);  
  254.                 if(columnName != null && !"".equals(columnName)){  
  255.                     whereStrBuf.append(" and ");  
  256.                     whereStrBuf.append(fields[i].getName());  
  257.                     whereStrBuf.append("=?");  
  258.                     whereParamValues.add(columnName);  
  259.                 }  
  260.             }             
  261.         }  
  262.         Map whereMap = new HashMap();  
  263.           
  264. /*      System.out.println(whereStrBuf.toString()); 
  265.         System.out.println(whereParamValues); 
  266.         */  
  267.         whereMap.put("whereStr", whereStrBuf.toString());  
  268.         whereMap.put("whereParamValues", whereParamValues.toArray());  
  269.         return whereMap;  
  270.     }  
  271.   
  272. }  
  273.  (6)扩展JAVA对象的反射工具类

    [java]  view plain  copy
     print ?
    1. package com.jkitn.jkits.util;  
    2.   
    3. import java.lang.reflect.Field;  
    4. import java.util.ArrayList;  
    5. import java.util.List;  
    6.   
    7. /** 
    8.  * 说明:扩展JAVA对象的反射机制 
    9.  * @author xdweleven 
    10.  * @version 1.0  
    11.  */  
    12. public class ReflectionUtil {  
    13.   
    14.     /** 
    15.      * 设置对象的指定属性名称的属性值 
    16.      * @param obj 待设置的对象 
    17.      * @param fieldName 对象属性名称 
    18.      * @param value 属性值 
    19.      */  
    20.     public static void setFieldValue(Object obj, String fieldName, Object value) {  
    21.         Classextends Object> c = obj.getClass();  
    22.         try {  
    23.             Field field = null;  
    24.             Field[] fields = c.getDeclaredFields();  
    25.             for(int i = 0; i < fields.length; i++){  
    26.                 String fieldNameTemp = fields[i].getName();  
    27.                 if(fieldNameTemp.equalsIgnoreCase(fieldName)){  
    28.                     field = c.getDeclaredField(fieldNameTemp);  
    29.                     field.setAccessible(true);  
    30.                     field.set(obj, value);  
    31.                     return;  
    32.                 }  
    33.             }     
    34.         } catch (Exception e) {  
    35.             throw new RuntimeException(e);  
    36.         }  
    37.     }  
    38.       
    39.     /** 
    40.      * 获取对象的指定属性名称的属性值 
    41.      * @param obj 待设置的对象 
    42.      * @param fieldName 对象属性名称 
    43.      */  
    44.     public static Object getFieldValue(Object obj, String fieldName) {  
    45.         Classextends Object> c = obj.getClass();  
    46.         Field[] fields = c.getDeclaredFields();  
    47.         try {  
    48.             for(int i = 0; i < fields.length; i++){  
    49.                 if(fields[i].getName().equalsIgnoreCase(fieldName)){  
    50.                     fields[i].setAccessible(true);  
    51.                     return fields[i].get(obj);  
    52.                 }  
    53.             }  
    54.         } catch (Exception e) {  
    55.             throw new RuntimeException(e);  
    56.         }  
    57.         return null;  
    58.     }  
    59.   
    60.     /** 
    61.      * 获取对象的属性值不为空的属性名称 
    62.      * @param obj 待获取的对象 
    63.      * @return 返回属性值不为空的对象的属性名称列表 
    64.      */  
    65.     public static List getNotNullField(Object obj) {  
    66.         Classextends Object> c = obj.getClass();  
    67.         List list = new ArrayList();  
    68.         try {  
    69.             Field[] fields = c.getDeclaredFields();  
    70.             for(int i = 0; i < fields.length; i++){  
    71.                 fields[i].setAccessible(true);  
    72.                 if(fields[i].get(obj) != null){  
    73.                     list.add(fields[i]);  
    74.                 }  
    75.             }  
    76.         } catch (Exception e) {  
    77.             throw new RuntimeException(e);  
    78.         }  
    79.         return list;  
    80.     }      
    81. }  
    82.  (7)定义实现数据库的CRUD基本操作BaseDao

      [java]  view plain  copy
       print ?
      1. package com.jkitn.jkits.dao.common;  
      2.   
      3. import java.io.Serializable;  
      4. import java.sql.ResultSet;  
      5. import java.util.List;  
      6. import java.util.Map;  
      7.   
      8. import com.jkitn.jkits.common.DBConn;  
      9. import com.jkitn.jkits.common.PageBean;  
      10. import com.jkitn.jkits.util.ReflectionUtil;  
      11. import com.jkitn.jkits.util.SQLUtil;  
      12.   
      13. /** 
      14.  * 说明:封装实现数据库的CRUD相关的底层操作。 
      15.  * @author xdweleven 
      16.  * @version 1.0  
      17.  */  
      18. public class BaseDao{  
      19.     // 获取数据库链接实例  
      20.     private DBConn dbconn = new DBConn();  
      21.     /** 数据库表的前缀  */  
      22.     public static final String TB_PREFIX = "tb_jkit_";  
      23.     /** 数据库表的查询前缀  */  
      24.     public static final String SELECT_TB_PREFIX = "select * from tb_jkit_";  
      25.     /** 升序排列  */  
      26.     public static final String ASC = "asc";  
      27.     /** 降序排列 */  
      28.     public static final String DESC = "desc";  
      29.   
      30.     /** 
      31.      * 根据ID查找对象  
      32.      * @param classType 对象类型 
      33.      * @param columnName 编号字段名称 
      34.      * @param id 对象编号 
      35.      * @return 返回实体对象 
      36.      */  
      37.     public  T queryById(Class classType, String columnName, Serializable id)   
      38.             throws Exception{  
      39.         StringBuffer sqlBuffer = new StringBuffer();  
      40.         sqlBuffer.append(SELECT_TB_PREFIX);  
      41.         sqlBuffer.append(this.toLowerCaseFirstOne(classType.getSimpleName()));  
      42.         sqlBuffer.append(" where ");  
      43.         sqlBuffer.append(columnName);  
      44.         sqlBuffer.append(" = ? ");  
      45.         this.showSQL(sqlBuffer.toString());  
      46.         return dbconn.execQuery(sqlBuffer.toString(), new RowMapper(classType),  
      47.                     new Object[]{id}).get(0);  
      48.     }  
      49.       
      50.     /** 
      51.      * 查询所有指定class类型的对象信息 
      52.      * @param classType 对象类型 
      53.      * @return 返回实体对象列表 
      54.      */  
      55.     public  List queryAll(Class classType) throws Exception{  
      56.         String sql = SELECT_TB_PREFIX + this.toLowerCaseFirstOne(classType.getSimpleName());  
      57.         this.showSQL(sql);  
      58.         return dbconn.execQuery(sql, new RowMapper(classType));  
      59.     }  
      60.       
      61.      /** 
      62.      * 查询指定对象类型的对象信息,并按照指定的排序字段进行升序或降序排序 
      63.      * @param classType 对象类型 
      64.      * @param orderColumn 排序字段 
      65.      * @param ascOrDesc 降序或升序:asc表示升序,desc表示降序 
      66.      * @return 返回实体对象列表 
      67.      */  
      68.     public  List queryAllWithOrder(Class classType, String orderColumn,   
      69.             String ascOrDesc) throws Exception{  
      70.         StringBuffer sqlBuffer = new StringBuffer();  
      71.         sqlBuffer.append(SELECT_TB_PREFIX);  
      72.         sqlBuffer.append(this.toLowerCaseFirstOne(classType.getSimpleName()));  
      73.         sqlBuffer.append(" order by ");  
      74.         sqlBuffer.append(orderColumn);  
      75.         sqlBuffer.append(" ");  
      76.         sqlBuffer.append(ascOrDesc);  
      77.         this.showSQL(sqlBuffer.toString());  
      78.         return dbconn.execQuery(sqlBuffer.toString(), new RowMapper(classType));  
      79.     }  
      80.       
      81.     /** 
      82.      * 查询指定SQL语句的对象信息列表 
      83.      * @param sql 查询语句 
      84.      * @param classType 对象类型 
      85.      * @param params SQL语句参数 
      86.      * @return 返回实体对象列表 
      87.      */  
      88.     public  List query(String sql, Class classType, Object... params)   
      89.               throws Exception{  
      90.         this.showSQL(sql);  
      91.         return dbconn.execQuery(sql, new RowMapper(classType), params);  
      92.     }  
      93.       
      94.     /** 
      95.      * 查询指定SQL语句的对象信息列表 
      96.      * @param sql 查询语句 
      97.      * @param classType 对象类型 
      98.      * @param params SQL语句参数 
      99.      * @return 返回实体对象列表 
      100.      */  
      101.     public  T queryForObj(String sql, Class classType, Object... params)   
      102.             throws Exception{  
      103.         this.showSQL(sql);  
      104.         return dbconn.execQuery(sql, new RowMapper(classType), params).get(0);  
      105.     }  
      106.       
      107.     /** 
      108.      * 分页查询实体对象列表信息 
      109.      * @param sql 原始的SQL语句 
      110.      * @param classType 对象类型 
      111.      * @param curPage 当前页码 
      112.      * @param rowsPerPage 每页显示的记录数 
      113.      * @param params SQL语句参数 
      114.      * @return 返回当前页码的分页对象 
      115.      */  
      116.     public  PageBean queryByPage(String sql, Class classType, int curPage,   
      117.             int rowsPerPage, Object... params) throws Exception{  
      118.          // 获取记录总数  
      119.          int totalRows = this.getTotalRows(sql, params);  
      120.          PageBean pageBean = new PageBean();  
      121.          pageBean.setCurPage(curPage); // 设置当前页码  
      122.          pageBean.initPageBean(totalRows, rowsPerPage); // 初始化分页对象的相关属性  
      123.          // 生成当前分页查询语句(MySql)  
      124.          String pageSql = pageBean.getPageMySQL(sql, curPage, rowsPerPage);  
      125.          this.showSQL(pageSql);  
      126.          // 执行查询操作  
      127.          pageBean.setPageList(dbconn.execQuery(sql, new RowMapper(classType), params));  
      128.          return pageBean;  
      129.     }  
      130.       
      131.      /** 
      132.      * 保存对象到数据库中,若数据库中的用户表有自增序列,则需要指出表中自增列的字段名称,另外, 
      133.      * 数据库中相应的自增序列的名称需按如下格式取名:class名称_自增列字段名称_SEQ, 
      134.      * 例如用户的class为Users,自增序列字段名称为id,则数据库中的自增序列的名称取名为USERS_ID_SEQ. 
      135.      * @param obj 实体对象 
      136.      * @param sequenceKeyColumn 数据表自增序列的字段名称,若不存在,则置为null。 
      137.      * @return 返回被更新的记录数 
      138.      * @throws IllegalAccessException  
      139.      * @throws IllegalArgumentException  
      140.      */  
      141.     public  int insert(T obj, String sequenceKeyColumn) throws Exception{  
      142.         String tableName = TB_PREFIX + this.toLowerCaseFirstOne(obj.getClass().getSimpleName());  
      143.         // 自动生成对象的无自增序列插入SQL语句及其相关插入的参数值和类型  
      144.         Map sqlMap = SQLUtil.generateInsertWithNull(obj, tableName, sequenceKeyColumn);  
      145.         String sql = sqlMap.get("sql").toString(); // SQL语句  
      146.         Object[] paramsValues = (Object[])sqlMap.get("paramsValues"); // SQL语句的参数值  
      147.         // int[] paramsTypes = this.parseArrayToInt((Object[])sqlMap.get("paramsTypes")); // 参数值类型  
      148.         this.showSQL(sql);  
      149.         return dbconn.execUpdate(sql, paramsValues);  
      150.     }  
      151.       
      152.     /** 
      153.      * 更新对象 
      154.      * @param obj 待更新的实体对象 
      155.      * @param keyColumn 更新对象的限定条件字段名称 
      156.      * @return 返回被更新的记录数 
      157.      */  
      158.     public  int update(T obj, String keyColumn) throws Exception{  
      159.         String tableName = TB_PREFIX + this.toLowerCaseFirstOne(obj.getClass().getSimpleName());  
      160.         // 自动生成对象的更新操作的SQL语句及其参数值  
      161.         Object[] updateSql = SQLUtil.generateUpdate(obj, tableName, keyColumn);  
      162.         this.showSQL(updateSql[0].toString());  
      163.         return dbconn.execUpdate(updateSql[0].toString(), (Object[])updateSql[1]);  
      164.     }  
      165.       
      166.     /** 
      167.      * 删除对象 
      168.      * @param obj 待更新的实体对象 
      169.      * @param keyColumn 删除的限定条件字段 
      170.      * @return 返回被删除的记录数 
      171.      */  
      172.     public  int delete(T obj, String keyColumn) throws Exception{  
      173.         // 获取限定条件的值  
      174.         Object keyValue = ReflectionUtil.getFieldValue(obj, keyColumn);  
      175.         if(keyValue == null){  
      176.             throw new RuntimeException("["+obj.getClass()+"]中不存在属性'"+keyColumn+"'或属性值为空.");  
      177.         }  
      178.         StringBuffer sqlBuffer = new StringBuffer();  
      179.         sqlBuffer.append("delete from ");  
      180.         sqlBuffer.append(TB_PREFIX);  
      181.         sqlBuffer.append(this.toLowerCaseFirstOne(obj.getClass().getSimpleName()));  
      182.         sqlBuffer.append(" where ");  
      183.         sqlBuffer.append(keyColumn);  
      184.         sqlBuffer.append(" = ? ");  
      185.         this.showSQL(sqlBuffer.toString());  
      186.         return dbconn.execUpdate(sqlBuffer.toString(), keyValue.toString());  
      187.     }  
      188.       
      189.     /** 
      190.      * 删除指定编号的实体对象 
      191.      * @param classType 对象类型 
      192.      * @param keyColumn ID对应的数据表列名称 
      193.      * @param id 实体对象编号 
      194.      * @return 返回删除的记录数 
      195.      */  
      196.     public  int deleteById(Class classType, String keyColumn, Serializable id)   
      197.             throws Exception{  
      198.         StringBuffer sqlBuffer = new StringBuffer();  
      199.         sqlBuffer.append("delete from ");  
      200.         sqlBuffer.append(TB_PREFIX);  
      201.         sqlBuffer.append(this.toLowerCaseFirstOne(classType.getSimpleName()));  
      202.         sqlBuffer.append(" where ");  
      203.         sqlBuffer.append(keyColumn);  
      204.         sqlBuffer.append(" = ? ");  
      205.         this.showSQL(sqlBuffer.toString());  
      206.         return dbconn.execUpdate(sqlBuffer.toString(), id);  
      207.     }  
      208.       
      209.      /** 
      210.      * 批量删除指定编号的实体对象 
      211.      * @param classType 对象类型 
      212.      * @param idColumnName 编号字段名称  
      213.      * @param ids 待删除对象的编号数组 
      214.      */  
      215.     public  int deleteByIds(Class classType, String idColumnName,  
      216.             Serializable[] ids) throws Exception{  
      217.         StringBuffer sqlBuffer = new StringBuffer();  
      218.         sqlBuffer.append("delete from ");  
      219.         sqlBuffer.append(TB_PREFIX);  
      220.         sqlBuffer.append(this.toLowerCaseFirstOne(classType.getSimpleName()));  
      221.         sqlBuffer.append(" where ");  
      222.         sqlBuffer.append(idColumnName);  
      223.         sqlBuffer.append(" = ? ");  
      224.         this.showSQL(sqlBuffer.toString());  
      225.         int rowNums = 0// 删除的记录数  
      226.         for(int i = 0; i < ids.length; i++){  
      227.             rowNums += this.deleteById(classType, idColumnName, ids[i]);  
      228.         }  
      229.         return rowNums;  
      230.     }  
      231.       
      232.     /** 
      233.      * 更新操作 
      234.      * @param sql 删除操作的SQL语句 
      235.      * @param params SQL语句中的参数值 
      236.      * @return 返回删除的记录数 
      237.      */  
      238.     public int update(String sql, Object... params) throws Exception{  
      239.         this.showSQL(sql);  
      240.         return dbconn.execUpdate(sql, params);  
      241.     }  
      242.       
      243.     /** 
      244.      * 批量更新对象 
      245.      * @param objs 待更新的实体对象列表 
      246.      * @param keyColumn 主键字段名称 
      247.      */  
      248.     public  int batchUpdate(List objs, String keyColumn) throws Exception{  
      249.         if(objs == null || objs.isEmpty()){  
      250.             return 0;  
      251.         }  
      252.         int updateNum = 0;  
      253.         // 自动生成对象的更新操作的SQL语句及其参数值  
      254.         for(int i = 0; i < objs.size(); i++){  
      255.             T obj = objs.get(i);  
      256.             updateNum += this.update(obj, keyColumn);  
      257.         }  
      258.         return updateNum;  
      259.     }  
      260.       
      261.      /** 
      262.      * 批量插入对象 
      263.      * @param objs 待新增的实体对象列表 
      264.      * @param keyColumn 数据表主键列名称 
      265.      * @throws IllegalAccessException  
      266.      * @throws IllegalArgumentException  
      267.      */  
      268.     public  int batchInsert(List objs, String keyColumn) throws Exception {  
      269.         if(objs == null || objs.isEmpty()){  
      270.             return 0;  
      271.         }  
      272.         int updateNum = 0;  
      273.         // 自动生成对象的更新操作的SQL语句及其参数值  
      274.         for(int i = 0; i < objs.size(); i++){  
      275.             T obj = objs.get(i);  
      276.             updateNum += this.insert(obj, keyColumn);  
      277.         }  
      278.         return updateNum;  
      279.     }  
      280.       
      281.     /** 
      282.      * 统计指定统计数量的SQL语句 
      283.      * @param sql 待执行的SQL语句 
      284.      * @param params SQL语句参数值 
      285.      * @return 返回记录总数 
      286.      * @throws Exception 
      287.      */  
      288.     public int getTotalRows(String sql, Object... params) throws Exception{  
      289.         String totalRowsSql = "select count(*) totalRows from ( "+sql+" )";  
      290.         this.showSQL(totalRowsSql);  
      291.         ResultSet rs = dbconn.queryForResultSet(totalRowsSql, params);  
      292.         while(rs.next()){  
      293.             return rs.getInt("totalRows");  
      294.         }  
      295.         return 0;  
      296.     }  
      297.       
      298.     /** 
      299.      * 删除操作 
      300.      * @param sql 删除操作的SQL语句 
      301.      * @param params SQL语句中的参数值 
      302.      * @return 返回删除的记录数 
      303.      */  
      304.     public int delete(String sql, Object... params) throws Exception{  
      305.         this.showSQL(sql);  
      306.         return dbconn.execUpdate(sql, params);  
      307.     }  
      308.       
      309.     /** 
      310.      * 获取下一个指定自增序列的值(MySql) 
      311.      * @param classType 对象类型 
      312.      * @param seqColName 自增字段名称 
      313.      * @return 返回指定表的主键自增序列的最新值 
      314.      */  
      315.     public  int getNextAutoIncrementVal(Class classType, String seqColName) throws Exception{  
      316.         StringBuffer sqlBuf = new StringBuffer();  
      317.         sqlBuf.append("select max(");  
      318.         sqlBuf.append(seqColName);  
      319.         sqlBuf.append(")+1 nextId from ");  
      320.         sqlBuf.append(TB_PREFIX);  
      321.         sqlBuf.append(this.toLowerCaseFirstOne(classType.getSimpleName()));  
      322.         this.showSQL(sqlBuf.toString());  
      323.         ResultSet rs = dbconn.queryForResultSet(sqlBuf.toString());  
      324.         if(rs.next()){  
      325.             return rs.getInt("nextId");  
      326.         }else{  
      327.             return 0;  
      328.         }  
      329.     }     
      330.   
      331.     /** 
      332.      * 首字母转小写 
      333.      * @param str 待转换的字符创 
      334.      * @return 返回首字母小写后的字符串 
      335.      */  
      336.     public String toLowerCaseFirstOne(String str){  
      337.          if(Character.isLowerCase(str.charAt(0))){  
      338.               return str;  
      339.          }else{  
      340.              return (new StringBuilder()).append(Character.toLowerCase(str.charAt(0))).  
      341.                      append(str.substring(1)).toString();  
      342.          }  
      343.     }  
      344.       
      345.     /** 
      346.      * 首字母转大写 
      347.      * @param str 待转换的字符串 
      348.      * @return 返回首字母大写的字符串 
      349.      */  
      350.     public String toUpperCaseFirstOne(String str){  
      351.          if(Character.isUpperCase(str.charAt(0))){  
      352.              return str;  
      353.          }else{  
      354.              return (new StringBuilder()).append(Character.toUpperCase(str.charAt(0))).  
      355.                      append(str.substring(1)).toString();  
      356.          }  
      357.     }  
      358.   
      359.     /** 
      360.      * 打印SQL语句 
      361.      * @param sql 
      362.      */  
      363.     public void showSQL(String sql){  
      364.         System.out.println(sql);  
      365.     }  
      366.       
      367. }  

              以上是根据自己的理解封装的一些常用DAO层操作,并已运用到部署上线的两个项目中,目前尚未报出BUG。但在效率方面,个人觉得还有很多地方需要优化的地方,比如说批量增删改操作,根据我个人PC机测试的结果,使用JDBC自带的批量操作,要比上述简单循环的操作速度要慢,但我还是觉得这部分的效率还有很大的提升空间,希望能有位IT大卡给我指点一二,不甚感激!

      你可能感兴趣的:(Java)