锋盈数科-知识库 Logo
首页
软件开发
计算机基础
Hello Halo
新手必读
关于本知识库
登录 →
锋盈数科-知识库 Logo
首页 软件开发 计算机基础 Hello Halo 新手必读 关于本知识库
登录
  1. 首页
  2. 软件开发
  3. JAVA
  4. Java用反射封装MySQL增删改查的工具

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

0
  • JAVA
  • 发布于 2024-09-26
  • 11 次阅读
黄健
黄健

首先,我们要搭建环境:

一、导入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语句中的参数值。
```java
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、查询一条记录,以键值对形式返回:
```java
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

标签: #JAVA 991 #MySQL 49
相关文章

Spring 实现 3 种异步接口 2024-10-18 09:07

大家好,我是苏三~ 如何处理比较耗时的接口? 这题我熟,直接上异步接口,使用 Callable、WebAsyncTask 和 DeferredResult、CompletableFuture等均可实现。 但这些方法有局限性,处理结果仅返回单个值。在某些场景下,如果需要接口异步处理的同时,还持续不断地

重学SpringBoot3-集成Redis(五)之布隆过滤器 2024-10-08 11:24

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ 重学SpringBoot3-集成Redis(五)之布隆过滤器 1. 什么是布隆过滤器? * 基本概念 适用场景 2. 使用 Redis 实现布隆过滤器 * 项目依赖 Redis 配置

SpringBoot整合异步任务执行 2024-10-08 11:24

同步任务: 同步任务是在单线程中按顺序执行,每次只有一个任务在执行,不会引发线程安全和数据一致性等 并发问题 同步任务需要等待任务执行完成后才能执行下一个任务,无法同时处理多个任务,响应慢,影响用 户体验 异步任务: 异步任务是在多线程中同时执行,多个任务可以并发执行,同时处理多个请求,响应快,资源

springboot kafka多数据源,通过配置动态加载发送者和消费者 2024-10-08 11:24

前言 最近做项目,需要支持kafka多数据源,实际上我们也可以通过代码固定写死多套kafka集群逻辑,但是如果需要不修改代码扩展呢,因为kafka本身不处理额外逻辑,只是起到削峰,和数据的传递,那么就需要对架构做一定的设计了。 准备test kafka本身非常容易上手,如果我们需要单元测试,引入ja

SpringBoot 集成 Redis 2024-10-08 11:24

一:SpringBoot 集成 Redis ①Redis是一个 NoSQL(not only)数据库, 常作用缓存 Cache 使用。 ②Redis是一个中间件、是一个独立的服务器;常用的数据类型: string , hash ,set ,zset , list ③通过Redis客户端可以使用多种语

SpringBoot整合QQ邮箱 2024-10-08 11:24

SpringBoot可以通过导入依赖的方式集成多种技术,这当然少不了我们常用的邮箱,现在本章演示SpringBoot整合QQ邮箱发送邮件…. 下面按步骤进行: 1.获取QQ邮箱授权码 1.1 登录QQ邮箱 1.2 开启SMTP服务 找到下图中的SMTP服务区域,如果当前账号未开启的话自己手动开启。

目录

IT 外包服务商

  • 意见投递
  • zyf6619

软件开发应用

主菜单

  • 首页
  • 软件开发
  • 计算机基础
  • Hello Halo
  • 新手必读
  • 关于本知识库
Copyright © 2024 your company All Rights Reserved. Powered by Halo.