文章目录
  1. 1. (模板方法的运用)持久层操作的java代码

(模板方法的运用)持久层操作的java代码


第一个是操作数据库方法的抽象接口,
其实这个接口也很简单,定义了那么几个方法,说白了就是操作数据库的。

为什么要写成泛型的接口,为了就是后面大家的业务有针对性,一个实体一个业务功能类。

Java代码  

  1. package  com.yd.idao;    
  2.     
  3. import  java.util.List;    
  4. import  java.sql.Connection;    
  5. import  java.sql.ResultSet;    
  6. import  java.sql.SQLException;    
  7.     
  8. import  com.yd.support.JDataSet;    
  9.     
  10. /**  
  11.   *  一个定义了所有我所需要的数据库操作的方法接口,  
  12.   *  为什么定义为抽象,我自己都搞不清楚,  
  13.   *  这里定义了泛型,这个很关键,你会看到泛型在这里的使用  
  14.   *  @author  kanny  
  15.   *  
  16.   *  @param    
  17.   */    
  18. public  abstract  interface  ISqlHelper  {    
  19.     
  20.         /**  
  21.           *  执行sql语句,大多为单句插入语句  
  22.           *  @param  sql      单句的sql语句  
  23.           *  @param  params        插入的参数  
  24.           *  @param  only            但为true时,sql语句为查询数量的查询语句  
  25.           *  @return  
  26.           *  @throws  SQLException  
  27.           */    
  28.         public  boolean  execute(String  sql,  Object[]  params,  boolean  only)  throws  SQLException;    
  29.     
  30.         /**  
  31.           *  执行sql的批处理  
  32.           *  @param  sqlBatch    多条sql语句  
  33.           *  @return  
  34.           *  @throws  SQLException  
  35.           */    
  36.         public  boolean  executeBatch(String[]  sqlBatch)  throws  SQLException;    
  37.     
  38.         /**  
  39.           *  执行存储过程  
  40.           *  @param  procName    存储过程名称  
  41.           *  @param  params        存储过程说需要的参数  
  42.           *  @return  
  43.           *  @throws  SQLException  
  44.           */    
  45.         public  boolean  executeCall(String  procName,  Object[]  params)  throws  SQLException;    
  46.     
  47.         /**  
  48.           *  查询一行数据封装成java的实体  
  49.           *  @param  sql      sql语句  
  50.           *  @param  params        sql条件参数  
  51.           *  @param  viewName    视图名字,在查询多表关联的数据时用于区分  
  52.           *  @param  executeCall      是否是存储过程,如果为true,第一个sql的参数为存储过程名称  
  53.           *  @return  
  54.           *  @throws  SQLException  
  55.           */    
  56.         public  T  find(String  sql,  Object[]  params,  String  viewName,  boolean  executeCall)  throws  SQLException;    
  57.     
  58.         /**  
  59.           *  查询多行数据封装成java的实体加入一个List里  
  60.           *  @param  sql      sql语句  
  61.           *  @param  params        sql条件参数  
  62.           *  @param  viewName    视图名字,在查询多表关联的数据时用于区分,循环封装实体比单一的石头封装要复杂  
  63.           *  @param  executeCall      是否是存储过程,如果为true,第一个sql的参数为存储过程名称  
  64.           *  @return  
  65.           *  @throws  SQLException  
  66.           */    
  67.         public  List  findList(String  sql,  Object[]  params,  String  viewName,  boolean  executeCall)  throws  SQLException;    
  68.     
  69.         /**  
  70.           *  为了方便操作,我还特意写定义了这个返回ResultSet的方法,便于直接操作  
  71.           *  @param  sql  
  72.           *  @param  params  
  73.           *  @param  executeCall  
  74.           *  @return  
  75.           *  @throws  SQLException  
  76.           */    
  77.         public  ResultSet  returnResultSet(String  sql,  Object[]  params,  boolean  executeCall)  throws  SQLException;    
  78.             
  79.         /**  
  80.           *  我的底层分页方法,我会给出具体代码,但这里用的只是sql  server  2008的数据库分页  
  81.           *  @param  sql        
  82.           *  @param  orderby      排序列  
  83.           *  @param  currentPage      当前页  
  84.           *  @param  pageSize    每页多少行  
  85.           *  @return  
  86.           *  @throws  SQLException  
  87.           */    
  88.         public  List  findListAsPager(String  sql,  String  orderby,  int  currentPage,  int  pageSize)  throws  SQLException;    
  89.     
  90.         /**  
  91.           *  后来为了方便操作,想朋友要来了这个JDataSet类,类似.net的DataTable的作用  
  92.           *  @param  sql  
  93.           *  @param  params  
  94.           *  @param  fillColumnNames      是否填充类名,请看方法代码  
  95.           *  @param  executeCall  
  96.           *  @return  
  97.           */    
  98.         public  JDataSet  getJDataSet(String  sql,  Object[]  params,  boolean  fillColumnNames,  boolean  executeCall);    
  99.             
  100.         /**  
  101.           *  由于有了JDataSet这个类,于是我有写了调用这个类的分页方法  
  102.           *  @param  sql  
  103.           *  @param  orderby  
  104.           *  @param  currentPage  
  105.           *  @param  pageSize  
  106.           *  @return  
  107.           *  @throws  SQLException  
  108.           */    
  109.         public  JDataSet  getJDataSetAsPager(String  sql,  String  orderby,  int  currentPage,  int  pageSize)  throws  SQLException;    
  110.             
  111.         /**  
  112.           *  为了方便起见,我多写了一个直接传入ResultSet而封装JDataSet的多余方法  
  113.           *  @param  rs  
  114.           *  @param  fillColumnNames  
  115.           *  @return  
  116.           *  @throws  SQLException  
  117.           */    
  118.         public  JDataSet  loadJDataSet(ResultSet  rs,  boolean  fillColumnNames)  throws  SQLException;    
  119.             
  120.         /**  
  121.           *  得到查询数据的行数  
  122.           *  @param  sql  
  123.           *  @return  
  124.           *  @throws  SQLException  
  125.           */    
  126.         public  int  getRowCount(String  sql)  throws  SQLException;    
  127.             
  128.         /**  
  129.           *  请看源码  
  130.           *  @param  rs  
  131.           *  @param  column  
  132.           *  @return  
  133.           *  @throws  SQLException  
  134.           */    
  135.         public  String  changeFont(ResultSet  rs,  String  column)  throws  SQLException;    
  136.             
  137.         /**  
  138.           *  得到连接  
  139.           *  @return  
  140.           *  @throws  SQLException  
  141.           */    
  142.         public  Connection  returnConn()  throws  SQLException;      
  143.             
  144.         /**  
  145.           *  清楚所有数据库操作对象  
  146.           *  @throws  SQLException  
  147.           */    
  148.         public  void  clearAllsql()  throws  SQLException;      
  149.     
  150. }    





