[原创] Java JDBC连接数据库,反射创建实体类对象并赋值数据库行记录(支持存储过程)

1、SqlHelper.java

  1 import java.lang.reflect.*;
  2 import java.sql.*;
  3 import java.util.*;
  4 
  5 public class SqlHelper {
  6     // SQL Server
  7     /**
  8      * JDBC驱动名称
  9      */
 10     public static final String CLASS_NAME = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
 11     /**
 12      * 数据库连库字符串
 13      */
 14     public static final String URL = "jdbc:sqlserver://192.168.1.254:1433;databaseName=BBSDB";
 15     /**
 16      * 用户名
 17      */
 18     public static final String UID = "sa";
 19     /**
 20      * 密码
 21      */
 22     public static final String PWD = "";
 23     /**
 24      * JDBC驱动类型
 25      */
 26     public static Class CLS = null;
 27 
 28     // Oracle
 29     // public static final String CLASS_NAME =
 30     // "oracle.jdbc.driver.OracleDriver";
 31     // public static final String URL =
 32     // "jdbc:oracle:thin:@localhost:1522:accp11g";
 33     // public static final String UID = "system";
 34     // public static final String PWD = "manager";
 35     /**
 36      * 获取数据库连接对象
 37      * 
 38      * @return
 39      * @throws ClassNotFoundException
 40      * @throws SQLException
 41      */
 42     public static Connection getConnection() throws ClassNotFoundException,
 43             SQLException {
 44         if (CLS == null) {
 45             CLS = Class.forName(CLASS_NAME);
 46         }
 47         return DriverManager.getConnection(URL, UID, PWD);
 48     }
 49 
 50     /**
 51      * 执行SQL语句不返回查询的操作,返回受影响的行数
 52      * 
 53      * @param sql
 54      *            SQL语句
 55      * @return 受影响的行数
 56      * @throws ClassNotFoundException
 57      * @throws SQLException
 58      */
 59     public static int executeNonQuery(String sql) {
 60         int result = -1;
 61         Connection con = null;
 62         PreparedStatement ps = null;
 63         try {
 64             con = getConnection();
 65             ps = con.prepareStatement(sql);
 66             result = ps.executeUpdate();
 67         } catch (Exception e) {
 68             e.printStackTrace();
 69         } finally {
 70             close(con, ps, null);
 71         }
 72         return result;
 73     }
 74 
 75     /**
 76      * 执行Insert语句,返回Insert成功之后标识列的值
 77      * 
 78      * @param sql
 79      * @return
 80      * @throws ClassNotFoundException
 81      * @throws SQLException
 82      */
 83     public static int executeIdentity(String sql) {
 84         int identity = -1;
 85         Connection con = null;
 86         Statement ps = null;
 87         ResultSet rs = null;
 88         try {
 89             con = getConnection();
 90             ps = con.createStatement();
 91             ps.executeUpdate(sql, Statement.RETURN_GENERATED_KEYS);
 92             rs = ps.getGeneratedKeys();
 93             if (rs.next()) {
 94                 // identity = rs.getInt("GENERATED_KEYS");
 95                 identity = rs.getInt(1);
 96             }
 97         } catch (Exception e) {
 98             e.printStackTrace();
 99         } finally {
100             close(con, ps, null);
101         }
102         return identity;
103     }
104 
105     /**
106      * 执行不返回结果集的存储过程
107      * 
108      * @param sql
109      *            存储过程名称
110      * @param params
111      *            存储过程参数
112      * @throws ClassNotFoundException
113      * @throws SQLException
114      */
115     public static void executeNonQuery(String sql, SqlParameter... params) {
116         Connection con = null;
117         CallableStatement cs = null;
118         try {
119             con = getConnection();
120             cs = con.prepareCall(sql);
121             setSqlParameter(cs, params);
122             cs.executeUpdate();
123             getSqlParameter(cs, params);
124         } catch (Exception e) {
125             e.printStackTrace();
126         } finally {
127             close(con, cs, null);
128         }
129     }
130 
131     /**
132      * 执行返回聚合函数的操作
133      * 
134      * @param sql
135      *            含有聚合函数的SQL语句
136      * @return 聚合函数的执行结果
137      * @throws SQLException
138      * @throws ClassNotFoundException
139      */
140     public static int executeScalar(String sql) {
141         int result = -1;
142         Connection con = null;
143         PreparedStatement ps = null;
144         ResultSet rs = null;
145         try {
146             con = getConnection();
147             ps = con.prepareStatement(sql);
148             rs = ps.executeQuery();
149             if (rs.next()) {
150                 result = rs.getInt(1);
151             }
152         } catch (Exception e) {
153             e.printStackTrace();
154         } finally {
155             close(con, ps, rs);
156         }
157         return result;
158     }
159 
160     /**
161      * 执行返回泛型集合的SQL语句
162      * 
163      * @param cls
164      *            泛型类型
165      * @param sql
166      *            查询SQL语句
167      * @return 泛型集合
168      * @throws ClassNotFoundException
169      * @throws SQLException
170      * @throws InstantiationException
171      * @throws IllegalAccessException
172      */
173     public static <T> List<T> executeList(Class<T> cls, String sql) {
174         List<T> list = new ArrayList<T>();
175         Connection con = null;
176         PreparedStatement ps = null;
177         ResultSet rs = null;
178         try {
179             con = getConnection();
180             ps = con.prepareStatement(sql);
181             rs = ps.executeQuery();
182             while (rs.next()) {
183                 T obj = executeResultSet(cls, rs);
184                 list.add(obj);
185             }
186         } catch (Exception e) {
187             e.printStackTrace();
188         } finally {
189             close(con, ps, rs);
190         }
191         return list;
192     }
193 
194     /**
195      * 执行返回泛型集合的存储过程
196      * 
197      * @param cls
198      *            泛型类型
199      * @param sql
200      *            存储过程名称
201      * @param params
202      *            存储过程参数
203      * @return 泛型集合
204      * @throws ClassNotFoundException
205      * @throws SQLException
206      * @throws InstantiationException
207      * @throws IllegalAccessException
208      */
209     public static <T> List<T> executeList(Class<T> cls, String sql,
210             SqlParameter... params) {
211         List<T> list = new ArrayList<T>();
212         Connection con = null;
213         CallableStatement cs = null;
214         ResultSet rs = null;
215         try {
216             con = getConnection();
217             cs = con.prepareCall(sql);
218             setSqlParameter(cs, params);
219             rs = cs.executeQuery();
220             while (rs.next()) {
221                 T obj = executeResultSet(cls, rs);
222                 list.add(obj);
223             }
224         } catch (Exception e) {
225             e.printStackTrace();
226         } finally {
227             close(con, cs, rs);
228         }
229         return list;
230     }
231 
232     /**
233      * 执行返回泛型类型对象的SQL语句
234      * 
235      * @param cls
236      *            泛型类型
237      * @param sql
238      *            SQL语句
239      * @return 泛型类型对象
240      * @throws SQLException
241      * @throws ClassNotFoundException
242      * @throws InstantiationException
243      * @throws IllegalAccessException
244      */
245     public static <T> T executeEntity(Class<T> cls, String sql) {
246         T obj = null;
247         Connection con = null;
248         PreparedStatement ps = null;
249         ResultSet rs = null;
250         try {
251             con = getConnection();
252             ps = con.prepareStatement(sql);
253             rs = ps.executeQuery();
254             while (rs.next()) {
255                 obj = executeResultSet(cls, rs);
256                 break;
257             }
258         } catch (Exception e) {
259             e.printStackTrace();
260         } finally {
261             close(con, ps, rs);
262         }
263         return obj;
264     }
265 
266     /**
267      * 执行返回泛型类型对象的存储过程
268      * 
269      * @param cls
270      *            泛型类型
271      * @param sql
272      *            SQL语句
273      * @param params
274      *            存储过程参数
275      * @return 泛型类型对象
276      * @throws SQLException
277      * @throws ClassNotFoundException
278      * @throws InstantiationException
279      * @throws IllegalAccessException
280      */
281     public static <T> T executeEntity(Class<T> cls, String sql,
282             SqlParameter... params) {
283         T obj = null;
284         Connection con = null;
285         CallableStatement cs = null;
286         ResultSet rs = null;
287         try {
288             con = getConnection();
289             cs = con.prepareCall(sql);
290             setSqlParameter(cs, params);
291             rs = cs.executeQuery();
292             while (rs.next()) {
293                 obj = executeResultSet(cls, rs);
294                 break;
295             }
296         } catch (Exception e) {
297             e.printStackTrace();
298         } finally {
299             close(con, cs, rs);
300         }
301         return obj;
302     }
303 
304     /**
305      * 将一条记录转成一个对象
306      * 
307      * @param cls
308      *            泛型类型
309      * @param rs
310      *            ResultSet对象
311      * @return 泛型类型对象
312      * @throws InstantiationException
313      * @throws IllegalAccessException
314      * @throws SQLException
315      */
316     private static <T> T executeResultSet(Class<T> cls, ResultSet rs)
317             throws InstantiationException, IllegalAccessException, SQLException {
318         T obj = cls.newInstance();
319         ResultSetMetaData rsm = rs.getMetaData();
320         int columnCount = rsm.getColumnCount();
321         // Field[] fields = cls.getFields();
322         Field[] fields = cls.getDeclaredFields();
323         for (int i = 0; i < fields.length; i++) {
324             Field field = fields[i];
325             String fieldName = field.getName();
326             for (int j = 1; j <= columnCount; j++) {
327                 String columnName = rsm.getColumnName(j);
328                 if (fieldName.equalsIgnoreCase(columnName)) {
329                     Object value = rs.getObject(j);
330                     field.setAccessible(true);
331                     field.set(obj, value);
332                     break;
333                 }
334             }
335         }
336         return obj;
337     }
338 
339     /**
340      * 设置存储过程参数名称,参数值,参数方向
341      * 
342      * @param cs
343      * @param params
344      * @throws SQLException
345      */
346     private static void setSqlParameter(CallableStatement cs,
347             SqlParameter... params) throws SQLException {
348         if (params != null) {
349             for (SqlParameter param : params) {
350                 if (param.OutPut) {
351                     String paramName = param.Name;
352                     if (paramName == null || paramName.equals("")) {
353                         cs.registerOutParameter(1, param.Type);// 设置返回类型参数
354                     } else {
355                         cs.registerOutParameter(paramName, param.Type);// 设置输出类型参数
356                     }
357                 } else {
358                     cs.setObject(param.Name, param.Value);// 设置输入类型参数
359                 }
360             }
361         }
362     }
363 
364     /**
365      * 得到存储过程参数执行结果
366      * 
367      * @param cs
368      * @param params
369      * @throws SQLException
370      */
371     private static void getSqlParameter(CallableStatement cs,
372             SqlParameter... params) throws SQLException {
373         for (SqlParameter param : params) {
374             if (param.OutPut) {
375                 String paramName = param.Name;
376                 if (paramName == null || paramName.equals("")) {
377                     param.Value = cs.getObject(1);// 返回类型参数值
378                 } else {
379                     param.Value = cs.getObject(paramName);// 输出类型参数值
380                 }
381             }
382         }
383     }
384 
385     /**
386      * 关闭JDBC对象,释放资源。
387      * 
388      * @param con
389      *            连接对象
390      * @param ps
391      *            命令对象
392      * @param rs
393      *            结果集对象
394      * @throws SQLException
395      */
396     private static void close(Connection con, Statement ps, ResultSet rs) {
397         try {
398             rs.close();
399             if (rs != null) {
400 
401                 rs = null;
402             }
403             if (ps != null) {
404                 ps.close();
405                 ps = null;
406             }
407             if (con != null) {
408                 con.close();
409                 con = null;
410             }
411         } catch (SQLException e) {
412             // TODO Auto-generated catch block
413             e.printStackTrace();
414         }
415     }
416 }
SqlHelper

