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 }