通用Dao

xiaoxiao2021-02-28  154

通用Dao是解决系统中需要多次对单表的增删改查的麻烦,有了通用DAO就可以调用相关函数实现对单表的增删改查和对多表的查询,减少程序代码的重复,提高代码的复用性,使程序更加简洁明了。

下图是本通用DAO的包命名以及类命名

下面是连接oracle数据库

package test.common.dao;

import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; /**  *   * 数据库连接类  *  */ public class DBConnection { private static Connection con;     static String url = "jdbc:oracle:" + "thin:@127.0.0.1:1521:orcl";// 127.0.0.1是本机地址,XE是精简版Oracle的默认数据库名     static String user = "hrbeu";// 用户名,系统默认的账户名     static String password = "admin";// 你安装时选设置的密码 static { try  { Class.forName("oracle.jdbc.driver.OracleDriver");// 加载Oracle驱动程序 System.out.println("开始尝试连接数据库!"); catch (ClassNotFoundException e)  { System.out.println("驱动错误"); } } public static Connection getConnection() { if(con==null) { try  {      con = DriverManager.getConnection(url, user, password);// 获取连接 System.out.println("数据库连接成功"); } catch (SQLException e)  { System.out.println("数据库连接出错"); } } return con; } // public void close()  // { // if (con != null)  // { // try  // { //                con.close();//关闭数据库连接 //                System.out.println("成功关闭数据库连接"); //            } catch (SQLException e) // { //                e.printStackTrace(); //            } //        } //    }

}

}

//定义通用DAO接口

