JAVA实现DAO层基本CRUD操作

本文介绍了如何使用Java通过JDBC实现数据库的CRUD操作,以MySQL为例,详细展示了数据源配置、结果集到POJO对象的映射、数据库连接辅助类以及通用分页查询实体类的实现,旨在不依赖ORM框架的情况下,提高代码可控性和可维护性。作者还分享了实际项目中的应用经验,并提出对于效率的优化思考。
摘要由CSDN通过智能技术生成

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

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

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

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

  (1)定义数据源常量类

[java]  view plain   copy
  print ? 在CODE上查看代码片 派生到我的代码片
  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 ? 在CODE上查看代码片 派生到我的代码片
  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<T>{  
  16.     private Class<T> objectClass;  
  17.       
  18.     public RowMapper(Class<T> 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<T> mapRows(ResultSet rs){  
  69.         int rowNum = 0;  
  70.         List<T> objList = new ArrayList<T>();  
  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 ? 在CODE上查看代码片 派生到我的代码片
  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 <T> List<T> execQuery(String sql, RowMapper<T> 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.             }  
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值