首页 > 代码库 > JDBC连接SQLServer数据库(增强封装版)
JDBC连接SQLServer数据库(增强封装版)
1 package dao; 2 3 import java.lang.reflect.Field; 4 import java.lang.reflect.Method; 5 import java.sql.Connection; 6 import java.sql.DriverManager; 7 import java.sql.PreparedStatement; 8 import java.sql.ResultSet; 9 import java.sql.SQLException; 10 import java.util.ArrayList; 11 import java.util.List; 12 13 public class BaseDAO { 14 15 // 驱动类全名(包名.类名) 16 private static final String DRIVER = "com.microsoft.sqlserver.jdbc.SQLServerDriver"; 17 // 连接的URL 18 private static final String URL = "jdbc:sqlserver://localhost\\sqlexpress:1433;DatabaseName=bookdb"; 19 // 登录SQLserver用户名和密码 20 private static final String USERNAME = "sa"; 21 private static final String PWD = "ghp418512"; 22 23 // 数据库对象声明 24 private Connection con = null; 25 private PreparedStatement pst = null; 26 private ResultSet rs = null; 27 28 /** 29 * 加载驱动,建立连接 30 * 31 * @throws ClassNotFoundException 32 * @throws SQLException 33 */ 34 private void getConnection() throws ClassNotFoundException, SQLException { 35 // 加载驱动 36 Class.forName(DRIVER); 37 // 建立连接 38 con = DriverManager.getConnection(URL, USERNAME, PWD); 39 } 40 41 /** 42 * 执行查询 43 * 44 * @param sql 45 * 执行的参数化SQL语句 select * from where name=? and pwd=? 46 * @param params 47 * Object数组,封装所有SQL语句参数,顺序与SQL语句的参数顺序一致,new Object[]{name,pwd} 48 * @return ResultSet 返回执行后的结果集 49 */ 50 public ResultSet execQuery(String sql, Object[] params) { 51 try { 52 getConnection(); 53 54 pst = con.prepareStatement(sql); 55 56 setPrepareStatementParams(params); 57 58 rs = pst.executeQuery(); 59 60 } catch (SQLException e) { 61 e.printStackTrace(); 62 } catch (ClassNotFoundException e) { 63 e.printStackTrace(); 64 } 65 return rs; 66 } 67 68 /** 69 * 执行SQL查询语句,并返回泛型集合List<T> 调用示例:<br/> 70 * String sql="select * from book"; <br /> 71 * List<Book> bookList=super.execQueryAndPackagingList(sql, null, new 72 * Book()); 73 * 74 * @param sql 75 * 要执行的SQL查询语句,必须有结果返回,并与实体类型T匹配 76 * @param params 77 * SQL语句的参数 78 * @param t 79 * 封装的实体类型对象 80 * @return 泛型集合List<T> 81 */ 82 public <T> List<T> execQueryAndPackagingList(String sql, Object[] params, 83 T t) { 84 rs = execQuery(sql, params); 85 List<T> tlist = null; 86 try { 87 88 tlist = setAllSetters(t, rs); 89 90 } catch (SQLException e) { 91 e.printStackTrace(); 92 } finally { 93 closeAll(); 94 } 95 return tlist; 96 } 97 98 /** 99 * 执行增加、删除、修改SQL操作100 * 101 * @param sql102 * 执行的参数化SQL语句103 * @param params104 * Object数组,封装所有SQL语句参数105 * @return int 受影响的行数,-1表示出现异常106 */107 public int execUpdate(String sql, Object[] params) {108 109 try {110 getConnection();111 pst = con.prepareStatement(sql);112 113 setPrepareStatementParams(params);114 115 int affectedRows = pst.executeUpdate();116 return affectedRows;117 } catch (ClassNotFoundException e) {118 e.printStackTrace();119 } catch (SQLException e) {120 e.printStackTrace();121 } finally {122 closeAll();123 }124 return -1;125 126 }127 128 /**129 * 为PrepareStatement设置参数130 * 131 * @param params132 * 参数数组133 * @throws SQLException134 */135 private void setPrepareStatementParams(Object[] params) throws SQLException {136 if (params != null) {137 for (int i = 0; i < params.length; i++) {138 pst.setObject(i + 1, params[i]);139 }140 }141 }142 143 /**144 * 关闭Connection,PrepareStatement,Result145 */146 public void closeAll() {147 try {148 149 if (rs != null) {150 rs.close();151 }152 if (pst != null) {153 pst.close();154 }155 if (con != null) {156 con.close();157 }158 159 } catch (SQLException e) {160 e.printStackTrace();161 }162 }163 164 /**165 * 将查询结果(ResultSet)自动封装为泛型集合(List<T>)166 * 167 * @param ob168 * 封装的实体,其属性名必须与数据字段名一致,并提供有set***,get***方法169 * @param rs170 * 要封装的ResultSet171 * @return 泛型List集合(List<T>172 * @throws SQLException173 * 此方法可能抛出SQLException异常174 */175 private <T> List<T> setAllSetters(T ob, ResultSet rs) throws SQLException {176 177 Class cls = ob.getClass();178 List<T> tlist = new ArrayList<T>();179 T t = null;180 181 while (rs.next()) {182 183 try {184 t = (T) ob.getClass().newInstance();185 } catch (InstantiationException e1) {186 187 e1.printStackTrace();188 } catch (IllegalAccessException e1) {189 190 e1.printStackTrace();191 }192 193 for (Field field : cls.getDeclaredFields()) {194 for (Method method : cls.getMethods()) {195 if ((method.getName().startsWith("set"))196 && (method.getName().length() == (field.getName()197 .length() + 3))) {198 if (method.getName().toLowerCase()199 .endsWith(field.getName().toLowerCase())) {200 try {201 method.setAccessible(true);202 if (field.getType().getSimpleName()203 .toLowerCase().endsWith("integer"))204 method.invoke(t, rs.getInt(field.getName()205 .toLowerCase()));206 else if (field.getType().getSimpleName()207 .toLowerCase().endsWith("long"))208 method.invoke(t, rs.getLong(field.getName()209 .toLowerCase()));210 else if (field.getType().getSimpleName()211 .toLowerCase().endsWith("string"))212 method.invoke(t, rs.getString(field213 .getName().toLowerCase()));214 else if (field.getType().getSimpleName()215 .toLowerCase().endsWith("boolean"))216 method.invoke(t, rs.getBoolean(field217 .getName().toLowerCase()));218 else if (field.getType().getSimpleName()219 .toLowerCase().endsWith("timestamp"))220 method.invoke(t, rs.getTimestamp(field221 .getName().toLowerCase()));222 else if (field.getType().getSimpleName()223 .toLowerCase().endsWith("date"))224 method.invoke(t, rs.getDate(field.getName()225 .toLowerCase()));226 else if (field.getType().getSimpleName()227 .toLowerCase().endsWith("double"))228 method.invoke(t, rs.getDouble(field229 .getName().toLowerCase()));230 else if (field.getType().getSimpleName()231 .toLowerCase().endsWith("float"))232 method.invoke(t, rs.getFloat(field233 .getName().toLowerCase()));234 else if (field.getType().getSimpleName()235 .toLowerCase().endsWith("time"))236 method.invoke(t, rs.getTime(field.getName()237 .toLowerCase()));238 else239 method.invoke(t, rs.getObject(field240 .getName().toLowerCase()));241 } catch (Exception e) {242 e.printStackTrace();243 ;244 }245 }246 }247 }248 }249 tlist.add(t);250 }251 return tlist;252 }253 }
JDBC连接SQLServer数据库(增强封装版)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。