1 /** 2 * 3 */ 4 package com.hotel.util; 5 6 import java.sql.Connection; 7 import java.sql.DriverManager; 8 import java.sql.PreparedStatement; 9 import java.sql.ResultSet; 10 import java.sql.ResultSetMetaData; 11 import java.util.ArrayList; 12 import java.util.HashMap; 13 import java.util.List; 14 import java.util.Map; 15 16 import com.hotel.constant.Constants; 17 18 /** 19 * 数据库连接通用类 20 * 连接数据库的步骤: 21 * 1. 导入驱动包 22 * 2. 加载驱动 23 * 3. 通过驱动管理器类获取数据库连接 24 * 4. 通过连接对象创建预编译对象 25 * 5. 通过编译对象执行SQL指令并处理返回结果 26 * 6. 关闭相关操作对象 27 * 28 */ 29 public class DBUtil { 30 31 32 33 /** 34 * 定义获取连接对象的方法 35 * 36 */ 37 private static Connection getConn() { 38 39 // 定义连接对象句柄 40 Connection conn = null; 41 42 try { 43 // 加载驱动 44 Class.forName(Constants.DRIVER_NAME); 45 // 通过驱动管理器类获取数据库连接 46 conn = DriverManager.getConnection(Constants.URL, Constants.USERNAME, Constants.PASSWORD); 47 } catch (Exception e) { 48 e.printStackTrace(); 49 } 50 return conn; 51 } 52 53 /** 54 * 定义执行简单SQL的增,删,改指令 55 * @param sql 调用传入的SQL指令 56 * @param objects 执行SQL指令需要的参数 57 * @return int 返回方法操作后受影响的行数 58 */ 59 public static int executeMyUpdate(String sql,Object... objects) { 60 61 // 定义接受受影响行数的变量 62 int row = 0; 63 // 定义连接对象句柄 64 Connection conn = null; 65 // 定义编译对象句柄 66 PreparedStatement pst = null; 67 68 // 通过调用本类中的获取连接对象 69 conn = getConn(); 70 71 try { 72 // 通过连接对象创建编译对象 73 pst = conn.prepareStatement(sql); 74 // 设置SQL命令所需的参数 75 if(objects != null) { 76 for(int i =0 ;i<objects.length;i++) { 77 pst.setObject(i+1, objects[i]); 78 } 79 } 80 81 // 执行SQL指令并处理返回结果 82 row = pst.executeUpdate(); 83 } catch (Exception e) { 84 e.printStackTrace(); 85 } finally { 86 closeObjects(pst,conn); 87 } 88 89 // 返回受影响行数 90 return row; 91 } 92 93 /** 94 * 定义执行简单查询语句的通用方法 95 * @param sql 调用传入查询的SQL指令 96 * @param objects 查询所需参数 97 * @return List<Map<String,Object>> 返回查询构建集合对象 98 */ 99 public static List<Map<String,Object>> executeQuery(String sql,Object...objects) { 100 // 定义表集合对象 101 List<Map<String,Object>> table = new ArrayList<Map<String,Object>>(); 102 // 定义连接对象句柄 103 Connection conn = null; 104 // 定义编译对象句柄 105 PreparedStatement pst = null; 106 // 定义结果集句柄 107 ResultSet rs = null; 108 109 // 通过调用本类中的获取连接对象 110 conn = getConn(); 111 112 try { 113 // 通过连接对象创建预编译对象 114 pst = conn.prepareStatement(sql); 115 // 为查询编译对象设置参数 116 if(objects != null) { 117 for(int i=0;i<objects.length;i++) { 118 pst.setObject(i+1, objects[i]); 119 } 120 } 121 // 通过编译对象执行SQL命令 122 rs = pst.executeQuery(); 123 124 // 判断结果是否为空 125 if(rs != null) { 126 // 把得到结果集转化为一张虚拟表 127 ResultSetMetaData rsd = rs.getMetaData(); 128 // 得到查询表有多少个字段(列) 129 int count = rsd.getColumnCount(); 130 131 // 得到当前遍历的行Map(key,value) 132 while(rs.next()) { 133 // 定义存储行的Map集合对象 134 Map<String,Object> row = new HashMap<String,Object>(); 135 // 循环列 136 /* userId(key) userName userPass userRemark 137 ----------- -------------------- ------------------------------ 138 10002 (value) normal 123 normal */ 139 /* 140 * rsd.getColumnName(i+1) 得到当前遍历行对应列的名称 141 */ 142 for(int i=0;i<count;i++) { 143 row.put(rsd.getColumnName(i+1), rs.getObject(rsd.getColumnName(i+1))); 144 } 145 146 // 把每次遍历的行存储到表集合中 147 table.add(row); 148 } 149 } 150 } catch (Exception e) { 151 e.printStackTrace(); 152 } finally { 153 closeObjects(rs,pst,conn); 154 } 155 156 return table; 157 } 158 159 /** 160 * 释放操作对象的方法 161 * @param objects 需要释放对象的列表 162 */ 163 private static void closeObjects(Object...objects) { 164 if(objects != null) { 165 for(Object param : objects) { 166 try { 167 if(param instanceof ResultSet) { 168 ((ResultSet)param).close(); 169 } 170 171 if(param instanceof PreparedStatement) { 172 ((PreparedStatement)param).close(); 173 } 174 175 if(param instanceof Connection) { 176 Connection conn = ((Connection)param); 177 if(!conn.isClosed()) { 178 conn.close(); 179 conn = null; 180 } 181 } 182 } catch (Exception e) { 183 e.printStackTrace(); 184 } 185 } 186 } 187 } 188 189 }
时间: 2024-11-05 16:41:56