• [原创] 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
  • 相关阅读:
    大牛思考方式
    web面试题大全
    github上最全的资源教程-前端涉及的所有知识体系
    java switch语句注意的事项
    Lucene Payload 的研究与应用
    hive array、map、struct使用
    黑马程序员--正则表达式
    [置顶] 读源码练内功(一):guava之eventbus
    自定义Java Annotations实例以及用Java Reflection来解析自定义的Annotation
    Solr之NamedList 简单介绍与实例解析
  • 原文地址:https://www.cnblogs.com/qiyebao/p/3203938.html
Copyright © 2020-2023  润新知