zoukankan      html  css  js  c++  java
  • 一个使用反射实现的实体类插入数据库工具(java,mysql)

            在毕业设计的中期,因为发现写各种sql将bean插入到数据库中实在罗嗦得蛋疼,就学了学反射,简单弄了一个泛用工具类,只要是符合标准的bean都可以直接插入到数据库中。数据库使用的是mysql,另外在linux中的数据库也是大小写敏感的说,如果命名比较高端的,可能就不好使了。

    在这里只是简单做个记录,当作学习java的一个脚印

    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.Map;
    import java.util.Map.Entry;
    import java.sql.*;
    public class DataBaseHelperImpl extends DataBaseHelper{
    
        
    
        static String URLr = "jdbc:mysql://localhost:3306/database";
        static String URLw = "jdbc:mysql://localhost:3306/database";
        static String USERNAME = "username";
        static String PASSWORD = "password";
        static String driver="com.mysql.jdbc.Driver";
        
        
        private Connection conn;
        private PreparedStatement pstmt;
    
        public boolean closeConnection() {
            try {
                conn.close();
                return true;
            } catch (SQLException e) {
                e.printStackTrace();
                return false;
            }
        }
        public boolean openReadConnection() {
            try {
                Class.forName(driver).newInstance();
                conn=DriverManager.getConnection(URLr,USERNAME,PASSWORD);
                return true;
            } catch (Exception e) {
                e.printStackTrace();
                return false;
            } 
        }
    
        public boolean openWriteConnection() {
            try {
                Class.forName(driver).newInstance();
                conn=DriverManager.getConnection(URLw,USERNAME,PASSWORD);
                return true;
            } catch (Exception e) {
                e.printStackTrace();
                return false;
            } 
        }
    
        
        public boolean doSql(String sql, ArrayList<Object> para) {
            int i = 1;
            Iterator<Object> iter;
            if (para!=null)
                    iter = para.iterator();
            else iter = null;
            try {
                //准备执行语句
                pstmt = conn.prepareStatement(sql);
                //解析参数列表
                if(iter!=null)
                while(iter.hasNext()){
                    Object p = iter.next();
                    pstmt.setObject(i++, p);
                }
                pstmt.execute();
                return true;
            } catch (Exception e) {
                e.printStackTrace();
                return false;
            }
        }
    
        public ResultSet doQuery(String sql, ArrayList<Object> para) {
            int i = 1;
            Iterator<Object> iter;
            if (para!=null)
                iter = para.iterator();
            else iter = null;
            try {
                //准备执行语句
                pstmt = conn.prepareStatement(sql);
                //解析参数列表
                if(iter!=null)
                while(iter.hasNext()){
                    Object p = iter.next();
                    pstmt.setObject(i++, p);
                }
                //执行SQL并获得结果集
                ResultSet rs = pstmt.executeQuery();
                return rs;
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
    
        }
    
        /**
         * 利用反射编程,完成自动解析符合下述规范的bean类并加入数据库
         * 对于bean类的规范如下:
         * 1、bean的类名即为表名
         * 2、参数名即为列名
         * 3、参数值为要输入的值
         * 4、所有为空的参数均不被插入数据库
         * 5、仅支持java标准对象作为成员参数,自定义类请重写toString()方法以便于插入
         * 6、不支持二进制格式的数据
         */
        public boolean saveBeans(Object tosave) {
            
            String table = tosave.getClass().getSimpleName();//设定:bean名称即为表名称
            Class<? extends Object> ts = tosave.getClass();
            Field[] fields = ts.getDeclaredFields();//获取类的所有的成员变量
            ArrayList<String> col = new ArrayList<String>();//列名列表
            ArrayList<Object> values = new ArrayList<Object>();//参数列表
            try {
            for(int i=0;i<fields.length;i++){
                    Field field = fields[i];
                    field.setAccessible(true);//重要!设置权限,否则不能获取参数
                    Object val = field.get(tosave);
                    if(val == null)//若值为空,则跳过此属性,即假定为使用数据库中默认值
                        continue;
                    values.add(val);
                    col.add(field.getName());
            }
            } catch (IllegalArgumentException e) {
                    e.printStackTrace();
                    return false;
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                    return false;
                }
            String collist = "";
            //将列名列表转换为sql语句
            Iterator<String> col_iter = col.iterator();
            while(col_iter.hasNext()){
                String t = col_iter.next();
                collist+=t;
                if(col_iter.hasNext())
                    collist+=",";
            }
            //为参数列表提供相应数量的占位符
            String sit = "";
            for(int i=0;i<values.size();i++){
                sit+="?";
                if(i!=values.size()-1)
                    sit+=",";
            }
            //拼写sql语句
            String sql = "insert into "+table+"("+collist+") values ("+sit+")";
            System.out.println("execute sql is :"+sql);
            openWriteConnection();
            boolean ret = doSql(sql,values);//执行sql语句
            closeConnection();
            return ret;
        }
        /**
         * !利用Map匹配get/set方法,所以不能有重构的方法(标准情况下也不会有)
         */
        public ArrayList<Object> getBeans(Class<?> bean,Map<String,Object> index) {
    
            String table = bean.getSimpleName();//设定:bean名称即为表名称
            
            Field[] fields =bean.getDeclaredFields();//获取类的所有的成员变量
            Method[] methods = bean.getMethods();
            ArrayList<Field> col = new ArrayList<Field>();//列名列表
            ArrayList<Object> values = new ArrayList<Object>();//参数列表
            Map<String,Method> methodMap = new HashMap<String,Method>();//方法列表
            
            try {
                //写入列名列表
            for(int i=0;i<fields.length;i++){
                    Field field = fields[i];
                    field.setAccessible(true);//重要!设置权限,否则不能获取私有参数
                    col.add(field);
            }
            //写入方法匹配表
            for(int i=0;i<methods.length;i++){
                Method method = methods[i];
                methodMap.put(method.getName(),method);
            }
            } catch (IllegalArgumentException e) {
                    e.printStackTrace();
                    return null;
            }
            //拼写sql语句
            String sql = "select * from "+table;
            if(index !=null)
            {
                //将限制条件加入sql语句
                String limit = "";
                Iterator<Entry<String,Object>> iter = index.entrySet().iterator();
                while(iter.hasNext()){
                    Entry<String,Object> ent = iter.next();
                    limit+=ent.getKey()+"=?";
                    values.add(ent.getValue());
                    if(iter.hasNext())
                        limit+=" and ";
                }
                sql+=" where "+limit;
            }
            
            System.out.println("execute sql is :"+sql);
            openWriteConnection();
            ResultSet rs = doQuery(sql,values);//执行sql语句并获取结果集
            
            ArrayList<Object> retdata = new ArrayList<Object>();//创建返回对象的数组
            //遍历结果集
            try {
                while(rs.next()){
                    Object t = bean.newInstance();//实例化一个新的bean对象
                    Iterator<Field> col_iter = col.iterator();
                    while(col_iter.hasNext()){
                        Field f = col_iter.next();
                        String colname = f.getName();
                        //设置首字母大写以匹配标准bean方法
                        String sub = colname.substring(0,1);
                        colname = colname.substring(1);
                        sub = sub.toUpperCase();
                        colname = sub+colname;
                        
                        Method setter = methodMap.get("set"+colname);//通过反射获取set方法
                        setter.invoke(t, rs.getObject(colname));//调用set方法插入参数
                    }
                    retdata.add(t);
                }
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            } 
            closeConnection();
            return retdata;
            
        }
        
    }
  • 相关阅读:
    LeetCode 121. Best Time to Buy and Sell Stock
    LeetCode 221. Maximal Square
    LeetCode 152. Maximum Product Subarray
    LeetCode 53. Maximum Subarray
    LeetCode 91. Decode Ways
    LeetCode 64. Minimum Path Sum
    LeetCode 264. Ugly Number II
    LeetCode 263. Ugly Number
    LeetCode 50. Pow(x, n)
    LeetCode 279. Perfect Squares
  • 原文地址:https://www.cnblogs.com/Ayanami-Blob/p/3675570.html
Copyright © 2011-2022 走看看