java连接数据库的查询方法(一个方法查任意表,任意字段)

2023-10-28

目录

前言:

1.普通查询方法

1.1实现步骤

1.1.1预加载

1.1.2通过驱动管理器获取Connection对象

1.1.2通过Connection对象来创建命令对象

1.1.3通过命令对象获取结果集

2.不普通的查询方法

2.1获取类的反射对象

 2.2泛型

2.3完整代码

3.引入连接池

3.1连接池介绍

3.2引入连接池的完整代码

3.3引入连接池的查询方法


前言:

大家都知道,我们java程序员最基本的事情就是对数据库的增删改查操作,本次就让我来讲讲简单的增删改查。其中需要的工具为ideal,还需要数据库的jar包。今天我就来教大家如何只写一个查询方法就可以查询所有的表,并且可以添加任何条件

1.普通查询方法

1.1实现步骤

1.1.1预加载

Class.forName(com.mysql.jdbc.Driver)

此为5版本mysql的预加载方式

Class.forName(com.mysql.cj.jdbc.Driver)

此为8版本的数据库预加载方式

1.1.2通过驱动管理器获取Connection对象

Connection connection=DriverMannger.getConnection("jdbc:mysql://localhost:3306/表名");

1.1.2通过Connection对象来创建命令对象

Statement statement=connection.createStatement();

1.1.3通过命令对象获取结果集

 ResultSet resultSet = statement.executeQuery("select * from NAME ");

接下来就可以遍历结果集查询到所有数据了

但是这种方法里面的查询语句是写死的,而且要是方法需要返回存储对象的集合的话,那么这种方法通用性就非常的低。

2.不普通的查询方法

这种查询方法可以查询不同的表,查询的条件也可以随便改,但是查询的结果必须是全部

例子:select * from 任意表名 where 任意条件

2.1获取类的反射对象

1.类名.class

2.对象名.getclass

3.class.forName("该类的路径")

 2.2泛型

定义泛型可以代表各种不确定的类。

