Java中使用JDBC连接数据库时,若是使用初级的代码,代码复用率非常低,连接过程简单来说分为以下几个步骤:

加载驱动包

准备好URL链接获取数据库连接(driver和url根据不同的数据库的不同而不同)

准备sql语句,对数据库进行增删改查四个基础操作,获取数据并处理

关闭与数据库的连接
(与此同时整个过程还要注意进行异常处理)

以上详细步骤可参考博客:http://www.cnblogs.com/erbing/p/5805727.html

加载JDBC驱动程序 → 建立数据库连接Connection → 创建执行SQL的语句Statement → 处理执行结果ResultSet → 释放资源

那么针对以上步骤,在大型项目开发中是无法采纳的,原因有:(1)代码的重用程度低,这种编码方式将造成大量的代码冗余,增加程序员负担(2)整个过程采用硬编码,当需要修改系统配置如:更换数据库时,需要重新编码及发布等等;那么为了避免这些缺点,让我们在开发的过程中将主要的精力都放在针对处理SQL语句及其关键参数上,我们需要对以上代码进行二次重构,做出我们自己的接口;

简单分析,使用JDBC的目的是为了在java代码中使用sql语句对数据库进行增删改查(也就是:查询及修改两个操作,我们将增删改三个操作都视为修改操作),那么我们在开发的过程中,若是只要使用查询和修改的两个接口对数据库进行操作,将大大减轻我们的工作量,我们将这两个接口分别命名为:findBySQL和exeuteUpdate,详细实现代码请见下:

 1 package com.neu.dao;
 2 
 3 import java.sql.Connection;
 4 import java.sql.PreparedStatement;
 5 import java.sql.ResultSet;
 6 import java.sql.ResultSetMetaData;
 7 import java.sql.SQLException;
 8 import java.util.ArrayList;
 9 import java.util.HashMap;
10 import java.util.List;
11 
12 import com.neu.util.DBManager;
13 
14 public class BaseDao {
15     private Connection conn;
16     private PreparedStatement stmt;
17     private ResultSet rst;
18     
19     public int exeuteUpdate(String sql,Object...args){
20         //Object...args是java中的可变长参数列表的语法,可以按照规则向其传输sql语句需要的所有参数
21         int count=0;
22         try {
23             conn=DBManager.getConnection();
24             stmt=conn.prepareStatement(sql);
25             if(args!=null){
26                 for(int i=0;i<args.length;i++){
27                     stmt.setObject(i+1, args[i]);
28                 }
29             }
30             count=stmt.executeUpdate();
31         } catch (SQLException e) {
32             throw new RuntimeException("执行sql语句有误",e);
33         }finally{
34             DBManager.close(conn, stmt, rst);
35         }
36         return count;
37     }
38     
39     //不需要提供列名,只需要sql语句和参数即可
40         public  List<HashMap<String, String>> findBySQL(String sql,
41                 Object...params){
42 //            <>表示 泛型 
43 //            保存所有行中的数据
44             List<HashMap<String, String>> list=
45                     new ArrayList<HashMap<String,String>>();
46 //            保存每一行中的每一列数据
47             HashMap<String, String> item=null;
48             try {
49                 conn=DBManager.getConnection();
50                 stmt=conn.prepareStatement(sql);
51                 if(params!=null){
52                     for(int i=0;i<params.length;i++){
53                         stmt.setObject(i+1, params[i]);
54                     }
55                 }
56                 rst=stmt.executeQuery();
57                 //可以获取查询的列数目
58                 ResultSetMetaData meta=rst.getMetaData();
59                 int count=meta.getColumnCount();
60                 String[] colNames=new String[count];
61                 for(int i=0;i<count;i++){
62                     colNames[i]=meta.getColumnName(i+1);
63                 }
64                 //System.out.println(Arrays.toString(colNames));
65                 while(rst.next()){
66                     item=new HashMap<String, String>();
67                     for(int i=0;i<count;i++){
68                         String value=rst.getString(colNames[i]);
69                         item.put(colNames[i].toLowerCase(), value);
70                     }
71                     list.add(item);
72                 }
73             } catch (SQLException e) {
74                 throw new RuntimeException("执行查询异常", e);
75             } finally{
76                 DBManager.close(conn, stmt, rst);
77             }
78             return list;
79         }
80 }
BaseDao.java

相关文章:

  • 2022-01-31
  • 2021-08-07
  • 2022-12-23
  • 2021-08-08
  • 2022-12-23
  • 2022-12-23
  • 2022-01-01
  • 2022-01-07
猜你喜欢
  • 2022-02-01
  • 2021-10-04
  • 2022-12-23
  • 2022-02-03
  • 2022-12-23
  • 2022-01-07
  • 2021-06-28
相关资源
相似解决方案