`
eastPoint
  • 浏览: 53440 次
  • 性别: Icon_minigender_1
  • 来自: 湖北武汉
社区版块
存档分类
最新评论

对象开发的好处和坏处

阅读更多

           对于现在这个项目对象开发的好处暂时大于坏处

service代码:

java 代码
  1. public class ClientGroupClientService {   
  2.     private Connection con;   
  3.     private ClientGroupClientDAO cgcdao;   
  4.     private final static int INSERT = 1;   
  5.     private final static int UPDATE = 2;   
  6.     private final static int DELETE = 3;   
  7.        
  8.     public ClientGroupClientService() {   
  9. //      con = ConnUtils.getConnection() ;   
  10.         con = ConnUtils.getDefaultConnection();   
  11.         cgcdao = new ClientGroupClientDAO(getPdao());   
  12.     }   
  13.        
  14.     /**  
  15.      * 初始化该pojo的基本信息  
  16.      * @return Pojo的基本信息,用于dao中的构造参数  
  17.      */  
  18.     private PojoDao getPdao(){   
  19.         PojoDao pdao = new PojoDao();   
  20.         pdao.setView_name("V_CLIENTGROUPCLIENT");//设置此操作类的视图   
  21.         pdao.setPrimarykeyname("objectID");//设置此视图的主键   
  22.         pdao.setP_insert("{call pkg_hedge.up_AddClientGroupClient(?,?,?)}");   
  23.         pdao.setP_update("{call pkg_hedge.up_ModClientGroupClient(?,?,?)}");   
  24.         pdao.setP_delete("{call pkg_hedge.up_DelClientGroupClient(?,?,?)}");   
  25.         return pdao;   
  26.     }   
  27.        
  28.     /*  
  29.      * 分页下载数据  
  30.      * */  
  31.     public void getClientGroupCLientByPage(Page page) {   
  32.         int pageSize = page.getPageSize();   
  33.         int pageIndex = page.getPageIndex();   
  34.         int lastNum = pageIndex*pageSize;   
  35.         int beginNum = (pageIndex-1)*pageSize;   
  36.         ResultSet rs = cgcdao.getDataByPage(con, lastNum, beginNum);   
  37.         ClientGroupClient temp = null;   
  38.            
  39.         List templist = null;   
  40.         if(rs!=null)   
  41.         try {   
  42.             templist = new ArrayList();   
  43.             while(rs.next()){   
  44.                 temp = new ClientGroupClient();   
  45.                 temp.setObjectID(new Long(rs.getLong("objectid")));   
  46.                 temp.setClientID(rs.getString("clientid"));   
  47.                 temp.setCreater(rs.getString("creater"));   
  48.                 temp.setGroupID(new Long(rs.getLong("groupid")));   
  49.                 templist.add(temp);   
  50.             }   
  51.         page.setList(templist);    //添加当页数据   
  52.         rs = cgcdao.getCountNum(con);   
  53.         if(rs!=null)   
  54.         if(rs.next()){   
  55.             page.setRecordCount(rs.getInt(1));   
  56.             page.setPageCount((page.getRecordCount()+(page.getPageSize()-1))/page.getPageSize());//设置分页的页数   
  57.         }   
  58.         } catch (SQLException e) {   
  59.             e.printStackTrace();   
  60.         }finally{   
  61.             temp = null;   
  62.             ConnUtils.close(rs, null, con);   
  63.         }   
  64.     }   
  65.        
  66.     public String insert(List list){   
  67.         return cgcdao.operate(con, list, INSERT);   
  68.     }   
  69.        
  70.     public String update(List list){   
  71.         return cgcdao.operate(con, list, UPDATE);   
  72.     }   
  73.        
  74.     public String delete(List list){   
  75.         return cgcdao.operate(con, list, DELETE);   
  76.     }   
  77.        
  78.     public String batchCRUD(List inserts,List updates,List deletes){   
  79.         String re_msg=null;   
  80.         if(inserts!=null && inserts.size()>0)   
  81.             re_msg = cgcdao.operate(con, inserts, INSERT);   
  82.         if(updates!=null && updates.size()>0)   
  83.             re_msg = cgcdao.operate(con, updates, UPDATE);   
  84.         if(deletes!=null && deletes.size()>0)   
  85.             re_msg = cgcdao.operate(con, deletes, DELETE);   
  86.         closeCon();   
  87.         return re_msg;   
  88.     }   
  89.        
  90.     private void closeCon(){   
  91.         ConnUtils.close(con);   
  92.     }   
  93.        
  94. }  

在批量的方法中调用dao层的抽象方法,好处是将同一过程的代码全部都抽象化,这样操作的前提是对象化的开发,一切参数都是对象化,包括传入数据库中存储过程的参数也是对象化的,这样开发的好处有两点:

第一:维护方便,需要修改的只有存储过程中的对象,和表现层的现实对象,中间过程不会变动特别是抽象的dao层不会变。

第二:简化开发代码,特别是简化了dao曾的代码,其他层的代码也大相径庭,特别是给予dorado的开发模式更是如此。

事例代码如下:

java 代码
  1. public abstract class AcceccDao {   
  2.     protected ResultSet rs;   
  3.     protected CallableStatement proc;   
  4.     protected PreparedStatement pst;   
  5.     protected Person person;   
  6.     protected Iterator it;   
  7.     private Object temp; //临时的变量   
  8.        
  9.     protected PojoDao pdao;   
  10.     public AcceccDao() {   
  11.         // TODO Auto-generated constructor stub   
  12.     }   
  13.     /**  
  14.      * 通过继承类的构造函数初始化将要操作的视图和存储过程名  
  15.      * 视图名称为v_xxx  
  16.      * 其中primarykey 用于排序,如果可以传入一个null  
  17.      * 存储过程为"{call pkg_hedge.uf_AddCreditrecord(?,?,?)}"包含了所有的call和大括号  
  18.      * @param view_name  
  19.      * @param p_insert  
  20.      * @param p_update  
  21.      * @param p_delete  
  22.      */  
  23.     public AcceccDao(PojoDao pdao){   
  24.         this.pdao = pdao;   
  25.     }   
  26.        
  27.     /**  
  28.      * 返回分页数据集  
  29.      * @param con 连接对象  
  30.      * @param lastNum 分页数据的最后一条数据号  
  31.      * @param beginNum .......第一条数据号  
  32.      * @return  
  33.      */  
  34.     public ResultSet getDataByPage(Connection con, int lastNum,int beginNum ) {   
  35.         StringBuffer sb = new StringBuffer();   
  36.         try {   
  37.             sb.append("select * from (select vin.*,rownum rn from "+pdao.getView_name()+" vin where rownum <= ?) vout where rn > ?");   
  38.             if(pdao.getPrimarykeyname()!=null)   
  39.                  sb.append(" order by vout."+pdao.getPrimarykeyname()+" asc");   
  40.             pst = con.prepareStatement(sb.toString());   
  41.             pst.setInt(1, lastNum);   
  42.             pst.setInt(2, beginNum);   
  43.             return pst.executeQuery();   
  44.         } catch (SQLException e) {   
  45.             e.printStackTrace();   
  46.             return null;   
  47.         }finally{   
  48.                
  49.         }          
  50.     }   
  51.        
  52.     /**  
  53.      * 返回该视图记录数的总条数  
  54.      */  
  55.     public ResultSet getCountNum(Connection con){   
  56.         String sql = "select max(rownum) from "+pdao.getView_name();   
  57.         try {   
  58.             pst = con.prepareStatement(sql);   
  59.             return pst.executeQuery();   
  60.         } catch (SQLException e) {   
  61.             e.printStackTrace();   
  62.             return null;   
  63.         }   
  64.     }   
  65.        
  66.     /**  
  67.      * 此方法用于批量或者单个处理增删该  
  68.      * @param con  连接对象  
  69.      * @param list 操作的对象pojo  
  70.      * @param operateType 在service里面定义成常量     
  71.      * private static final int INSERT=1;  
  72.      * private static final int UPDATE=1;  
  73.      * private static final int DELETE=1;  
  74.      * @return  
  75.      */  
  76.     public String operate(Connection con, List list,int operateType) {     
  77.         try {   
  78.             String sql = null;   
  79.             switch (operateType) {   
  80.             case 1:   
  81.                 sql = pdao.getP_insert();   
  82.                 break;   
  83.             case 2:   
  84.                 sql = pdao.getP_update();   
  85.                 break;   
  86.             case 3:   
  87.                 sql = pdao.getP_delete();   
  88.                 break;   
  89.             }   
  90.             proc = con.prepareCall(sql);   
  91.             for(it = list.iterator();it.hasNext();){   
  92.                 temp = (ClientGroupClient)it.next();   
  93.                 proc.registerOutParameter(1, OracleTypes.INTEGER);   
  94.                 proc.registerOutParameter(2, OracleTypes.VARCHAR);   
  95.                 proc.setObject(3, temp);   
  96.                 proc.execute();   
  97.             }   
  98.             return proc.getString(2);   
  99.         } catch (SQLException e) {   
  100.             e.printStackTrace();   
  101.             return null;   
  102.         } finally{   
  103.             temp = null;   
  104.             ConnUtils.close(null, proc, null);   
  105.         }   
  106.     }   
  107. }  

 

而实现类中dao的代码为:

java 代码
  1. public class ClientGroupClientDAO extends AcceccDao {      
  2.     public ClientGroupClientDAO(PojoDao pdao){   
  3.         super(pdao);   
  4.     }   
  5. }  

其中构造函数的参数为改到要操作的数据库中的信息,比如视图名,主键名,插入存储过程名,更新存储过程名,以及其他任何你需要的在dao的抽象层中需要的参数,都可以定义在这里。

java 代码
  1. public class PojoDao {   
  2.     private String view_name; //视图的名称   
  3.     private String primarykeyname;//此表的主键 用于排序   
  4.     private String p_insert; //插入的存储过程名   
  5.     private String p_update; //更新的存储过程名   
  6.     private String p_delete; //删除的...   
  7. //  private String order;    //用于asc 或者 desc   这个主要是为了说明面向对象的设计思想   
  8.        
  9.     public PojoDao() {   
  10.     }   
  11.   
  12.     public String getP_delete() {   
  13.         return p_delete;   
  14.     }   
  15.     public void setP_delete(String p_delete) {   
  16.         this.p_delete = p_delete;   
  17.     }   
  18.     public String getP_insert() {   
  19.         return p_insert;   
  20.     }   
  21.     public void setP_insert(String p_insert) {   
  22.         this.p_insert = p_insert;   
  23.     }   
  24.     public String getP_update() {   
  25.         return p_update;   
  26.     }   
  27.     public void setP_update(String p_update) {   
  28.         this.p_update = p_update;   
  29.     }   
  30.     public String getPrimarykeyname() {   
  31.         return primarykeyname;   
  32.     }   
  33.     public void setPrimarykeyname(String primarykeyname) {   
  34.         this.primarykeyname = primarykeyname;   
  35.     }   
  36.     public String getView_name() {   
  37.         return view_name;   
  38.     }   
  39.     public void setView_name(String view_name) {   
  40.         this.view_name = view_name;   
  41.     }   
  42. }  

在service中将这个PojoDao构造好就可以啦:

 

java 代码
  1. public ClientGroupClientService() {   
  2.     con = ConnUtils.getDefaultConnection();   
  3.     cgcdao = new ClientGroupClientDAO(getPdao());//调用getPdao();   
  4. }   
  5.   
  6. /**  
  7.  * 初始化该pojo的基本信息  
  8.  * @return Pojo的基本信息,用于dao中的构造参数  
  9.  */  
  10. private PojoDao getPdao(){   
  11.     PojoDao pdao = new PojoDao();   
  12.     pdao.setView_name("V_CLIENTGROUPCLIENT");//设置此操作类的视图   
  13.     pdao.setPrimarykeyname("objectID");//设置此视图的主键   
  14.     pdao.setP_insert("{call pkg_hedge.up_AddClientGroupClient(?,?,?)}");   
  15.     pdao.setP_update("{call pkg_hedge.up_ModClientGroupClient(?,?,?)}");   
  16.     pdao.setP_delete("{call pkg_hedge.up_DelClientGroupClient(?,?,?)}");   
  17.     return pdao;   
  18. }  

数据库中也是基于type的变成模式.

好处还是很多的。

 

但是也有不利的地方:

例如我们本次采用的是oracle数据库,存储使用起来太麻烦了,pojo中要匹配oracle的字段类型,多做好多工作,并且在tomcat下能够运行,换成weblogic就跑不动了。

分享到:
评论

相关推荐

    2024前端开发必会面试题和多种实战技巧

    以上是对前端开发领域中一些重要的知识点和实战技巧的详细介绍。对于前端开发者来说,掌握这些基础知识和技术不仅可以帮助他们更好地准备面试,还能提升日常开发的工作效率。希望本文对您有所帮助!

    C#中静态与非静态方法比较

    ### C#中静态与非静态方法的深入解析 #### 引言 在C#编程语言中,静态方法和非静态方法是两种常见...通过深入了解这两种方法的特点,开发者可以在实际开发过程中更加灵活高效地利用它们,从而提高代码的质量和性能。

    60条Android开发注意事项与经验总结

    4. 单一职责原则:不要相信庞大的管理类的东西会带来什么好处,可能是一场灾难,而要时刻注意单一职责原则,一个类专心做好一件事情更为清晰。 5. 延迟初始化:如果数据没有必要加载,数据请务必延迟初始化,谨记为...

    多态详解= 多态的优缺点在不同的编程场景中不同的适用性

    2. **对象间的转型问题**:多态涉及到向上转型和向下转型,向下转型(父类对象实例化子类对象)属于强制转换,如果不当使用可能会导致类型转换异常(ClassCastException)。 3. **性能开销**:虽然多态提高了代码...

    2018年JAVA架构师面试后的问题汇总-word范文 (2页).pdf

    好处是可以控制实例化过程,坏处是打破了单例模式的常规实现。 9. **排序算法**:常见的排序算法有冒泡排序、插入排序、选择排序、快速排序、归并排序、堆排序等,它们的时间复杂度各不相同,从O(n^2)到O(n log n)...

    百度面试题汇总(java)

    7. **闭包的好处与坏处**:闭包可以保持私有变量,但也可能导致内存泄漏。 8. **this指针的使用**:`this`在不同上下文中指向不同的对象,如函数调用、对象方法调用等。 9. **函数绑定**:使用`.bind()`方法可以...

    C# WINFORM 控件双向绑定少为人知的秘密

    如果控件的值是对象或 decimal、int 等非字符串类型,那么这个属性非常重要。如果将其设置为 false,可能会导致控件的值丢失。 此外,我们还可以使用 DataView 来实现双向绑定。当我们使用 DataSet 或 DataTable ...

    mybatis-第三天.doc.pdf

    - MyBatis 优势:封装了 JDBC,降低了开发工作量,解耦了业务代码和 SQL 代码,通过 XML 或注解方式配置 SQL,更易于维护。 3. **MyBatis 快速入门** - 创建 Maven 工程,引入 MyBatis 相关依赖,例如 MyBatis ...

    JavaScript高阶第三天.xmind

    js高阶笔记总结: 严格模式: 1.开启严格模式:"use strict" 2.... 3.... 高阶函数: 满足其中之一即高阶函数: 1.... 2.... 1.... 2.闭包的好处: 1.... 2.... 3.闭包的坏处: 1.... 1.... 2.递归函数的作用和循环效果... ①将对象转为字

    数据库基础运用

    识别和预防内存泄漏是软件开发中的重要任务。 #### 十、SQL Server中的高级数据管理技巧 在SQL Server中,理解并有效利用ID和LastUpdateDate字段,能够帮助优化数据更新和查询逻辑,进一步提升数据库应用的性能和...

    JS重载实现方法分析

    对于进一步学习JavaScript,可以参考的其他内容包括面向对象编程入门、JSON操作、特效与动画制作、查找和调试技巧、数据结构与算法、遍历算法、数学运算等,这些内容都是提高JavaScript编程能力的关键点。

    php 面试碰到过的问题 在此做下记录

    - 使用过哪些PHP框架,如Laravel, Symfony, CodeIgniter等,了解这些框架的基本原理和特性,以及如何利用它们提高开发效率。 7. **PHP与MySQL交互**: - 应熟悉如何使用`PDO`或`mysqli`进行数据库连接,了解...

Global site tag (gtag.js) - Google Analytics