博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一个使用反射实现的实体类插入数据库工具(java,mysql)
阅读量:6788 次
发布时间:2019-06-26

本文共 4940 字,大约阅读时间需要 16 分钟。

        在毕业设计的中期,因为发现写各种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 para) {        int i = 1;        Iterator 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 para) {        int i = 1;        Iterator 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
ts = tosave.getClass(); Field[] fields = ts.getDeclaredFields();//获取类的所有的成员变量 ArrayList
col = new ArrayList
();//列名列表 ArrayList
values = new ArrayList();//参数列表 try { for(int i=0;i
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
getBeans(Class
bean,Map
index) { String table = bean.getSimpleName();//设定:bean名称即为表名称 Field[] fields =bean.getDeclaredFields();//获取类的所有的成员变量 Method[] methods = bean.getMethods(); ArrayList
col = new ArrayList
();//列名列表 ArrayList
values = new ArrayList();//参数列表 Map
methodMap = new HashMap
();//方法列表 try { //写入列名列表 for(int i=0;i
> iter = index.entrySet().iterator(); while(iter.hasNext()){ Entry
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
retdata = new ArrayList();//创建返回对象的数组 //遍历结果集 try { while(rs.next()){ Object t = bean.newInstance();//实例化一个新的bean对象 Iterator
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; } }

 

转载于:https://www.cnblogs.com/Ayanami-Blob/p/3675570.html

你可能感兴趣的文章
LeetCode – Refresh – Palindrome Partitioning II
查看>>
mysql线上数据库单表超过200G的处理
查看>>
生成静态页相关
查看>>
OC中ARC forbids explicit message send of release错误
查看>>
J2SE 学习记录
查看>>
VS静态编译
查看>>
个人作业——Alpha项目测试
查看>>
laravel之laravel-admin安装
查看>>
浅谈C#中的接口和抽象类
查看>>
Jmeter实现webservice的接口测试
查看>>
jmeter用BeanShell调用jar包对HTTP请求中的参数进行MD5加密
查看>>
判断页数及切换
查看>>
GraphQL ---02 GraphQL和C#结合的实战项目
查看>>
Vmware虚拟机三种网络模式详解
查看>>
【已解决】如图,说我磁盘不够,看到var目录下有的个隐藏文件夹占了46G,不知道怎么删除...
查看>>
[LintCode] O(1)检测2的幂次
查看>>
BZOJ3295:[CQOI2011]动态逆序对——题解
查看>>
Office Online简介
查看>>
房天下爬虫
查看>>
常用Shell脚本命令(备忘)
查看>>