• JDBC操作封装


    这两天学习了一下jdbc的封装,依据的是下面这篇

    http://wenku.baidu.com/link?url=FaFDmQouYkKO24ApATHYmA5QzUcj-UE-7RSSZaBWPqkKB8i13eYw2LGGEsgs_BRyBf7vB_zgB0vBxFXvhXhmLzBfBEPzPCvMvzMvesUwOzW

    然后在它的基础上作了修改,简化参数,做了数据类型方面的休整。还不算完全成型,因为对“0”的处理还没有好的解决方案。下面贴出代码。

    先贴一个Student实体类

      1 package com.some.entity;
      2 
      3 import java.io.Serializable;
      4 import java.sql.Date;
      5 
      6 public class Student implements Serializable {
      7     private int id;
      8     private String stuNumber;
      9     private String stuPassword;
     10     private String stuName;
     11     private String stuSex;
     12     private String stuIdentification;
     13     private String stuIsGat;
     14     private String stuPhone;
     15     private int departmentId;
     16     private int majorId;
     17     private String gradeNow;
     18     private int nationMark;
     19     private String bithday;// 格式为2015/10/13
     20     private String address;
     21     private String politics;
     22 
     23     public int getId() {
     24         return id;
     25     }
     26 
     27     public void setId(int id) {
     28         this.id = id;
     29     }
     30 
     31     public String getStuNumber() {
     32         return stuNumber;
     33     }
     34 
     35     public void setStuNumber(String stuNumber) {
     36         this.stuNumber = stuNumber;
     37     }
     38 
     39     public String getStuPassword() {
     40         return stuPassword;
     41     }
     42 
     43     public void setStuPassword(String stuPassword) {
     44         this.stuPassword = stuPassword;
     45     }
     46 
     47     public String getStuName() {
     48         return stuName;
     49     }
     50 
     51     public void setStuName(String stuName) {
     52         this.stuName = stuName;
     53     }
     54 
     55     public String getStuSex() {
     56         return stuSex;
     57     }
     58 
     59     public void setStuSex(String stuSex) {
     60         this.stuSex = stuSex;
     61     }
     62 
     63     public String getStuIdentification() {
     64         return stuIdentification;
     65     }
     66 
     67     public void setStuIdentification(String stuIdentification) {
     68         this.stuIdentification = stuIdentification;
     69     }
     70 
     71     public String getStuIsGat() {
     72         return stuIsGat;
     73     }
     74 
     75     public void setStuIsGat(String stuIsGat) {
     76         this.stuIsGat = stuIsGat;
     77     }
     78 
     79     public String getStuPhone() {
     80         return stuPhone;
     81     }
     82 
     83     public void setStuPhone(String stuPhone) {
     84         this.stuPhone = stuPhone;
     85     }
     86 
     87     public int getDepartmentId() {
     88         return departmentId;
     89     }
     90 
     91     public void setDepartmentId(int departmentId) {
     92         this.departmentId = departmentId;
     93     }
     94 
     95     public int getMajorId() {
     96         return majorId;
     97     }
     98 
     99     public void setMajorId(int majorId) {
    100         this.majorId = majorId;
    101     }
    102 
    103     public String getGradeNow() {
    104         return gradeNow;
    105     }
    106 
    107     public void setGradeNow(String gradeNow) {
    108         this.gradeNow = gradeNow;
    109     }
    110 
    111     public int getNationMark() {
    112         return nationMark;
    113     }
    114 
    115     public void setNationMark(int nationMark) {
    116         this.nationMark = nationMark;
    117     }
    118 
    119     public String getBithday() {
    120         return bithday;
    121     }
    122 
    123     public void setBithday(String bithday) {
    124         this.bithday = bithday;
    125     }
    126 
    127     public String getAddress() {
    128         return address;
    129     }
    130 
    131     public void setAddress(String address) {
    132         this.address = address;
    133     }
    134 
    135     public String getPolitics() {
    136         return politics;
    137     }
    138 
    139     public void setPolitics(String politics) {
    140         this.politics = politics;
    141     }
    142 }
    Student.java

    然后是数据库连接工具类

     1 package com.sql.util;
     2 
     3 import java.sql.DriverManager;
     4 import java.sql.Connection;
     5 import java.sql.ResultSet;
     6 import java.sql.SQLException;
     7 
     8 import com.mysql.jdbc.PreparedStatement;
     9 
    10 public class DatabaseConnection {
    11     private static final String driver = "com.mysql.jdbc.Driver";// 数据库驱动
    12     private static final String url = "jdbc:mysql://localhost:3306/sports_test";// 链接数据库名称
    13                                                                             // ,localhost替换成域名
    14     private static final String user = "root";// mysql的登陆用户名
    15     private static final String password = "1234";// mysql的登陆密码
    16     private Connection conn = null;
    17 
    18     public DatabaseConnection() throws Exception {// 在构造方法中进行数据库连接
    19         try {
    20             Class.forName(driver);//实现静态方法
    21             this.conn = DriverManager.getConnection(url, user, password);
    22         } catch (Exception e) {
    23             e.printStackTrace();
    24         }
    25     }
    26 
    27     public Connection getConnection() {
    28         return this.conn;
    29     }
    30 
    31     public static void closeConnection(Connection conn) {
    32         if (conn != null) {
    33             try {
    34                 conn.close();
    35             } catch (SQLException e) {
    36                 e.printStackTrace();
    37             }
    38         }
    39     }
    40 
    41     public static void closePreparedStatement(PreparedStatement pstmt) {
    42         if (pstmt != null) {
    43             try {
    44                 pstmt.close();
    45             } catch (SQLException e) {
    46                 e.printStackTrace();
    47             }
    48         }
    49     }
    50 
    51     public static void closeResultSet(ResultSet rs) {
    52         if (rs != null) {
    53             try {
    54                 rs.close();
    55             } catch (SQLException e) {
    56                 e.printStackTrace();
    57             }
    58         }
    59     }
    60 }
    DatabaseConnection.java

    顺便贴一个简易hash函数

     1 package com.change.util;
     2 
     3 import java.security.MessageDigest;
     4 import java.security.NoSuchAlgorithmException;
     5 
     6 public final class GetHash {
     7     public static String getMD5(String str){
     8         String hashedStr=null;
     9         try{
    10             MessageDigest md=MessageDigest.getInstance("MD5");
    11             md.update(str.getBytes());
    12             byte ss[]=md.digest();
    13             hashedStr=bytes2String(ss);
    14         }catch(NoSuchAlgorithmException e){
    15             
    16         }
    17         return hashedStr;
    18     }
    19     
    20     private static String bytes2String(byte[] aa){
    21         String hash="";
    22         for(int i=0;i<aa.length;i++){
    23             int temp;
    24             if(aa[i]<0){
    25                 temp=256+aa[i];
    26             }else{
    27                 temp=aa[i];
    28             }
    29             if(temp<16){
    30                 hash+="0";
    31             }
    32             hash+=Integer.toString(temp,16);
    33         }
    34         hash=hash.toUpperCase();
    35         return hash;
    36     }
    37     
    38 //    public static void main(String[] args) {
    39 //        String a="123456";
    40 //        String b="1234567";
    41 //        String c="fast";
    42 //        String hashA=GetHash.getMD5(a);
    43 //        String hashB=GetHash.getMD5(b);
    44 //        String hashC=GetHash.getMD5(c);
    45 //        System.out.println(hashA);
    46 //        System.out.println(hashB);
    47 //        System.out.println(hashC);
    48 //        //E10ADC3949BA59ABBE56E057F20F883E
    49 //        //FCEA920F7412B5DA7BE0CF42B8C93759
    50 //        //31D4541B8E926A24F0C9B835B68CFDF3
    51 //    }
    52 }
    GetHash.java

    顺便贴一个转换编码的类,有时做下载功能的时候需要用到

     1 package com.change.util;
     2 
     3 import java.io.UnsupportedEncodingException;
     4 
     5 public class ChangeISO {
     6     public static String parseGBK(String sIn) {
     7         if ((sIn == null) || (sIn.equals(""))) {
     8             return sIn;
     9         }
    10         try {
    11             return new String(sIn.getBytes("GBK"), "ISO-8859-1");
    12         } catch (UnsupportedEncodingException usex) {
    13         }
    14         return sIn;
    15     }
    16 
    17     public static String parseUTF8(String sIn) {
    18         if ((sIn == null) || (sIn.equals(""))) {
    19             return sIn;
    20         }
    21         try {
    22             return new String(sIn.getBytes("UTF-8"), "ISO-8859-1");
    23         } catch (UnsupportedEncodingException usex) {
    24         }
    25         return sIn;
    26     }
    27 }
    Change

    最后就是jdbc增删查改的封装了,有了这个感觉方便很多,不需要像以前一个操作写一大坨函数,我真是太笨了= =

      1 package com.sql.util;
      2 
      3 import java.security.Timestamp;
      4 import java.sql.Connection;
      5 import java.sql.PreparedStatement;
      6 import java.sql.ResultSet;
      7 import java.sql.SQLException;
      8 import java.util.ArrayList;
      9 import java.util.Date;
     10 import java.util.List;
     11 import java.lang.reflect.Field;
     12 import java.lang.reflect.Method;
     13 import java.math.BigDecimal;
     14 
     15 import com.change.util.GetHash;
     16 import com.some.entity.Student;
     17 
     18 /**
     19  * @see 这个类用于封装sql操作
     20  */
     21 public class DatabaseOperator {
     22 
     23     /**
     24      * @param conn
     25      *            Connection对象
     26      * @param obj
     27      *            vo对象(实体)
     28      * @param sql
     29      *            StringBuilder 对象
     30      * @return List集合
     31      * @throws Exception
     32      */
     33 
     34     public static List<?> getSelectList(Connection conn, Object obj,
     35             StringBuilder sql) {
     36         int isFirstParameter = 0;
     37         // 用于装入vo对象中设置属性值的真实属性值
     38         List<Object> fieldValue = new ArrayList<>();
     39         // 返回一个list集合,装的是执行过查询的集合,集合resultList装的一般是vo对象
     40         List<Object> resultList = new ArrayList<>();
     41 
     42         try {
     43             // 获取对象的所属的类
     44             Class<?> c = obj.getClass();
     45             // 取得本类的全部属性
     46             Field[] f = c.getDeclaredFields();
     47 
     48             for (int i = 0; i < f.length; i++) {
     49                 String name = f[i].getName();
     50                 String get = DatabaseOperator.getGos("get", name);
     51 
     52                 // Java 反射机制中 getMethod()和getDeclaredMethod()区别
     53                 // getMethods()和getDeclaredMethods()区别
     54                 // 前者只返回共有方法 后者返回全部3种(不包括继承)
     55                 Method m = c.getDeclaredMethod(get);
     56                 Object value = m.invoke(obj);
     57                 if (value != null && value != ""
     58                         && !String.valueOf(value).equals("0")) {
     59                     System.out.println(value);
     60                     // 如果是第一个条件参数,不需要加上and
     61                     if (isFirstParameter == 0) {
     62                         sql.append(" " + name + " = ?");
     63                         isFirstParameter++;
     64                         // 填入要附加的条件参数
     65                         fieldValue.add(value);
     66                     } else {
     67                         sql.append(" and " + name + " = ?");
     68                         // 填入要附加的条件参数
     69                         fieldValue.add(value);
     70                     }
     71 
     72                 }
     73             }
     74             System.out.println(sql);
     75             PreparedStatement ps = conn.prepareStatement(sql.toString());
     76             for (int i = 0; i < fieldValue.size(); i++) {
     77                 // System.out.println(fieldValue.size());
     78                 // System.out.println(fieldValue.get(i));
     79                 ps.setObject(i + 1, fieldValue.get(i));
     80             }
     81             // 定义结果集
     82             ResultSet rs = ps.executeQuery();
     83             while (rs.next()) {
     84                 Object o = c.newInstance();
     85                 // f是本类全部属性
     86                 for (int i = 0; i < f.length; i++) {
     87                     String name = f[i].getName();
     88                     // System.out.println(name);
     89                     String set = DatabaseOperator.getGos("set", name);
     90                     // System.out.println(set);
     91                     // 获取类的set方法
     92                     // System.out.println(f[i].getType());
     93                     Method m = c.getDeclaredMethod(set, f[i].getType());
     94                     m.setAccessible(true);
     95                     // System.out.println(m.getName());
     96                     Object value = rs.getObject(i + 1);
     97                     // System.out.println(value + "======");
     98                     if (value != null) {
     99                         // String r = f[i].getType().toString();
    100                         // System.out.println(r);
    101                         String rsType = value.getClass().getSimpleName();
    102                         // System.out.println(rsType + "++++");
    103 
    104                         // 判断从数据库读出的数据的数据类型,这里比较奇怪
    105                         if (rsType.equals("Long")) {
    106                             m.invoke(o, Integer.parseInt(value.toString()));
    107                         } else if (rsType.equals("Integer")) {
    108                             m.invoke(o, value);
    109                         } else if (rsType.equals("Double")) {
    110                             m.invoke(o, ((BigDecimal) value).doubleValue());
    111                         } else if (rsType.equals("Float")) {
    112                             m.invoke(o, ((BigDecimal) value).floatValue());
    113                         } else if (rsType.equals("Date")
    114                                 || rsType.equals("Timestamp")) {
    115                             // System.out.println("da");
    116                             if (rsType.equals("Date")) {
    117                                 m.invoke(o, ((Date) value).toString());
    118                             } else {
    119                                 m.invoke(o, ((Timestamp) value).toString());
    120                             }
    121                         } else if (rsType.equals("String")) {
    122                             m.invoke(o, value);
    123                         } else {
    124                             // System.out.println("未知");
    125                         }
    126                     }
    127                 }
    128                 resultList.add(o);
    129             }
    130             return resultList;
    131 
    132         } catch (Exception e) {
    133             e.printStackTrace();
    134         }
    135 
    136         return resultList;
    137     }
    138 
    139     /**
    140      * 
    141      * @param conn
    142      *            Connection对象
    143      * @param sql1
    144      *            StringBuilder 可以增加长度,用于拼接指定的需要插入的列名
    145      * @param obj
    146      *            vo对象
    147      * @return int 0,1执行结果
    148      * @throws Exception
    149      */
    150     public static int doInsert(Connection conn, StringBuilder sql1, Object obj)
    151             throws Exception {
    152         Class<?> c = obj.getClass();
    153         Field[] f = c.getDeclaredFields();
    154         // StringBuilder 可以增加长度,用于拼接values后面的属性值
    155         StringBuilder sql2 = new StringBuilder();
    156         // 用于装入vo对象中设置属性值的真实属性值
    157         List<Object> fieldValue = new ArrayList<>();
    158 
    159         sql1.append("(");
    160         sql2.append("values(");
    161         for (int i = 0; i < f.length; i++) {
    162             String name = f[i].getName();
    163             String get = getGos("get", name);
    164             Method m = c.getDeclaredMethod(get);
    165             Object value = m.invoke(obj);
    166 
    167             if (value != null && value != ""
    168                     && !String.valueOf(value).equals("0")) {
    169                 sql1.append(name + ",");
    170                 sql2.append("?,");
    171                 fieldValue.add(value);
    172             }
    173         }
    174 
    175         int j = sql1.length() - 1;
    176         if (sql1.lastIndexOf(",") == j) {
    177             int start = sql1.length() - 1;
    178             int end = sql1.length();
    179             sql1.replace(start, end, "");
    180         }
    181         int k = sql2.length() - 1;
    182         if (sql2.lastIndexOf(",") == k) {
    183             int start = sql2.length() - 1;
    184             int end = sql2.length();
    185             sql2.replace(start, end, "");
    186         }
    187         sql1.append(")");
    188         sql2.append(")");
    189         StringBuilder sql = sql1.append(sql2);
    190         System.out.println(sql);
    191 
    192         PreparedStatement ps = conn.prepareStatement(sql.toString());
    193         // System.out.println(fieldValue.size());
    194         for (int i = 0; i < fieldValue.size(); i++) {
    195             // System.out.println(fieldValue.get(i));
    196             ps.setObject(i + 1, fieldValue.get(i));
    197         }
    198         // 执行
    199         int result = ps.executeUpdate();
    200         return result;
    201     }
    202 
    203     /**
    204      * @param conn
    205      *            Connection对象
    206      * @param sql
    207      *            删除的sql语句(index:delete from student)
    208      * @param id
    209      *            删除的主键
    210      * @return int 0,1执行结果
    211      */
    212     public static int doDelete(Connection conn, String sql, String primaryKey,
    213             int id) {
    214         sql = sql + " where " + primaryKey + " = ?";
    215         int result = 0;
    216         try {
    217             System.out.println(sql);
    218             PreparedStatement ps = conn.prepareStatement(sql);
    219             ps.setInt(1, id);
    220             result = ps.executeUpdate();
    221         } catch (SQLException e) {
    222             e.printStackTrace();
    223         }
    224         return result;
    225     }
    226 
    227     /**
    228      * @param conn
    229      *            Connection对象
    230      * @param sql
    231      *            要执行的sql语句
    232      * @param obj
    233      *            一般是vo对象
    234      * @param primaryKey
    235      *            表中的主键, 更新是基于主键更新的
    236      * @return int 0,1执行结果
    237      * @throws
    238      */
    239     public static int doUpdate(Connection conn, StringBuilder sql, Object obj,
    240             String primaryKey, Integer id) throws Exception {
    241         Class<?> c = obj.getClass();
    242         Field[] f = c.getDeclaredFields();
    243         // list类型,用于在程序计数传入的属性值
    244         List<Object> fieldValue = new ArrayList<>();
    245 
    246         sql.append(" set");
    247 
    248         for (int i = 0; i < f.length; i++) {
    249             String name = f[i].getName();
    250             String get = getGos("get", name);
    251             Method m = c.getDeclaredMethod(get);
    252             Object value = m.invoke(obj);
    253 
    254             int j = name.toLowerCase().indexOf(primaryKey.toLowerCase());
    255             if (value != null && value != "" && j < 0) {
    256                 // System.out.println(f[i].getName());
    257                 sql.append(" " + name + " = ?,");
    258                 fieldValue.add(value);
    259             }
    260         }
    261 
    262         // 去掉最后一个逗号
    263         int k = sql.length() - 1;
    264         if (sql.lastIndexOf(",") == k) {
    265             int start = sql.length() - 1;
    266             int end = sql.length();
    267             sql.replace(start, end, "");
    268         }
    269 
    270         if (id != null) {
    271             sql.append(" where " + primaryKey + " = ?");
    272         }
    273 
    274         System.out.println(sql);
    275         PreparedStatement ps = conn.prepareStatement(sql.toString());
    276         for (int i = 0; i < fieldValue.size(); i++) {
    277             // System.out.println(fieldValue.get(i));
    278             ps.setObject(i + 1, fieldValue.get(i));
    279         }
    280         if (id != null) {
    281             ps.setObject(fieldValue.size() + 1, id);
    282             System.out.println(id);
    283         }
    284         int result = ps.executeUpdate();
    285         System.out.println(result);
    286         return result;
    287     }
    288 
    289     /**
    290      *  @see getGos是获取get或者set,用于得到一个属性的get和set方法,例如getName()  
    291      *  @param s:set 或者 get    @param name:属性
    292      * 
    293      * @return String类型   
    294      */
    295     public static String getGos(String s, String name) {
    296         String str = s + name.substring(0, 1).toUpperCase() + name.substring(1);
    297         return str;
    298     }
    299 
    300     public static void main(String[] args) {
    301         DatabaseConnection dc = null;
    302         try {
    303             dc = new DatabaseConnection();
    304             Connection conn = dc.getConnection();
    305 
    306             // // 查询
    307             // Student student1 = new Student();
    308             // // student1.setStuNumber("14020031096");
    309             // StringBuilder sql1 = new StringBuilder();
    310             // // sql1.append("select * from student where");
    311             // sql1.append("select * from student");
    312             // @SuppressWarnings("unchecked")
    313             // List<Student> stuList = (List<Student>) DatabaseOperator
    314             // .getSelectList(conn, student1, sql1);
    315             // System.out.println(stuList.get(0).getStuNumber());
    316             // System.out.println(stuList.get(0).getId());
    317             // for (int i = 0; i < stuList.size(); i++) {
    318             // System.out.println(stuList.get(i).getStuName());
    319             // }
    320 
    321             // 增加
    322             // Student student2 = new Student();
    323             // student2.setStuName("萌重宝宝");
    324             // student2.setStuNumber("22222222222");
    325             // student2.setStuPassword(GetHash.getMD5("123456"));
    326             // StringBuilder sql2 = new StringBuilder();
    327             // sql2.append("insert into student");
    328             // int result=doInsert(conn, sql2, student2);
    329             // if(result==1){
    330             // System.out.println("insert成功");
    331             // }else{
    332             // System.out.println("insert失败");
    333             // }
    334 
    335             // 删除
    336             // String sql3 = "delete from student";
    337             // String primaryKey = "id";
    338             // int id = 15458;
    339             // int result=doDelete(conn, sql3, primaryKey, id);
    340             // if(result==1){
    341             // System.out.println("delete成功");
    342             // }else{
    343             // System.out.println("delete失败");
    344             // }
    345 
    346             // 更新
    347             // Student student4 = new Student();
    348             // student4.setStuName("萌重儿子");
    349             // StringBuilder sql4 = new StringBuilder();
    350             // sql4.append("update student");
    351             // String primaryKey = "id";
    352             // int id = 15456;
    353             // DatabaseOperator.doUpdate(conn, sql4, student4, primaryKey, id);
    354         } catch (Exception e) {
    355             e.printStackTrace();
    356         }
    357 
    358     }
    359 }
    DatabaseOperator

    主要是4个函数,还有一个拼接字符串函数,主函数是使用范例。

    啦啦啦跑步去

  • 相关阅读:
    软解析和硬解析
    oracle存储过程常用技巧
    jquery-1.11.1.js
    JavaScript遍历table
    JavaScript向select下拉框中添加和删除元素
    glog
    DDL引发的对象invalidation
    模拟cursor pin S wait on X
    rsync 排除目录
    JavaScript解决select下拉框中的内容太长显示不全的问题
  • 原文地址:https://www.cnblogs.com/wangkaipeng/p/5682981.html
Copyright © 2020-2023  润新知