Java invoke 使用

封装jdbc的添加功能

-------------数据库添加功能,只需要传入对象实例------------------
package com.mysql;

public class mytest {

    public static void main(String[] args) {

        // Student student = new Student(23, "1", 1, 1, "1");
        Course course = new Course(11, "美术");

        // boolean result = new Add(student).isResult();
        boolean result = new Add(course).isResult();

        System.out.println(result);
    }
}
-------------封装连接数据库的操作,传入对象,返回执行结果---------------
package com.mysql;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class Add {

    private boolean result = false;

    public Add(Object object) {

        //得到在加载器中的类对象
        Class<? extends Object> class1 = object.getClass();

        MyAdd myAdd = new MyAdd(class1, object);

        //参数个数
        String[] para = myAdd.getPara();

        //拼装的sql字符串
        String sql = myAdd.getSql();

        //得到的对象get各属性值
        Object[] object1 = myAdd.getObject();

        try {
            //工厂类生产连接
            Connection connection = new MyConnection().getConnection();

            PreparedStatement prepareStatement = connection.prepareStatement(sql);

            for (int i = 0; i < para.length; i++) {
                prepareStatement.setObject(i + 1, object1[i]);
            }

            int executeUpdate = prepareStatement.executeUpdate();

            if (executeUpdate == 1) {
                result = true;
            }

            connection.close();

        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    //运行结果
    public boolean isResult() {
        return result;
    }

}
-------------得到传入对象get方法结果,生成sql语句---------------------
public class MyAdd {//传入类的名字
private String name;
//传入类的变量
private String[] para;
//传入类的get方法得到的值
private Object[] object;

public MyAdd(Class<? extends Object> class1, Object object) {
    // TODO Auto-generated constructor stub

    // 得到传入类的变量( sno, sname, ssex, sage, sdept)
    Field[] declaredFields = class1.getDeclaredFields();

    int length = declaredFields.length;

    String[] arr = new String[length];

    for (int i = 0; i < length; i++) {
        arr[i] = declaredFields[i].getName();
    }

    this.para = arr;

    // 得到传入类的类名,并去掉包机构(Student)
    String[] split = class1.getName().split("\\.");

    this.name = split[split.length - 1];

    // 得到传入类所有get方法,并得到值方法值
    // invoke(反射)
    this.object = new Object[para.length];
    Method[] methods = class1.getDeclaredMethods();

    for (int i = 0; i < para.length; i++) {
        for (Method method : methods) {

            String name1 = method.getName();

            // 过滤出g开头的方法
            if (name1.charAt(0) == 'g') {
                String substring = name1.substring(3);

                // 得到的方法没有顺序,通过构造函数的参数排序
                if (substring.compareToIgnoreCase(para[i]) == 0) {
                    try {

                        // 得到get方法的值
                        this.object[i] = method.invoke(object, null);
                    } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    break;
                }
            }
        }
    }
}

// 拼接sql语句
public String getSql() {

    String sql = "insert into " + name + " values(?";

    for (int i = 1; i < para.length; i++) {
        sql += ",?";
    }

    sql += ")";

    return sql;
}

public Object[] getObject() {
    return object;
}

public String getName() {
    return name;
}

public String[] getPara() {
    return para;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值