2、SqlParameter.java

 1 /**
 2  * 存储过程参数类型
 3  * @author Administrator
 4  *
 5  */
 6 public class SqlParameter {
 7     /**
 8      * 参数名称
 9      */
10     public String Name;
11     /**
12      * 参数值
13      */
14     public Object Value;
15     /**
16      * true表示参数为输出类型
17      */
18     public boolean OutPut;
19     /**
20      * 参数类型
21      */
22     public int Type;
23     /**
24      * 输入类型参数的构造函数
25      * @param name 存储过程 输入类型 参数名称
26      * @param value 存储过程 输入类型 参数值
27      */
28     public SqlParameter(String name,Object value){
29         this.Name = name;
30         this.Value= value;
31     }
32     /**
33      * 输出类型参数的构造函数
34      * @param type 存储过程 输出类型 参数类型
35      * @param name 存储过程 输出类型 参数名称
36      */
37     public SqlParameter(int type,String name){
38         this.Name = name;
39         this.OutPut = true;
40         this.Type = type;
41     }
42     /**
43      * 返回类型参数的构造函数
44      * @param type 存储过程 返回类型
45      */
46     public SqlParameter(int type){
47         this.Name = "";
48         this.OutPut = true;
49         this.Type = type;
50     }
51 }
SqlParameter

