Java连接MySQL数据库增删改查的通用方法(推荐)

作者:jingxian 时间:2024-01-22 12:00:36 

运行环境:eclipse+MySQL

以前我们Java连接MySQL数据库都是一个数据库写一个类,类下面写好多方法,要是多个数据库,就要写多个类多个方法,导致代码编写太过于繁琐,所以为了改变这样的繁琐,我将连接数据库的方法进行了一系列的封装,使用户传入一个对象值Object就可以得到想要的。

我在之前写过一篇普通的Java连接MySQL数据库,大家可以看看,以便对比参考之后就知道差距了 数据库——MySQL——>Java篇

接下来我给大家讲讲如何将这个不可复用,又多重复的连接代码,封装起来,非常好用

基本思想:

我们连接数据库的时候,写的方法都是要一个个类 的去写,其中的方法不计其数,连接数据库都是需要:

Class.forName():加载驱动 ——》com.mysql.jdbc.Driver

DriverManager.getConnection():驱动管理,连接到数据库 三个属性1.数据库地址 2.数据库用户名 3.密码

createStatement():创建Statement对象

ResultSet:执行sql语句获得结果集,再遍历

那么我们为了能通用,那么其中的:数据库名,sql语句,遍历结果集要得到的结果,都是要根据不同数据库根据传入参数不同而变化的

首先每个项目开始前都要将数据库实体化,每个表都是一个实体类,表名是类名,字段为其属性,再用set和get方法这些属性

再根据反射机制,对象是我们表的实例化对象,根据我传入方法的这个参数对象,获取其中的方法,属性,属性值,类型等一系列的东西,来实现方法的封装通用

代码演示

先演示一个查询:通过传入这个表的实体类,通过一系列的放射机制,对比拼装成一个查询方法


public static List<Object> query(Class<?> obj) {
   Statement st=null;
   List<Object> list=new ArrayList<>();
   //数据库MySQL的地址
       String DBURL="jdbc:mysql://localhost:3306/lms_leave?useUnicode=true&characterEncoding=utf-8";
       String DBName="root"; //登入用户名
       String DBPwd="123456";//登入密码
       //加载驱动
       try {
         Class.forName("com.mysql.jdbc.Driver");
       //连接数据库
       Connection conn=DriverManager.getConnection(DBURL,DBName,DBPwd);
       //创建Statement对象
       st=conn.createStatement();
       ResultSet rs=st.executeQuery("select * from "+obj.getSimpleName());
       //获取传入类中的方法
       Method[] methods=obj.getMethods();
       //设置一个方法的list集合,下面将方法放入其中,以便调用
       List<Method> list_m= new ArrayList<>();
       //类中有许多方法,过滤一些方法,获取自己想要的方法
       for(int i=0;i<methods.length;i++){ //过滤方法
         //判断方法名字中是否有set这个提取
         if (methods[i].getName().contains("set")) {
           //将方法添加到list中
           list_m.add(methods[i]);
         }
       }
       //创建字符串string集合,获取下面的字段名存入
       List<String> fieldname=new ArrayList<>();
       //获取类中的属性,其属性对应数据库中的字段
       Field[]  f=obj.getDeclaredFields();
       //循环将字段中的名字首个变大写
       for (int i = 0; i < f.length; i++) {
         //获取名字
         String field=f[i].getName();
         //变大小写,存入fieldname集合
         fieldname.add(upperCase(field));
       }
       //获取得到结果集(rs)的结构,比如字段数、字段名等。
       ResultSetMetaData rsmd=  rs.getMetaData();
       //循环读取结果集中的数据添加到list集合中
       while (rs.next()) {
         //创建一个传入类对象user
         Object user=obj.newInstance();
         //遍历方法的集合
         for (Method m : list_m) {
           //遍历字段的集合
           for (int i = 0; i < f.length; i++) {
             //方法和字段作比较,查看方法名中是否含有这个字段名,两者匹配
             if (m.getName().contains("set"+fieldname.get(i))) {
               //匹配成功 ,则去得到rsmd去获取数据库中的字段名,rs.getObject,再根据获取的这个字段名去得到这个字段值
               Object value=rs.getObject(rsmd.getColumnName(i+1));
               //获取这个字段的类型,以便去储存这个值的类型
               Class<?> type=f[i].getType();
               //是int类型的转化
               if (type==int.class) {
                 value=new Integer(value.toString());
               }
               //string类型的转化
               if (type==String.class) {
                 value=value.toString();
               }
               //m是user对象中的方法,设置其值
               m.invoke(user, value);
             }
           }
         }
         //将的到的user对象实例添加到list集合中
         list.add(user);
       }
       } catch (Exception e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
       }
       return list;
 }

大家可以参考这个方法完全可以改装成剩余的插入,修改,删除

再给大家提示一下插入的方法封装重要的一点是,获取其中要插入的字段,根据插入语句拼接成一个完整的sql语句就可以完成


//m.invoke(user);我的理解是运行user类下的方法m,得到返回值
Object object=m.invoke(user);

这些东西需要自己多去思考总结,希望对大家有用,我就不多写了,留给大家一点思考的空间,需要剩下的方法封装可以留言告诉我

标签:java,数据库,增删改查
0
投稿

猜你喜欢

  • 基于Python创建语音识别控制系统

    2021-08-29 14:02:10
  • 使用tensorflow实现矩阵分解方式

    2022-04-17 17:01:17
  • python出现RuntimeError错误问题及解决

    2022-01-01 00:58:08
  • Gorm更新零值问题解决思路与过程

    2024-04-25 13:18:25
  • 详解如何模拟实现node中的Events模块(通俗易懂版)

    2024-05-05 09:20:55
  • PHP登录环节防止sql注入的方法浅析

    2023-07-21 06:41:01
  • python脚本实现统计日志文件中的ip访问次数代码分享

    2021-03-17 08:40:08
  • Mysql数据库中的redo log 写入策略和binlog 写入策略

    2024-01-27 08:21:14
  • PyCharm 2020.2下配置Anaconda环境的方法步骤

    2022-10-08 14:25:00
  • Python利用pythonping处理ping的示例详解

    2023-08-12 00:28:45
  • MySQL无法启动1067错误的又一种解决方法(机房断电)

    2024-01-13 08:55:25
  • Python Scrapy 框架简单介绍

    2021-09-18 14:51:48
  • Python matplotlib超详细教程实现图形绘制

    2023-04-20 06:37:53
  • 解决python Jupyter不能导入外部包问题

    2021-02-02 06:19:03
  • Pytorch模型迁移和迁移学习,导入部分模型参数的操作

    2021-08-05 09:18:16
  • 详解JavaScript 中的批处理和缓存

    2024-04-28 09:48:03
  • WAP设计基础

    2011-01-06 12:13:00
  • MySQL深分页问题原理与三种解决方案

    2024-01-27 14:12:34
  • 利用ASP在线维护数据库

    2007-10-12 13:53:00
  • 网红编程语言Python将纳入高考你怎么看?

    2022-06-28 15:48:12
  • asp之家 网络编程 m.aspxhome.com