zoukankan      html  css  js  c++  java
  • 泛型的使用

    目前这个项目使用的jsp+servlet+javabean,没有使用其它的框架。在处理数据库的时候,多张表就对应多个dao,而每个dao都有增删改查的方法,显得很冗余。于是写了一个CommonDao,其中包含了其他dao里面共有的一些方法。然后让其他的dao类继承CommonDao,servlet中直接使用CommonDao中的相应方法。那么这个时候遇到了一个问题,怎样判断需要对哪张表执行相应的操作。这时可以从servlet向dao类传入相应的sql,同时也需要判断传入的JavaBean对象,因为需要向sql中赋值。那么这个时候就需要使用泛型达到这一目的。

    使用泛型时:

     1 public class CommonDao<T> {
     2     private ExecuteStatement executeStatement = new ExecuteStatement();
     3     private ReturnList returnList = new ReturnList();
     4     private T t;
     5     
     6     //添加数据到数据库
     7     public void add(T t, String sql) {
     8         Connection conn = null;
     9         PreparedStatement stmt = null;
    10         try {
    11             conn = DataBaseUtil.getConnection();
    12             stmt = conn.prepareStatement(sql);
    13             if(t instanceof Customer) {                            //判断泛型t的类型
    14                 Customer customer = (Customer) t;
    15                 stmt = executeStatement.setStatement(customer,stmt);
    16             }
    17             else if(t instanceof Person) {
    18                 Person person = (Person) t;
    19                 stmt = executeStatement.setStatement(person,stmt);
    20             }
    21             else if(t instanceof Department) {
    22                 Department department = (Department) t;
    23                 stmt = executeStatement.setStatement(department,stmt);
    24             }
    25             stmt.executeUpdate();
    26         } catch (SQLException e) {
    27             e.printStackTrace();
    28         } finally {
    29             DataBaseUtil.close(stmt, conn);
    30         }
    31     }

    对应的其他dao:

     1 public class CustomerDao<T> extends CommonDao<T>{
     2     
     3     public CustomerDao() {
     4         
     5     }
     6     
     7     public void add(Customer customer) {
     8         Connection conn = null;
     9         PreparedStatement stmt = null;
    10         String sql = "insert into SYSCUSTOMER(cuscode,cusname,cusdepcode,cuspercode,devdate,busdate,exitdate," +
    11                 "cellphone,email,address,tenid,ufts) values(?,?,?,?,?,?,?,?,?,?,?,?)";
    12         try {
    13             conn = DataBaseUtil.getConnection();
    14             stmt = conn.prepareStatement(sql);
    15             stmt.setString(1, customer.getCusCode());
    16             stmt.setString(2, customer.getCusName());
    17             stmt.setString(3, customer.getCusDepCode());
    18             stmt.setString(4, customer.getCusPerCode());
    19             stmt.setString(5, customer.getDevDate());
    20             stmt.setString(6, customer.getBusDate());
    21             stmt.setString(7, customer.getExitDate());
    22             stmt.setString(8, customer.getCellphone());
    23             stmt.setString(9, customer.getEmail());
    24             stmt.setString(10, customer.getAddress());
    25             stmt.setString(11, customer.getTenId());
    26             long currentTime = System.currentTimeMillis();            //获取当前时间,毫秒级别,距离1970年
    27             Timestamp deptIsEnd = new Timestamp(currentTime);        //获取时间戳
    28             stmt.setTimestamp(12, deptIsEnd);
    29             stmt.executeUpdate();
    30         } catch (SQLException e) {
    31             e.printStackTrace();
    32         } finally {
    33             if(stmt != null) {
    34                 DataBaseUtil.closeStatement(stmt);
    35             }
    36             if(conn != null) {
    37                 DataBaseUtil.closeConnection(conn);
    38             }
    39         }
    40     }
    executeStatement.setStatement(customer,stmt)代码:
     1 //为customer表执行PreparedStatement方法
     2     public PreparedStatement setStatement(Customer customer, PreparedStatement stmt) {
     3         try {
     4             stmt.setString(1, customer.getCusCode());
     5             stmt.setString(2, customer.getCusName());
     6             stmt.setString(3, customer.getCusDepCode());
     7             stmt.setString(4, customer.getCusPerCode());
     8             stmt.setString(5, customer.getDevDate());
     9             stmt.setString(6, customer.getBusDate());
    10             stmt.setString(7, customer.getExitDate());
    11             stmt.setString(8, customer.getCellphone());
    12             stmt.setString(9, customer.getEmail());
    13             stmt.setString(10, customer.getAddress());
    14             stmt.setString(11, customer.getTenId());
    15             long currentTime = System.currentTimeMillis();            //获取当前时间,毫秒级别,距离1970年
    16             Timestamp deptIsEnd = new Timestamp(currentTime);        //获取时间戳
    17             stmt.setTimestamp(12, deptIsEnd);
    18         } catch (SQLException e) {
    19             e.printStackTrace();
    20         }
    21         return stmt;
    22     }

    CustomerServlet的add方法:

     1 /*
     2      * 功能:添加数据并返回到customer.jsp页面
     3      */
     4     @SuppressWarnings("unchecked")
     5     public void add(HttpServletRequest request, HttpServletResponse response) 
     6             throws ServletException, IOException {
     7         String cusCode = request.getParameter("cuscode");
     8         String cusName = null;
     9         try {
    10             cusName = new String(request.getParameter("cusname").getBytes("ISO-8859-1"),"utf-8");
    11         } catch (UnsupportedEncodingException e1) {
    12             e1.printStackTrace();
    13         }
    14         String cusDepCode = request.getParameter("cusdepcode");
    15         String cusPerCode = request.getParameter("cuspercode");
    16         String devDate = request.getParameter("devdate");
    17         String busDate = request.getParameter("busdate");
    18         String exitDate = request.getParameter("exitdate");
    19         Customer customer = new Customer();
    20         customer.setCusCode(cusCode);
    21         customer.setCusName(cusName);
    22         customer.setCusDepCode(cusDepCode);
    23         customer.setCusPerCode(cusPerCode);
    24         customer.setDevDate(devDate);
    25         customer.setBusDate(busDate);
    26         customer.setExitDate(exitDate);
    27         String sql = "insert into SYSCUSTOMER(cuscode,cusname,cusdepcode,cuspercode,devdate,busdate,exitdate," +
    28                 "cellphone,email,address,tenid,ufts) values(?,?,?,?,?,?,?,?,?,?,?,?)";
    29         //customerDao.add(customer);
    30         customerDao.add(customer, sql);
    31         select(request, response);
    32         try {
    33             response.sendRedirect("common/customer.jsp");
    34         } catch (IOException e) {
    35             e.printStackTrace();
    36         }
    37     }

    这样就很好的解决了代码冗余的问题,当然后面还可以再优化。

     
  • 相关阅读:
    eclipse上运行spark程序
    Java实现高斯模糊算法处理图像
    Hadoop环境共享
    P1182 数列分段`Section II`
    NOIP2015题解
    镜面上的迷失之链 —— 二分判定性问题
    网络最大流
    [IOI2008]Island
    历史的进程——单调队列
    快速幂
  • 原文地址:https://www.cnblogs.com/Aaronqcd/p/4049776.html
Copyright © 2011-2022 走看看