package test.common.dao; import java.sql.ResultSet; import java.util.ArrayList; import java.util.List; import java.util.Map; public interface TestCommonDao { /** * 泛型Dao的查询方法 * @param  Table 存储表名 * @param  List  要查询的属性 * @param  map   where后面的键值对 * @param  Sort   升序降序参数 * @param List2   排序的先后顺序:如先按部门从小到大排序,再按时间的先后排序 * @return list  */ public  List<String> select (String Table,ArrayList<String> List,Map<String, String> map,int Sort,ArrayList<String> List2);//单表查询 /** * 泛型Dao的添加方法 * @param Table 插入的表名 * @param map 键值对 * @return */ public  boolean insert(String Table,Map<String, String> map);//单表插入 /** * 泛型Dao的更新方法 * @param Table 表名 * @param map1 键值对 * @param map2 键值对 * @return */ public boolean update(String Table, Map<String, String> map1, Map<String, String> map2);//单表更新 /** * 泛型Dao的删除方法 * @param Table 表名 * @param  map 键值对 * @return */ public   boolean  delete(String Table,Map<String, String> map,List<String> list,List<String> list1);//单表删除 /** * 泛型Dao的查询方法 * @param Table 表名 * @param List 要查询的属性 * @param List2 where的属性 * @param  * @param  * @return list  */ public ResultSet Multi_table_select(ArrayList<String> Table, ArrayList<String> List,ArrayList<String> List2);//单表查询 }

//对DAO接口的增删改查的实现

package test.common.dao.impl; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import test.common.dao.DBConnection; import test.common.dao.TestCommonDao; public class TestCommonDaoImpl implements TestCommonDao  { /** * 数据库操作变量 */ private Connection con = null;// 创建一个数据库连接 private PreparedStatement pre = null;// 创建预编译语句对象,一般都是用这个而不用Statement private ResultSet result = null;// 创建一个结果集对象 private final boolean SHOW_SQL = true; @Override public List<String> select(String Table,ArrayList<String> List1, Map<String, String> map, int Sort , ArrayList<String> List2)  { /** * Sort的值 等于1代表升序,2代表降序,0代表不排序 */ List<String> list =new ArrayList<String>(); /** * 拼接SQL语句 * 查询形如:select id form stu where age='18' and name='wang' order by id; */ StringBuffer sb = new StringBuffer(); sb.append("select ");  for( int i=0;i<List1.size();i++ )  { if(i<List1.size()-1) { sb.append(List1.get(i)); sb.append(","); } else { sb.append(List1.get(i)); } } //   for(String s:List1){ //  sb.append(s); //  } sb.append(" from "); sb.append(Table); sb.append(" where "); int i = map.size()-1; Map<Integer, String> mapKey = new HashMap<Integer, String>(); Map<Integer, String> mapValue = new HashMap<Integer, String>(); for(java.util.Map.Entry<String, String> entry : map.entrySet())  { System.out.println("====将参数MAP的VALUE放入新的MAP的KEY里面======"+entry.getValue()); mapKey.put(i, entry.getValue()); System.out.println("====将参数MAP的KEY放入新的MAP的VALUE里面======"+entry.getKey()); mapValue.put(i, entry.getKey()); i--; for(int j = map.size()-1;j>=0;j--) { if(j>0) { System.out.println("打印成功取出的VALUE值:"+mapValue.get(j)); sb.append(mapValue.get(j)); sb.append(" = "); System.out.println("打印成功取出KEY值:"+mapKey.get(j)); sb.append(mapKey.get(j)); sb.append(" and "); } else { System.out.println("打印成功取出VALUE值:"+mapValue.get(j)); sb.append(mapValue.get(j)); sb.append(" = "); System.out.println("打印成功取出KEY值:"+mapKey.get(j)); sb.append(mapKey.get(j)); } } if(Sort==1) { if(List2.size()<=0) { System.out.println("未输入需要排序的属性,请检查"); return list; } else { sb.append(" ORDER "); sb.append("by "); for( int f=0;f<List2.size();f++ )  { if(f<List2.size()-1) { sb.append(List2.get(f)); sb.append(","); } else { sb.append(List2.get(f)); } } } } if(Sort==2) { if(List2.size()<=0) { System.out.println("未输入需要排序的属性,请检查"); return list; } else sb.append(" ORDER "); sb.append("by "); for( int f=0;f<List2.size();f++ )  { if(f<List2.size()-1) { sb.append(List2.get(f)); sb.append(","); } else { sb.append(List2.get(f)); } } sb.append(" DESC "); } } else { sb.append(""); }            if (SHOW_SQL)  { System.out.println("打印拼接后的查询SQL语句:"+sb.toString()); } try  { con = DBConnection.getConnection();    String sql=sb.toString(); //    System.out.println("***************************** " + sql); pre = con.prepareStatement(sql);// 实例化预编译语句 result = pre.executeQuery();// 执行查询,得到结果集,注意括号中不需要再加参数   while (result.next())   {            // 当结果集不为空时 //         for(String s:List1){ //  System.out.println("成功取出查询结果"+result.getString(s)); //        list.add(result.getString(s)); //  }   for( int a=0;a<List1.size();a++ )  {   System.out.println("成功取出查询结果"+List1.get(a)+":"+result.getString(List1.get(a)));   list.add(result.getString(List1.get(a))); }   } } catch (SQLException e) { e.printStackTrace(); } finally    { try  { if (result != null)                result.close(); System.out.println("成功关闭结果集result连接");            if (pre != null)                pre.close();            System.out.println("成功关闭PreparedStatement语句对象连接");            if (con != null)                con.close();//关闭数据库连接                 System.out.println("成功关闭数据库Connection连接");             } catch (SQLException e) {                 e.printStackTrace();             }    } return list; } @Override public boolean insert(String Table, Map<String, String> map)  { /** * 拼接SQL语句 * 形如 insert into stu(age,id,name)values(18,0008,'wang'); */ StringBuffer sb = new StringBuffer(); sb.append("insert ");  sb.append(" into "); sb.append(Table); sb.append("("); int i = map.size()-1; Map<Integer, String> mapKey = new HashMap<Integer, String>();         Map<Integer, String> mapValue = new HashMap<Integer, String>();    for(java.util.Map.Entry<String, String> entry : map.entrySet())     {   System.out.println("======将参数MAP的VALUE放入新的MAP的KEY里面======"+entry.getValue());       mapKey.put(i, entry.getValue());       System.out.println("======将参数MAP的KEY放入新的MAP的VALUE里面====="+entry.getKey());       mapValue.put(i, entry.getKey());       i--; } for(int j =0;j<map.size();j++) {   if(j<map.size()-1)   {   System.out.println("++打印成功取出的VALUE值+++ "+mapValue.get(j));       sb.append(mapValue.get(j));       sb.append(",");   }   else   {      System.out.println("++打印成功取出的VALUE值+++ "+mapValue.get(j));       sb.append(mapValue.get(j));       sb.append(")");   } }        sb.append(" values ");        sb.append("(");        for(int j =0;j<map.size();j++)        {       if(j<map.size()-1)       {       System.out.println("++打印成功取出的KEY值+++ "+mapKey.get(j));           sb.append(mapKey.get(j));           sb.append(",");       }       else       {       System.out.println("++打印成功取出的KEY值+++ "+mapKey.get(j));           sb.append(mapKey.get(j));           sb.append(")");       }        }        if (SHOW_SQL)  { System.out.println("打印拼接后的插入SQL语句:"+sb.toString()); }        try          {         con = DBConnection.getConnection();         String sql=sb.toString(); //         System.out.println("***************************** " + sql); pre = con.prepareStatement(sql);// 实例化预编译语句 result = pre.executeQuery();// 执行插入SQL语句,得到结果集,注意括号中不需要再加参数 System.out.println("成功插入数据库"); }         catch (SQLException e)         { e.printStackTrace(); }        finally    { try  { if (result != null)                result.close(); System.out.println("成功关闭结果集result连接");            if (pre != null)                pre.close();            System.out.println("成功关闭PreparedStatement语句对象连接");            if (con != null)                con.close();//关闭数据库连接                System.out.println("成功关闭数据库Connection连接");            } catch (SQLException e) {                e.printStackTrace();            }    } return SHOW_SQL ;  } @Override public boolean  update(String Table, Map<String, String> map1, Map<String, String> map2)  { /** * 拼接SQL语句 * 更新语句形如:update stu set age='18' ,id='4' where name ='wang'and id='19' */ StringBuffer sb = new StringBuffer(); sb.append("update ");  sb.append(Table); sb.append(" set "); int i = map1.size()-1; Map<Integer, String> mapKey = new HashMap<Integer, String>(); Map<Integer, String> mapValue = new HashMap<Integer, String>(); for(java.util.Map.Entry<String, String> entry : map1.entrySet()) { System.out.println("======将参数MAP1的VALUE放入新的MAP1的KEY里面===="+entry.getValue()); mapKey.put(i, entry.getValue()); System.out.println("====将参数MAP1的KEY放入新的MAP1的VALU里面===="+entry.getKey()); mapValue.put(i, entry.getKey()); i--; for(int j = map1.size()-1;j>=0;j--) { if(j>0) { System.out.println("打印成功取出的VALUE值"+mapValue.get(j)); sb.append(mapValue.get(j)); sb.append(" = "); System.out.println("打印成功取出的KEY值"+mapKey.get(j)); sb.append(mapKey.get(j)); sb.append(" , "); } else { System.out.println("打印成功取出的VALUE值"+mapValue.get(j)); sb.append(mapValue.get(j)); sb.append(" = "); System.out.println("打印成功取出的KEY值"+mapKey.get(j)); sb.append(mapKey.get(j)); } } sb.append(" where "); int j2 = map1.size()-1; Map<Integer, String> mapKey2 = new HashMap<Integer, String>(); Map<Integer, String> mapValue2 = new HashMap<Integer, String>(); for(java.util.Map.Entry<String, String> entry2 : map2.entrySet()) { System.out.println("=======将参数MAP2的VALUE放入新的MAP2的KEY里面======="+entry2.getValue()); mapKey2.put(j2, entry2.getValue()); System.out.println("======将参数MAP2的KEY放入新的MAP2的VALUE里面===="+entry2.getKey()); mapValue2.put(j2, entry2.getKey()); j2--; for(int j = map2.size()-1;j>=0;j--) { if(j>0) { System.out.println("+++打印成功取出的VALUE值+++++ "+mapValue2.get(j)); sb.append(mapValue2.get(j)); sb.append(" = "); System.out.println("+++打印成功取出的KEY值+++++ "+mapKey2.get(j)); sb.append(mapKey2.get(j)); sb.append(" and "); } else { System.out.println("+++打印成功取出的VALUE值+++++ "+mapValue2.get(j)); sb.append(mapValue2.get(j)); sb.append(" = "); System.out.println("+++打印成功取出的KEY值+++++ "+mapKey2.get(j)); sb.append(mapKey2.get(j)); } } if (SHOW_SQL)  { System.out.println("打印拼接后的更新SQL语句:"+sb.toString());//打印SQL语句 } try  { con = DBConnection.getConnection(); String sql=sb.toString(); // System.out.println("***************************** " + sql); pre = con.prepareStatement(sql);// 实例化预编译语句 result = pre.executeQuery();// 执行更新SQL语句,得到结果集,注意括号中不需要再加参数 System.out.println("成功更新结果"); //        while (result.next()){ //            // 当结果集不为空时 //         System.out.println("成功更新结果"); //      //  list.add(result.getString(Attributes)); //        } catch (SQLException e) { e.printStackTrace(); } finally    { try  { if (result != null)                result.close(); System.out.println("成功关闭结果集result连接");            if (pre != null)                pre.close();            System.out.println("成功关闭PreparedStatement语句对象连接");            if (con != null)                con.close();//关闭数据库连接                 System.out.println("成功关闭数据库Connection连接");             } catch (SQLException e) {                 e.printStackTrace();             }    } return SHOW_SQL ; } @Override public boolean  delete(String Table,  Map<String, String> map,List<String> list,List<String> list1)  { /** *  拼接SQL语句 *  删除语句形如:delete from stu where age='18'and id='0009'; */ StringBuffer sb = new StringBuffer(); sb.append("delete ");  sb.append(" from "); sb.append(Table); sb.append(" where "); if(map.size()-1>0&&list.size()>0) { int i = map.size()-1; Map<Integer, String> mapKey = new HashMap<Integer, String>();        Map<Integer, String> mapValue = new HashMap<Integer, String>();        for(java.util.Map.Entry<String, String> entry : map.entrySet())        {         System.out.println("====将参数MAP的VALUE放入新的MAP的KEY里面========"+entry.getValue());            mapKey.put(i, entry.getValue());            System.out.println("====将参数MAP的KEY放入新的MAP的VALUE里面========"+entry.getKey());            mapValue.put(i, entry.getKey());            i--;        }  for(int j = map.size()-1;j>=0;j--) { if(j>0) {            System.out.println("++++打印成功取出的VALUE值++++ "+mapValue.get(j));        sb.append(mapValue.get(j));        sb.append(" = ");            System.out.println("++++打印成功取出的KEY值++++ "+mapKey.get(j));            sb.append(mapKey.get(j));            sb.append(" and "); } else {       sb.append(mapValue.get(j));       sb.append(" = ");       sb.append(mapKey.get(j));   }       } sb.append(" and "); String idGroup = ""; for(int g=0; g<list1.size(); g++) { idGroup = idGroup + "'" + list1.get(g) + "'"; if(g < list1.size()-1) { idGroup = idGroup + ","; } } for( int h=0;h<list.size();h++ )  { sb.append(list.get(h)); } sb.append(" in "); sb.append(" ( "); sb.append(idGroup ); sb.append(" ) "); } else if(map.size()-1>0&&list.size()==0) { int i = map.size()-1; Map<Integer, String> mapKey = new HashMap<Integer, String>();        Map<Integer, String> mapValue = new HashMap<Integer, String>();        for(java.util.Map.Entry<String, String> entry : map.entrySet())        {         System.out.println("====将参数MAP的VALUE放入新的MAP的KEY里面========"+entry.getValue());            mapKey.put(i, entry.getValue());            System.out.println("====将参数MAP的KEY放入新的MAP的VALUE里面========"+entry.getKey());            mapValue.put(i, entry.getKey());            i--;        }  for(int j = map.size()-1;j>=0;j--) { if(j>0) {            System.out.println("++++打印成功取出的VALUE值++++ "+mapValue.get(j));        sb.append(mapValue.get(j));        sb.append(" = ");            System.out.println("++++打印成功取出的KEY值++++ "+mapKey.get(j));            sb.append(mapKey.get(j));            sb.append(" and "); } else {       sb.append(mapValue.get(j));       sb.append(" = ");       sb.append(mapKey.get(j));   }       } } else if(list.size()>0&&map.size()-1==0) { String idGroup = ""; for(int i=0; i<list1.size(); i++) { idGroup = idGroup + "'" + list1.get(i) + "'"; if(i < list1.size()-1) { idGroup = idGroup + ","; } } for( int h=0;h<list.size();h++ )  { sb.append(list.get(h)); } sb.append(" in "); sb.append(" ( "); sb.append(idGroup ); sb.append(" ) "); } else { sb.append(" 1 "); sb.append(" = "); sb.append(" 1 "); } if (SHOW_SQL) { System.out.println("打印拼接后的删除SQL语句:"+sb.toString()); }         try          {         con = DBConnection.getConnection();         String sql=sb.toString(); //         System.out.println("***************************** " + sql); pre = con.prepareStatement(sql);// 实例化预编译语句 result = pre.executeQuery();// 执行删除语句SQL,得到结果集,注意括号中不需要再加参数 System.out.println("成功删除"); }          catch (SQLException e)         { e.printStackTrace(); }            finally    { try  { if (result != null)                result.close(); System.out.println("成功关闭结果集result连接");            if (pre != null)                pre.close();            System.out.println("成功关闭PreparedStatement语句对象连接");            if (con != null)                con.close();//关闭数据库连接                 System.out.println("成功关闭数据库Connection连接");             } catch (SQLException e) {                 e.printStackTrace();             }    } return SHOW_SQL ; } @Override public ResultSet Multi_table_select(ArrayList<String> Table, ArrayList<String> List1,ArrayList<String> List2) { /** *  拼接SQL语句 *  查询形如:select s.id,t.heigh form stu s,teach t where t.age=s.age and t.name=s.name and t.no=s.sno; */ StringBuffer sb = new StringBuffer(); sb.append("select ");  for( int i=0;i<List1.size();i++ )  { if(i<List1.size()-1) { sb.append(List1.get(i)); sb.append(","); } else { sb.append(List1.get(i)); } } sb.append(" from "); for( int i=0;i<Table.size();i++ )  { if(i<Table.size()-1) { sb.append(Table.get(i)); sb.append(","); } else { sb.append(Table.get(i)); } } sb.append(" where "); for( int i=0;i<List2.size();i++ )  { if(i<List2.size()-1) { for( int j=0;j<Table.size();j++ )  { if(j<Table.size()-1) { sb.append(Table.get(j)+"."+List2.get(i)); //sb.append(Table.get(j)+"."+List2.get(i)+"="+Table.get(j++)+"."+List3.get(i)); sb.append("="); // sb.append(Table.get(j++)+"."+List3.get(i)); } else { sb.append(Table.get(j)+"."+List2.get(i)); } } sb.append(" and "); } else { for( int j=0;j<Table.size();j++ )  { if(j<Table.size()-1) { sb.append(Table.get(j)+"."+List2.get(i)); sb.append("="); } else { sb.append(Table.get(j)+"."+List2.get(i)); } //  sb.append(Table.get(j)+"."+List2.get(i)+"="+Table.get(j++)+"."+List3.get(i)); } } } if (SHOW_SQL)  { System.out.println("打印拼接后的查询SQL语句:"+sb.toString()); } try  { con = DBConnection.getConnection(); String sql=sb.toString(); // System.out.println("***************************** " + sql); pre = con.prepareStatement(sql);// 实例化预编译语句 result = pre.executeQuery();// 执行查询,得到结果集,注意括号中不需要再加参数 //        while (result.next()){ //            // 当结果集不为空时         for(String s:List1){  sb.append(s);  System.out.println("成功取出查询结果"+result.getString(s));        list.add(result.getString(s));  } //         //         for( int a=0;a<List1.size();a++ )  //  { //         System.out.println("成功取出查询列名"+List1.get(a)); //       System.out.println("成功取出查询结果"+List1.get(a)+":"+result.getString(List1.get(a)));        list.add(result.getString(List1.get(a))); //   //  } //         } } catch (SQLException e)  { e.printStackTrace(); } finally    { try  { if (result != null)                result.close(); System.out.println("成功关闭结果集result连接");            if (pre != null)                pre.close();            System.out.println("成功关闭PreparedStatement语句对象连接");            if (con != null)                con.close();//关闭数据库连接                 System.out.println("成功关闭数据库Connection连接");             } catch (SQLException e) {                 e.printStackTrace();             }    } return result; } } 对DAO增删改查测试

package test.testmain; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import test.common.dao.impl.TestCommonDaoImpl; public class Test1  { public static void main(String[] args)  { TestCommonDaoImpl testCommonImpl = new TestCommonDaoImpl(); //        Map<String, String> map = new HashMap<String, String>(); //        map.put("USER_ID", "'fgsdhshdshfs'"); //        map.put("OBJECT_BID", "'6325888'");     //查询形如:select id form stu where age='18' and name='wang' order by id; //        ArrayList<String> List = new ArrayList<String>(); //        ArrayList<String> List1 = new ArrayList<String>();        //for( int i=0;i<10;i++ ) //给数组增加10个Int元素 //        List.add("id");  //       // List.add("pid"); //       //1代表升序,2代表降序,0代表不排序 //       List1.add("1232");  //       List1.add("6545");         // List1.add(" id");          //排序的先后顺序:如先按部门从小到大排序,再按时间的先后排序         //testCommonImpl.select("t_process_format", List, map,2,List1);       //形如 insert into stu(age,id,name)values(18,0008,'wang');       //  testCommonImpl.insert("t_process_format", map);       //更新语句形如:update stu set age='18' ,id='4' where name ='wang'and id='19' //        Map<String, String> map1 = new HashMap<String, String>(); //        map1.put("id", "'6545'"); //        map1.put("OBJECT_BID", "'6325888'"); //        Map<String, String> map2 = new HashMap<String, String>(); //        map2.put("PID", "'123fh'"); //        map2.put("USER_ID", "'fgsdhshdshfs'"); //        testCommonImpl.update("t_process_format", map1, map2);     //删除语句形如:delete from stu where age='18'and id in(50,80),; //        testCommonImpl.delete("t_process_format", map,List,List1); //查询形如:select s.id,t.heigh form stu s,teach t where t.age=s.age and t.name=s.name ORDER BY number; //ORDER BY 排序字段 ASC | DESC [,排序字段 ASC | DESC] // ArrayList<String> table = new ArrayList<String>(); // ArrayList<String> List1 = new ArrayList<String>(); // ArrayList<String> List2 = new ArrayList<String>(); // ArrayList<String> List3 = new ArrayList<String>(); // table.add("t_process_format"); // table.add("teache"); // List1.add("t_process_format.ITEM_M"); // List1.add("teache.name"); // // List2.add("T_id"); // List2.add("pid"); // List2.add("USER_ID"); // List3.add("id"); // List3.add("pid"); // // List3.add("USER_ID"); //        testCommonImpl.Multi_table_select(table, List1, List2); } }

有了通用DAO以后对整个系统中需要对任何单表的增删改查都非常方便,多表的增删改一般不做通用DAO,因为即难以实现,调用的时候也操作不方便,增加大量的无用功,所以一般通用DAO都是实现对单表的增删改查,或者对多表的查询,而不做多表的增删改。有了通用DAO即可减少代码量,也使系统看起来更加专业,有水平。

转载请注明原文地址: https://www.6miu.com/read-42088.html

最新回复(0)