2.3完整代码

  //通用查询方法
    public static <T> List<T> select(Class<T> tClass, String sql, Object... o) {
        List<T> list = new ArrayList<>();
        Connection connection=null;
        try {
//            Connection connection = getConnection();
             connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/myfirst");
            PreparedStatement preparedStatement = connection.prepareStatement(sql);
            for (int i = 0; i < o.length; i++) {
                preparedStatement.setObject(i + 1, o[i]);
            }
            ResultSet resultSet = preparedStatement.executeQuery();
            while (resultSet.next()) {
                T obj = tClass.newInstance();
                Field[] declaredFields = tClass.getDeclaredFields();
                for (Field field : declaredFields) {
                   Object value = resultSet.getObject(field.getName());
                    field.setAccessible(true);
                    field.set(obj, value);
                }
                list.add(obj);
            }
            return list;
        } catch (Exception e) {
            e.printStackTrace();
        }
        finally {
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        return null;
    }

这玩意不容易讲明白,但是大伙可以拷贝下来直接用,用法如下

类名.select(类名.class,"select * from 表名 where 字段名1=?, 字段名2=?....",字段名1的值,字段名2的值.....)

3.引入连接池

不过这种写法还是不够规范。我们最好还是加上一个连接池 ,连接池可以回收利用connection对象。频繁的创建与销毁connection对象不好。想要用连接池就需要连接池的jar包

3.1连接池介绍

现在常用的是两个,一个名为Druid是马云的。还有一个是hikari是小日本的。

区别:马云的淘宝主要是做金额交易的业务所以需要安全。Druid更安全

hikari是japanese的,优点就是快。

3.2引入连接池的完整代码

 private static DataSource dataSource = null;

    static {
        //获取属性集对象
        Properties properties = new Properties();
        //获取.properties里的配置文件
        try {
            properties.load(DBUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
            //通过马云的工厂获取数据源
            dataSource = DruidDataSourceFactory.createDataSource(properties);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //创建获取Druid里的数据源对象通过getConnection获取的connection对象,等同于DriverMannger获取连接对象
    public static Connection getConnection() throws SQLException {
        return dataSource.getConnection();
    }

3.3引入连接池的查询方法

  //通用查询方法
    public static <T> List<T> select(Class<T> tClass, String sql, Object... o) {
        List<T> list = new ArrayList<>();
        try (Connection connection = getConnection()){
            PreparedStatement preparedStatement = connection.prepareStatement(sql);
            for (int i = 0; i < o.length; i++) {
                preparedStatement.setObject(i + 1, o[i]);
            }
            ResultSet resultSet = preparedStatement.executeQuery();
            while (resultSet.next()) {
                T obj = tClass.newInstance();
                Field[] declaredFields = tClass.getDeclaredFields();
                for (Field field : declaredFields) {
                    Object value = resultSet.getObject(field.getName());
                    field.setAccessible(true);
                    field.set(obj, value);
                }
                list.add(obj);
            }
            return list;
        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java连接数据库的查询方法(一个方法查任意表,任意字段) 的相关文章

随机推荐

  • java.lang.IllegalStateException

    Caused by java lang IllegalStateException The specified child already has a parent You must call removeView on the child
  • 【SQL】保姆级教程:MySQL配置全过程 & 编辑器DBeaver的安装配置

    MySQL 是最流行的关系型数据库管理系统 在 WEB 应用方面 MySQL 是最好的 RDBMS Relational Database Management System 关系数据库管理系统 应用软件之一 文章目录 一 什么是数据库 二
  • 数字水印技术的原理、实现及其应用

    概述 数字水印 是指将特定的信息嵌入数字信号中 数字信号可能是音频 图片或是视频等 数字水印可分为浮现式和隐藏式两种 明水印 visible watermarking 其所包含的信息可在观看图片或视频时同时被看见 盲水印 blind wat
  • 计蒜客T1461——校验信用卡号码

    如题 本题需要解决的本质就是多个字符串转换为整型数据的过程 主要的考点在于如下3个 1 循环输入多个字符串并不间断 2 将字符串处理为整型数据 3 完成对整形数据的检验 上述三个要求通过STL可以很轻松地解决 具体做法写在了代码注释之中 i
  • Unity3D 4.0新功能:Mecanim动画系统基础教程

    作为Unity4 0的主要更新功能 Mecanim动画被寄予了很多的期望 系统有先进的地方 也有不足的地方 这些我们留到最后再来总结 阿赵粗略的学习了一下 写下以下的教程 这篇教程简单的说明了Mecanim系统的用法和控制方式 里面用到的资
  • electron-vue中报错 Cannot use import statement outside a module解决方案(亲测有效!!!)

    错误 Cannot use import statement outside a module 不能在模块之外使用导入语句 原因 安装的某个依赖包里使用了import语法 因为我们打包输出的是commonjs规范 所以不识别import语法
  • 学习笔记 React(一)Hello React例子及创建虚拟DOM的两种方式

    React官网地址 React库 最基础的例子 官网 1 英文官网 https reactjs org 2 中文官网 https react docschina org React库 babel min js ES6 gt ES5 JSX
  • C++中函数原型和函数定义

    C 中函数原型和函数定义 C 函数原型指的是函数声明的语法形式 它告诉编译器函数的名称 返回类型和参数列表 函数原型的语法形式如下 return type function name parameter list 其中 return typ
  • 什么是强制缓存?什么是协商缓存?cache

    强制缓存和协商缓存是用于在Web浏览器和服务器之间进行缓存控制的两种机制 强制缓存 强缓存 强制缓存 强制缓存是通过设置HTTP响应头来实现的 它告诉浏览器在一定时间内直接使用缓存的副本 而不需要再向服务器发起请求 常见的强制缓存相关的响应
  • PHP Filter伪协议Trick总结

    PHP Filter伪协议Trick总结 前言 最近在学习的过程中碰到了很多的filter协议的小trick 在此做一个总结以及对filter协议的一些探索 PHP Filter协议介绍 php filter是php中独有的一种协议 它是一
  • 题目0010-数据分类

    数据分类 题目描述 对一个数据a进行分类 分类方法是 此数据a 4个字节大小 的4个字节相加对一个给定值b取模 如果得到的结果小于一个给定的值c则数据a为有效类型 其类型为取模的值 如果得到的结果大于或者等于c则数据a为无效类型 比如一个数
  • SpringBoot配置文件

    1 springboot提供两种配置文件类型 properties和yml yaml 2 默认配置文件名称 properties 3 在同一级目录下优先级为 peoperties gt yml gt yaml YAML定义 三种配置文件写法
  • java基于HuTool工具类ExcelWriter合并单元格

    HuTool工具类ExcelWriter合并单元格 基于HuTool工具类ExcelWriter合并单元格并且使用 jdk1 8 lambda表达式 效果如下 创建注解 import java lang annotation Element
  • 内核篇加载内核模块(Android10)

    一 开发前期准备 本文中使用的是linageOs源码中下载的oneplus3 安卓10内核源码进行研究测试 交叉编译链使用的是linageOs源码中的交叉编译链 lineageOs源码中oneplus3内核源码位置路径 home qiang
  • WebGIS开发入门

    目录 一 WebGIS 二 GIS背景 三 如何入门webgis开发 1 gis数据处理 2 gis数据服务发布 3 gis数据服务调用 4 gis数据渲染 四 WebGIS核心价值 五 webgis发展方向 六 gis开发就业方向 1 数
  • Javascript设计模式-06-代理模式

    Javascript设计模式 06 代理模式 简介 代理模式就是为其他对象提供一种代理 代用品或者占位符 以控制对这个对象的访问 代理对象角色内部含有对真实对象的引用 从而可以操作真实对象 同时代理对象提供与真实对象相同的接口 以便在任何时
  • 离散型制造企业如何选择MES系统?

    随着MES系统越来越被企业重视 并被运用到很多制造业中 MES对于制造企业来说 其所需要的要求是各不相同的 比如离散型制造企业 该如何选择MES系统呢 什么是离散型制造企业 离散型制造企业的产品往往由多个零件经过一系列并不连续的工序的加工最
  • EFM32 硬件I2C通讯案例

    前言 最近项目上用到了EFM32HG222F64G芯片中的硬件通讯 i2c通讯不稳定问题 导致花了很长时间去解决 走了不少弯路 最终还是解决了 在此写一下 做个记录 也方便给后面做产品的攻城狮 少走一些弯路吧 好了 进入正题 来个直接点 直
  • dayjs时间处理库的基本使用

    1 获取当前时间 let a dayjs 2 时间格式化 let endTime dayjs format YYYY MM DD 3 获取当前时间之前的时间 day js可以轻松获取N小时 天 月 年前等时间 如以下代码获取的是14天前的时
  • java连接数据库的查询方法(一个方法查任意表,任意字段)

    目录 前言 1 普通查询方法 1 1实现步骤 1 1 1预加载 1 1 2通过驱动管理器获取Connection对象 1 1 2通过Connection对象来创建命令对象 1 1 3通过命令对象获取结果集 2 不普通的查询方法 2 1获取类