自学内容网 自学内容网

Java用反射封装MySQL增删改查的工具

首先,我们要搭建环境:

一、导入jar包 

这是我们要加入的jar包 。

 二、创建德鲁伊的配置文件

  三、获取链接:

这是整个的基础,有很多方法都要调用该链接用来给数据库传值; 

public class sql_lianjie {
    //创建变量
    private static Connection connection;

    /**
     * 建立链接
     *
     * @return
     * @throws SQLException
     */
    //
    public static Connection getConnection() throws SQLException {
        //创建一个对象用来存储和加载配置文件
        Properties properties = new Properties();
        //try catch输出错误
        try {
            //使用FileInputStream读取名为dur.properties的文件
            // 使用load方法将文件内容加载到properties对象中
            properties.load(new FileInputStream("src/dur.properties"));
            //使用`DruidDataSourceFactory`的`createDataSource`静态方法,传入前面加载的`properties`对象。
            // 这个方法根据配置创建一个`DataSource`对象,`DataSource`是JDBC中用于获取数据库连接的对象。
            DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
//调用`DataSource`对象的`getConnection`方法来获取一个数据库`Connection`。
// 这个`Connection`对象是与数据库交互的基础,所有的SQL操作都需要通过这个对象执行。
            connection = dataSource.getConnection();
            //打印获取到的`Connection`对象。这通常用于调试目的,显示连接是否成功获取。
         //   System.out.println(connection);
        } catch (Exception e) {
            e.printStackTrace();
        }
        //最后,方法返回获取的`Connection`对象。
        return connection;
    }
四、 关闭链接:

为了不占用电脑的资源,每次访问完成都要关闭链接;

//名为closeAll,它接受一个可变参数列表(varargs)类型为AutoCloseable。AutoCloseable是一个功能接口
// 用于自动管理资源的类。类型为AutoCloseable。AutoCloseable是一个功能接口,参数它指的是要关闭的资源。
    public static void closeAll(AutoCloseable... yaoguanbidemingcheng) {
        //首先检查传入的参数数组是否非空且长度大于零,以确保有资源需要处理。
        if (yaoguanbidemingcheng != null && yaoguanbidemingcheng.length > 0) {
            //使用Java 8的流(Stream)API来遍历AutoCloseable对象数组。
            // forEach方法接收一个Lambda表达式,对每个元素执行给定的操作。
            Arrays.stream(yaoguanbidemingcheng).forEach(x -> {
                //将捕获该异常并打印堆栈跟踪信息。这样可以避免因为单个资源的关闭失败而导致整个程序的崩溃。
                if (x != null) {
                    try {
                        x.close();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });
        }
    }
五、预编译: 
创建并返回一个预编译的SQL语句对象(PreparedStatement)它接受三个参数:一个SQL语句(String sql),一个数据库连接对象(Connection connection), 以及一个可变参数列表(Object... parameters),用于传递SQL语句中的参数值。
public static PreparedStatement getPrepar(String sql, Connection connection, Object... parameters) throws SQLException {
        //使用Connection对象和提供的SQL语句创建一个PreparedStatement对象。
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        //获取PreparedStatement对象的元数据,这提供了关于SQL语句中参数的信息,包括参数的数量和类型。
        ParameterMetaData parameterMetaData = preparedStatement.getParameterMetaData();
        //首先,获取参数的预期数量parameterCount
        int parameterCount = parameterMetaData.getParameterCount();
        //检查是否有参数需要设置,以及传入的参数列表是否非空,最后确认传入参数的数量是否与SQL语句中参数的数量相匹配。
        if (parameterCount != 0 && parameters != null && parameters.length == parameterCount) {
            //如果参数数量和传入的参数列表一致,则循环遍历所有参数。
            for (int i = 0; i < parameterCount; i++) {
                // 并使用setObject方法将每个参数值设置到PreparedStatement对象中。这里i + 1是因为参数索引是从1开始的,而数组索引是从0开始的
                preparedStatement.setObject(i + 1, parameters[i]);
            }
        }
        //方法返回配置好的PreparedStatement对象,以便后续调用者可以执行具体的数据库操
        return preparedStatement;
    }

其次、写方法:

六、 写"增删改"的封装方法:

 它用于执行SQL更新操作(如插入、更新或删除),并返回受影响的行数。

//它接受两个参数:一个SQL更新语句(String sql)和一个可变参数列表(Object... parametes)
// 用于传递SQL语句中的参数值。方法返回一个整型值(int),表示更新操作影响的行数,
    public static int update(String sql, Object... parametes) throws SQLException {
        //sql_lianjie的对象来获取数据库连接(Connection)。getConnection()是获取数据库连接的标准方法。
        Connection connection = sql_lianjie.getConnection();
        //将sql语句和参数返回给getPrepar()方法送去预编译处理
        PreparedStatement prepar = getPrepar(sql, connection, parametes);
        //使用PreparedStatement对象的executeUpdate()方法来执行SQL更新操作。
        //此方法返回一个整数,表示数据库中受影响的行数。
        int i = prepar.executeUpdate();
        return i;
    }

七、写查的方法:

查多个数据:
1、将数据存储在List中以集合保存:
public static <T> List<T> selduo(String sql, Class<T> cls, Object... parameters) throws SQLException, InstantiationException, IllegalAccessException, InvocationTargetException {
        //定义 ArrayList 用于存储结果对象
        ArrayList<T> objects = new ArrayList<>();
        //数据库连接 (connection)
        Connection connection = null;
        //预编译的 SQL 语句 (preparedStatement)
        PreparedStatement preparedStatement = null;
        //结果集 (resultSet)
        ResultSet resultSet = null;
        T t = null;
        //2,获取链接
        connection = sql_lianjie.getConnection();
        //3,获取sql预编译对象
        preparedStatement = sql_lianjie.getPrepar(sql, connection, parameters);
        //4,执行查询结果,得到结果集
        resultSet = preparedStatement.executeQuery();
        //5,反编译对象,从结果集中获取表的元素
        ResultSetMetaData metaData = resultSet.getMetaData();
        //     System.out.println(metaData);
        while (resultSet.next()) {
            //实例化空的bean对象,用来封装数据
            t = cls.newInstance();
            int count = metaData.getColumnCount();
            for (int i = 1; i <= count; i++) {
               // 将结果集中的列值设置到对象的属性上。
                BeanUtils.setProperty(t, metaData.getColumnName(i), resultSet.getObject(i));
            }
            //然后将对象添加到结果列表中。
            objects.add(t);
        }
        sql_lianjie.closeAll(connection, preparedStatement, resultSet);
        return objects;


    }
2、将数据存储在Map中以集合保存:
 public static ArrayList<Map> chamap(String sql, Object... parameters) throws SQLException {
        //定义需要的变量
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        ArrayList<Map> map = new ArrayList<>();
//2.获取链接
        connection = sql_lianjie.getConnection();
//3.获取预编译对象
        PreparedStatement prepar = sql_lianjie.getPrepar(sql, connection, parameters);
        //4.执行查询,得到结果集
        resultSet = prepar.executeQuery();
        //5.反编译对象,从结果集中获取表的元数据
        ResultSetMetaData metaData = resultSet.getMetaData();
        int count = metaData.getColumnCount();
        while (resultSet.next()) {
            HashMap<Object, Object> objectObjectHashMap = new HashMap<>();
            for (int i = 1; i <= count; i++) {
                objectObjectHashMap.put(metaData.getColumnName(i), resultSet.getObject(i));
            }
            map.add(objectObjectHashMap);
        }
        sql_lianjie.closeAll(connection, preparedStatement, resultSet);
        return map;
    }

3、查询多条记录,以数组集合(集合中的数据是数组)的数据状态返回
public static List<Object[]> queryArraylist(String sql, Object... parameters) throws SQLException {
        //定义需要的变量
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        ArrayList<Object[]> objects = new ArrayList<>();
        //2.获取链接
        connection = sql_lianjie.getConnection();
        //3.获取预编译对象
        preparedStatement = sql_lianjie.getPrepar(sql, connection, parameters);
        //4.执行查询,得到结果集
        resultSet = preparedStatement.executeQuery();
        //5.反编译对象,从结果集中获取表的元数据
        ResultSetMetaData metaData = resultSet.getMetaData();
        int count = metaData.getColumnCount();

        while (resultSet.next()) {
            Object[] o = new Object[count];
            for (int i = 0; i < count; i++) {
                o[i] = resultSet.getObject(i + 1);
            }
            objects.add(o);
        }
        sql_lianjie.closeAll(connection, preparedStatement, resultSet);
        return objects;
    }
 查一条数据:
1、查询一条记录,以键值对形式返回:
public static Map<String, Object> yiMap(String sql, Object... parameters) throws SQLException {
        //定义需要的变量
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        //2.获取链接
        connection = sql_lianjie.getConnection();
        //3.获取预编译对象
        preparedStatement = sql_lianjie.getPrepar(sql, connection, parameters);
        //4.执行查询,得到结果集
        resultSet = preparedStatement.executeQuery();
        //5.反编译对象,从结果集中获取表的元数据
        ResultSetMetaData metaData = resultSet.getMetaData();
        int count = metaData.getColumnCount();
        HashMap<String, Object> map = new HashMap<>();
        resultSet.next();
        for (int i = 1; i <= count; i++) {
            map.put(metaData.getColumnName(i), resultSet.getObject(i));
        }
        sql_lianjie.closeAll(connection, preparedStatement, resultSet);
        return map;
    }

2、 查询一条记录以数组方式输出:

public static Object[] queryArray(String sql, Object... parameters) throws SQLException {
        //定义需要的变量
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        //2.获取链接
        connection = sql_lianjie.getConnection();
        //3.获取预编译对象
        preparedStatement = sql_lianjie.getPrepar(sql, connection, parameters);
        //4.执行查询,得到结果集
        resultSet = preparedStatement.executeQuery();
        //5.反编译对象,从结果集中获取表的元数据
        ResultSetMetaData metaData = resultSet.getMetaData();
        int count = metaData.getColumnCount();
        Object[] o = new Object[count];
        resultSet.next();
        for (int i = 0; i < count; i++) {
            o[i] = resultSet.getObject(i + 1);
        }

        sql_lianjie.closeAll(connection, preparedStatement, resultSet);
        mod stu = new mod();

        return o;
    }

3、 查一条数据以Javabean的方式返回

public static <T> T selyi(String sql, Class<T> cls, Object... parameters) {
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        T t = null;
        //2,获取链接
        try {
            connection = sql_lianjie.getConnection();
            //3,获取sql预编译对象
            preparedStatement = sql_lianjie.getPrepar(sql, connection, parameters);
            //4,执行查询结果,得到结果集
            resultSet = preparedStatement.executeQuery();
//5,反编译对象,从结果集中获取表的元素
            ResultSetMetaData metaData = resultSet.getMetaData();
            resultSet.next();//这个方法只会拿限定的需要的数据,不会有其他内容


            t = cls.newInstance();//实例化空的bean对象,用来封装数据
            int count = metaData.getColumnCount();
            for (int i = 1; i <= count; i++) {
                BeanUtils.setProperty(t, metaData.getColumnName(i), resultSet.getObject(i));
            }
            sql_lianjie.closeAll(connection, preparedStatement, resultSet);
        } catch (Exception e) {
            return null;
        }
        return t;
    }


原文地址:https://blog.csdn.net/daibadetianshi/article/details/140573285

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!