3、Program.java

 1 import java.util.List;
 2 
 3 public class Program {
 4 
 5     public static void main(String[] args) {
 6         // TODO Auto-generated method stub
 7         
 8         String sql = "INSERT INTO [dbo].[UserInfo] ([UserName] ,[LoginName] ,[LoginPwd] ,[UserSex] ,[Birthday]) VALUES ('%s','%s','%s','%s','%s')";
 9         sql = String.format(sql, "wyp1","wyp1","wyp1","1","1981-04-21");
10         int identyValue = SqlHelper.executeIdentity(sql);
11         System.out.println(String.format("Identity Value:%d",identyValue));
12         
13 //        List<UserInfo> list = SqlHelper.executeList(UserInfo.class, "select * from UserInfo");
14 //        for (UserInfo userInfo : list) {
15 //            System.out.println(String.format(
16 //                    "UserInfoId:%d,UserName:%s,LoginName:%s,LoginPwd:%s,UserSex:%s,Birthday:%s",
17 //                    userInfo.getUserInfoId(),userInfo.getUserName(),userInfo.getLoginName(),userInfo.getLoginPwd(),userInfo.getUserSex()?"男":"女",DateHelper.toString(userInfo.getBirthday())));
18 //        }
19         
20 //        SqlParameter param = new SqlParameter("sortField", "[UserInfoId] DESC");
21 //        List<UserInfo> list = SqlHelper.executeList(UserInfo.class, "{call dbo.UserInfoSelectAll(?)}",param);
22 //        for (UserInfo userInfo : list) {
23 //            System.out.println(String.format(
24 //                    "UserInfoId:%d,UserName:%s,LoginName:%s,LoginPwd:%s,UserSex:%s,Birthday:%s",
25 //                    userInfo.getUserInfoId(),userInfo.getUserName(),userInfo.getLoginName(),userInfo.getLoginPwd(),userInfo.getUserSex()?"男":"女",DateHelper.toString(userInfo.getBirthday())));
26 //        }
27         
28 //        SqlParameter paramSortField = new SqlParameter("sortField", "[UserInfoId] DESC");
29 //        SqlParameter paramPageSize = new SqlParameter("pageSize", 10);
30 //        SqlParameter paramPageIndex = new SqlParameter("pageIndex", 1);
31 //        SqlParameter paramWhere = new SqlParameter("where", "1=1");
32 //        List<UserInfo> list = SqlHelper.executeList(UserInfo.class, "{call dbo.UserInfoSelectByPagerParams(?,?,?,?)}",paramSortField,paramPageSize,paramPageIndex,paramWhere);
33 //        for (UserInfo userInfo : list) {
34 //            System.out.println(String.format(
35 //                    "UserInfoId:%d,UserName:%s,LoginName:%s,LoginPwd:%s,UserSex:%s,Birthday:%s",
36 //                    userInfo.getUserInfoId(),userInfo.getUserName(),userInfo.getLoginName(),userInfo.getLoginPwd(),userInfo.getUserSex()?"男":"女",DateHelper.toString(userInfo.getBirthday())));
37 //        }
38         
39 //        SqlParameter paramWhere = new SqlParameter("where", "1=1");
40 //        SqlParameter paramRecordCount = new SqlParameter(java.sql.Types.INTEGER, "recordCount");
41 //        SqlHelper.executeNonQuery("{call dbo.UserInfoCountByWhere(?,?)}", paramWhere,paramRecordCount);
42 //        if(paramRecordCount.Value instanceof Integer){
43 //            Integer recordCount = (Integer)paramRecordCount.Value;
44 //            System.out.println(String.format("RecordCount:%d",recordCount));
45 //        }
46         
47 //        SqlParameter paramWhere = new SqlParameter("where", "1=1");
48 //        SqlParameter paramRecordCount = new SqlParameter(java.sql.Types.INTEGER, "recordCount");
49 //        SqlParameter paramReturnValue = new SqlParameter(java.sql.Types.INTEGER);
50 //        SqlHelper.executeNonQuery("{? = call dbo.UserInfoCountByWhere(?,?)}", paramReturnValue,paramWhere,paramRecordCount);
51 //        if(paramRecordCount.Value instanceof Integer){
52 //            Integer recordCount = (Integer)paramRecordCount.Value;
53 //            System.out.println(String.format("RecordCount:%d",recordCount));
54 //        }
55 //        if(paramReturnValue.Value instanceof Integer){
56 //            Integer returnValue = (Integer)paramReturnValue.Value;
57 //            System.out.println(String.format("ReturnValue:%d",returnValue));
58 //        }
59     }
60 
61 }
Program
原文地址:https://www.cnblogs.com/qiyebao/p/3203938.html