第2个类是实现这个抽象接口的抽象模版方法类
这个类最为关键,它肯定是实现了ISqlHepler.java里面的所有的方法。

其中:

protected abstract T loadDataBean(ResultSet rs, String viewName) throws
SQLException;

protected abstract T loadDataBeanSelf(ResultSet rs) throws
SQLException;
\

这2个方法是SqlHelper.java里留出来了,就是为了大家可以自己封装实体javabean来用
\

Java代码
  

  1. package  com.yd.dao;    
  2.     
  3. import  java.sql.*;    
  4. import  java.util.*;    
  5.     
  6. import  com.yd.db.DBConnPoolMgr;    
  7. import  com.yd.idao.ISqlHelper;    
  8. import  com.yd.support.JDataSet;    
  9.     
  10. public  abstract  class  SqlHelper  implements  ISqlHelper  {    
  11.     
  12.         protected  java.sql.Connection  conn  =  null;    
  13.     
  14.         protected  java.sql.PreparedStatement  pst  =  null;    
  15.     
  16.         protected  java.sql.Statement  st  =  null;    
  17.     
  18.         protected  java.sql.CallableStatement  cs  =  null;    
  19.     
  20.         protected  java.sql.ResultSet  rs  =  null;    
  21.     
  22.         protected  java.sql.ResultSetMetaData  rm  =  null;    
  23.             
  24.         public  Connection  returnConn()  throws  SQLException  {    
  25.     
  26.                                     //DBConnPoolMgr是自己写的一个简单连接池类,用来得到连接,我后面会给出这个类的代码    
  27.                 return  (conn  =  DBConnPoolMgr.getInctence().getConnect());    
  28.         }    
  29.             
  30.         private  PreparedStatement  returnPst(String  sql,  Object[]  params)  throws  SQLException  {    
  31.     
  32.                 if  (conn  ==  null  ||  conn.isClosed())  conn  =  returnConn();    
  33.                 pst  =  conn.prepareStatement(sql);    
  34.                 if  (params  !=  null)    
  35.                         for  (int  i  =  0;  i  <  params.length;  i++)    
  36.                                 pst.setObject(i  +  1,  params[i]);    
  37.                 return  pst;    
  38.                     
  39.         }    
  40.     
  41.         protected  CallableStatement  returnCs(String  procName,  Object[]  params)  throws  SQLException  {    
  42.     
  43.                 if  (conn  ==  null  ||  conn.isClosed())  conn  =  returnConn();    
  44.                 String  call  =  “”;    
  45.                 if  (params  !=  null)  {    
  46.                         call  =  “{call  “  +  procName  +  “(“;    
  47.                         for  (int  c  =  0;  c  <  params.length  -  1;  c++)    
  48.                                 call  +=  “?,”;    
  49.                         call  +=  “?)}”;    
  50.                 }  else    
  51.                         call  =  “{call  “  +  procName  +  “()}”;    
  52.                 cs  =  conn.prepareCall(call);    
  53.                 if  (params  !=  null)    
  54.                         for  (int  i  =  0;  i  <  params.length;  i++)    
  55.                                 cs.setObject(i  +  1,  params[i]);    
  56.                 return  cs;    
  57.                     
  58.         }    
  59.     
  60.         public  void  clearAllsql()  {    
  61.                 try      
  62.                 {      
  63.                         if  (rs  !=  null)  rs.close();    
  64.                         if  (cs  !=  null)  cs.close();    
  65.                         if  (st  !=  null)  st.close();    
  66.                         if  (pst  !=  null)  pst.close();    
  67.                         if  (conn  !=  null)  {    
  68.                                 DBConnPoolMgr.getInctence().returnConnect(conn);    
  69.                         }    
  70.                         rs  =  null;    
  71.                         cs  =  null;    
  72.                         st  =  null;    
  73.                         pst  =  null;    
  74.                 }      
  75.                 catch  (SQLException  ex)  {  ex.printStackTrace();  }    
  76.         }    
  77.     
  78.         public  boolean  execute(String  sql,  Object[]  params,  boolean  only)  {    
  79.                     
  80.                 boolean  bVal  =  false;    
  81.                 try      
  82.                 {    
  83.                         if  (only)  {    
  84.                                 rs  =  returnPst(sql,  params).executeQuery();    
  85.                                 while  (rs.next())  bVal  =  true;    
  86.                         }  else  {    
  87.                                 returnPst(sql,  params).executeUpdate();    
  88.                                 bVal  =  true;    
  89.                         }    
  90.                 }      
  91.                 catch  (SQLException  ex)  {  ex.printStackTrace();  }      
  92.                 finally  {  clearAllsql();  }    
  93.                 return  bVal;    
  94.         }    
  95.     
  96.         public  boolean  executeBatch(String[]  sqlBatch)  {    
  97.                     
  98.                 boolean  bVal  =  false;    
  99.                 try      
  100.                 {    
  101.                         conn  =  returnConn();    
  102.                         st  =  conn.createStatement();    
  103.                         boolean  autoCommit  =  conn.getAutoCommit();    
  104.     
  105.                         for  (int  i  =  0;  i  <  sqlBatch.length;  i++)  {    
  106.                                 if  (sqlBatch[i]  !=  null  &&  !sqlBatch[i].equals(“”))    
  107.                                         st.addBatch(sqlBatch[i]  +  “;”);    
  108.                         }    
  109.                         conn.setAutoCommit(false);    
  110.                         st.executeBatch();    
  111.                         conn.commit();    
  112.                         conn.setAutoCommit(autoCommit);    
  113.                         bVal  =  true;    
  114.                 }      
  115.                 catch  (SQLException  ex)  {    
  116.                         try  {  conn.rollback();  }  catch  (SQLException  e)  {  e.printStackTrace();  }    
  117.                         ex.printStackTrace();    
  118.                 }  finally  {  clearAllsql();  }    
  119.                 return  bVal;    
  120.         }    
  121.     
  122.         public  boolean  executeCall(String  procName,  Object[]  params)  {    
  123.                     
  124.                 boolean  bVal  =  false;    
  125.                 try      
  126.                 {    
  127.                         returnCs(procName,  params).executeUpdate();    
  128.                         bVal  =  true;    
  129.                 }      
  130.                 catch  (Exception  ex)  {  ex.printStackTrace();  }      
  131.                 finally  {  clearAllsql();  }    
  132.                 return  bVal;    
  133.         }    
  134.     
  135.         public  T  find(String  sql,  Object[]  params,  String  viewName,  boolean  executeCall)  {    
  136.                     
  137.                 T  t  =  null;    
  138.                 try      
  139.                 {    
  140.                         if  (executeCall)  rs  =  returnCs(sql,  params).executeQuery();    
  141.                         else  rs  =  returnPst(sql,  params).executeQuery();    
  142.                         t  =  loadResultSet(rs,  viewName);    
  143.                 }      
  144.                 catch  (Exception  ex)  {  ex.printStackTrace();  }      
  145.                 finally  {  clearAllsql();  }    
  146.                 return  t;    
  147.         }    
  148.     
  149.         public  List  findList(String  sql,  Object[]  params,  String  viewName,  boolean  executeCall)  {    
  150.                     
  151.                 List  lt  =  null;    
  152.                 try      
  153.                 {    
  154.                         if  (executeCall)  rs  =  returnCs(sql,  params).executeQuery();    
  155.                         else  rs  =  returnPst(sql,  params).executeQuery();    
  156.                         lt  =  loadList(rs,  viewName);    
  157.                 }      
  158.                 catch  (Exception  ex)  {  ex.printStackTrace();  }      
  159.                 finally  {  clearAllsql();  }    
  160.                 return  lt;    
  161.         }    
  162.     
  163.         public  ResultSet  returnResultSet(String  sql,  Object[]  params,  boolean  executeCall)  {    
  164.                 try      
  165.                 {    
  166.                         if  (executeCall)  rs  =  returnCs(sql,  params).executeQuery();    
  167.                         else  rs  =  returnPst(sql,  params).executeQuery();    
  168.                 }      
  169.                 catch  (Exception  ex)  {  ex.printStackTrace();  }    
  170.                 return  rs;    
  171.         }    
  172.     
  173.         private  T  loadResultSet(ResultSet  rs,  String  viewName)  throws  SQLException  {    
  174.                     
  175.                 T  t  =  null;    
  176.                 if  (rs  !=  null)  while  (rs.next())  t  =  loadDataBean(rs,  viewName);    
  177.                 return  t;    
  178.         }    
  179.     
  180.         private  List  loadList(ResultSet  rs,  String  viewName)  throws  SQLException  {    
  181.                     
  182.                 List  tlist  =  new  ArrayList();    
  183.                 if  (rs  !=  null)      
  184.                         while  (rs.next())      
  185.                                 tlist.add(loadDataBean(rs,  viewName));    
  186.                 return  tlist;    
  187.         }    
  188.     
  189.         public  String  changeFont(ResultSet  rs,  String  column)  throws  SQLException  {    
  190.                 return  rs.getString(column)  ==  null  ?  “”  :  rs.getString(column);    
  191.         }    
  192.     
  193.         public  int  returnColumnCount(ResultSet  rs)  throws  SQLException  {    
  194.                 return  rs.getMetaData().getColumnCount();    
  195.         }    
  196.     
  197.                   //两个非常关键的模版方法,继承此类的操作类都要实现这2个方法,我到时候会给出操作类    
  198.         protected  abstract  T  loadDataBean(ResultSet  rs,  String  viewName)  throws  SQLException;    
  199.     
  200.         protected  abstract  T  loadDataBeanSelf(ResultSet  rs)  throws  SQLException;    
  201.     
  202.         public  List  findListAsPager(String  sql,  String  orderby,  int  currentPage,  int  pageSize)  {    
  203.                     
  204.                 List  lt  =  null;    
  205.                 try      
  206.                 {    
  207.                         String  strVal  =  strPager(sql,  orderby,  currentPage,  pageSize);    
  208.                         rs  =  returnPst(strVal,  null).executeQuery();    
  209.                         lt  =  loadList(rs,  “”);    
  210.                 }      
  211.                 catch  (SQLException  ex)  {  ex.printStackTrace();  }      
  212.                 finally  {  clearAllsql();  }    
  213.                 return  lt;    
  214.         }    
  215.     
  216.                   //因为用的sql  server  2008所以只写了这个数据库的分页    
  217.         private  String  strPager(String  sql,  String  orderby,  int  currentPage,  int  pageSize)  {    
  218.                     
  219.                 int  start  =  1;    
  220.                 if  (currentPage  >  1)  start  =  (currentPage  -  1)  *  pageSize  +  1;    
  221.                 int  end  =  start  +  pageSize  -  1;    
  222.                     
  223.                 String  sqlColumn  =  “*“;    
  224.                 String  sqlDo  =  “”;    
  225.                 if(sql.indexOf(“@#“)  !=  -1)  {    
  226.                         String  []sqlArr  =  sql.split(“@#“);    
  227.                         sqlColumn  =  sqlArr[0];    
  228.                         sqlDo  =  sqlArr[1];    
  229.                 }  else  {    
  230.                         sqlColumn  =  “*“;    
  231.                         sqlDo  =  sql;    
  232.                 }    
  233.                     
  234.                 String  strVal  =  “select  *  from  (select  “  +  sqlColumn  +  “,ROW_NUMBER()”;    
  235.                 strVal  +=  “  Over(order  by  “  +  orderby  +  “)”;    
  236.                 strVal  +=  “  as  rowNum  “  +  sqlDo  +  “)”;    
  237.                 strVal  +=  “  as  myTable  where  rowNum  between  “  +  start  +  “  and  “  +  end;    
  238.     
  239.                 return  strVal;    
  240.         }    
  241.     
  242.         public  int  getRowCount(String  sql)  throws  SQLException  {    
  243.                     
  244.                 String  sqlDo  =  “”;    
  245.                 if(sql.indexOf(“@#“)  !=  -1)  {    
  246.                         String  []sqlArr  =  sql.split(“@#“);    
  247.                         sqlDo  =  sqlArr[1];    
  248.                 }  else  sqlDo  =  sql;    
  249.                     
  250.                 int  count  =  0;    
  251.                 try      
  252.                 {    
  253.                         rs  =  this.returnResultSet(“select  count(*)  “  +  sqlDo,  null,  false);    
  254.                         while  (rs.next())  count  =  rs.getInt(1);    
  255.                 }      
  256.                 catch  (Exception  ce)  {  ce.printStackTrace();}      
  257.                 finally  {  clearAllsql();  }    
  258.                 return  count;    
  259.         }    
  260.     
  261.         public  JDataSet  getJDataSetAsPager(String  sql,  String  orderby,  int  currentPage,  int  pageSize)  {    
  262.                     
  263.                 String  strVal  =  strPager(sql,  orderby,  currentPage,  pageSize);    
  264.                 return  getJDataSet(strVal,  null,  true,  false);    
  265.         }    
  266.     
  267.         public  JDataSet  getJDataSet(String  sql,  Object[]  params,  boolean  fillColumnNames,  boolean  executeCall)  {    
  268.                     
  269.                 JDataSet  jds  =  null;    
  270.                 try      
  271.                 {    
  272.                         if  (executeCall)  rs  =  returnCs(sql,  params).executeQuery();    
  273.                         else  rs  =  returnPst(sql,  params).executeQuery();    
  274.                         jds  =  loadJDataSet(rs,  fillColumnNames);    
  275.                 }      
  276.                 catch  (Exception  ex)  {  ex.printStackTrace();  }      
  277.                 finally  {  clearAllsql();  }    
  278.                 return  jds;    
  279.         }    
  280.             
  281.         public  JDataSet  loadJDataSet(ResultSet  rs,  boolean  fillColumnNames)  {    
  282.                     
  283.                 JDataSet  jds  =  new  JDataSet();    
  284.                 try      
  285.                 {    
  286.                         int  columnCount  =  returnColumnCount(rs);    
  287.                         if  (fillColumnNames)  {    
  288.                                 String[]  columnNames  =  new  String[columnCount];    
  289.                                 String[]  columnTypeNames  =  new  String[columnCount];    
  290.                                 for  (int  i  =  0;  i  <  columnCount;  i++)  {    
  291.                                         columnNames[i]  =  rs.getMetaData().getColumnName(i  +  1);    
  292.                                         columnTypeNames[i]  =  rs.getMetaData().getColumnTypeName(i  +  1);    
  293.                                 }    
  294.                                 jds.setColumnNames(columnNames);    
  295.                                 jds.setColumnTypeNames(columnTypeNames);    
  296.                         }    
  297.                         while  (rs.next())  {    
  298.                                 String[]  row  =  new  String[columnCount];    
  299.                                 for  (int  i  =  0;  i  <  columnCount;  i++)    
  300.                                         row[i]  =  rs.getString(i  +  1)  ==  null  ?  “”  :  rs.getString(i  +  1).trim();    
  301.                                 jds.addRow(row);    
  302.                         }    
  303.                 }      
  304.                 catch  (Exception  ex)  {  ex.printStackTrace();  }    
  305.                 return  jds;    
  306.         }    
  307.     
  308. }    




现在来说下怎么用这个类
比如,你有一个学生类Student.java里面有id,name,age3个属性

\

Java代码
  

  1. public  Class  Student    
  2. {    
  3.         private  int  id;    
  4.         private  String  name;    
  5.         private  int  age;    
  6.             
  7.         以下get和set方法省略…    
  8. }    



\

你要封装它,你就可以自己定义一个IStudent.java接口extends那个ISqlHelper.java接口
然后来里面定义插入,查询全部,和按id查的功能函数,象如下写的一样
<
\

当然这样定义很死,最好的方法,就是整理抽象出所有业务类的公用方法,比如,插入,修改,删除。\

然后把这些方法在一个公用的操作接口中定义,这个公用的操作接口可以继承ISqlHelper.java接口
然后以后业务类或是数据实体操作类都可以实现这个公用的操作接口。

>
\

Java代码
  

  1. public  interface  IStudent  extends  ISqlHelper    
  2. {    
  3.         //插入Student    
  4.         public  boolean  insertStudent(Student  stu);    
  5.     
  6.         //查询全部Student    
  7.         public  List  findStudent();    
  8.     
  9.         //按id查询某一个Student    
  10.         public  Student  findStudentAsId(int  stuid);    
  11. }    




并写一个StudentBO.java业务类extends那个SqlHelper和自己定义的IStudent接口
象如下写的一样:

\

Java代码
  

  1. public  Class  StudentBO  extends  SqlHelper  implements  IStudent    
  2. {    
  3.             
  4.         protected  Student  loadDataBean(ResultSet  rs,  String  viewName)  throws  SQLException;    
  5.         {    
  6.                 Student  stu  =  loadDataBeanSelf(ResultSet  rs);    
  7.                 return  stu;    
  8.         }    
  9.     
  10.         protected  Student  loadDataBeanSelf(ResultSet  rs)  throws  SQLException;    
  11.         {    
  12.                 Student  stu  =  new  Student();    
  13.                 stu.setId(rs.getInt(“id”));    
  14.                 stu.setName(rs.changeFont(rs,“name”));    
  15.                 stu.setAge(rs.getInt(“age”));    
  16.                     
  17.                 return  stu;    
  18.         }    
  19.     
  20.         //实现:插入Student的函数    
  21.         public  boolean  insertStudent(Student  stu)    
  22.         {    
  23.                 String  sql  =  “insert  into  Student(id,name,age)  values(?,?,?)”;    
  24.                 Object  []  params  =  new  Object[]{stu.getId(),stu.getName,stu.getAge};    
  25.                 return  this.execute(sql,  params,  false);    
  26.         }    
  27.     
  28.         //实现:查询全部Student    
  29.         public  List  findStudent()    
  30.         {    
  31.                 String  sql  =  “select  *  from  Student”;    
  32.                 return  this.findList(sql,  null,  “”,false);    
  33.         }    
  34.     
  35.         //实现:按id查询某一个Student    
  36.         public  Student  findStudentAsId(int  stuid)    
  37.         {    
  38.                 String  sql  =  “select  *  from  Student  where  id=”  +  stuid;    
  39.                 return  this.find(sql,  null,  “”,false);    
  40.         }    
  41. }    



loadDataBean,loadDataBeanSelf是从SqlHelper里继承下来的抽象方法。
必须实现。这就是利用了模版方法模式写出来的。
也就是说,以后你自己写函数的时候,只要在接口里定义,\

然后在这样的BO类里写实现它,而且就写那么一点语句就完成了。大大省时省力。
\

好了这样就完成了,代码是不是看上去又清楚又整洁,如果查找和维护。而且大大减少了那些功能代码和封装象Student.java这样数据实体的代码。一次封装无须在写。

大家肯定有疑问,那就是
this.execute
this.findList
this.find
三个函数哪来的,里面都做了些什么
首先要说他们3个肯定是SqlHelper里被实现过的函数
至于他们怎么实现的,你仔细看下就全明白了。

\

为什么要多出一个loadDataBean来,大家都看到了,他有一个参数viewName,这里就是用到这个参数的地方,因为大家操作数据库不
可能就是那么一张表的操作,有时候会有2到3张表联查,那么用这个参数来判断是哪个函数查出不一样的结果,那么你在这个函数里利用这个参数引进别的
xxxBO的loadDataBeanSelf函数,不就可以不用再次重新写那些讨厌的实体封装代码了吗。重用性大大提升。

注意一点,这里的查询是只能全查,如果只需要几个字段,就只能手动自己写咯,其实我是想写一个通用的想查几个字段就几个字段的封装方法,但我懒,所以到现在都没去写

其实还有很多应用和问题,这些我在这里也说不完,希望大家多多交流。

\

我还会给出我自己当初写的数据库连接池类,希望这些简单的代码能给java新手以帮助。
而且如果大家觉得有问题有意义,一定要发帖指出。哪里好哪里不好
希望大家多多给出看法,多多益善。

在这里还要感谢论坛中yangguo兄,其实我当时写这段代码的主要目的
就是dbutils框架所实现的一个最重要功能\

只提交sql语句,然后的数据自动填充到所需要的实体中。而不要在写那么多繁琐的实体封装代码。

这个是源码例子,希望大家能明白这样写的用意,值得探讨。

文章目录
  1. 1. (模板方法的运用)持久层操作的java代码