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

 更新时间:2017年08月05日 08:14:47   投稿:jingxian  
下面小编就为大家带来一篇Java连接MySQL数据库增删改查的通用方法(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

运行环境: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连接MySQL数据库增删改查的通用方法(推荐)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Spring  ApplicationContextAware 接口的作用及使用方式

    Spring  ApplicationContextAware 接口的作用及使用方式

    Spring提供了许多回调接口,用于Bean生命周期中执行特定的操作,通过实现ApplicationContextAware接口,Spring提供了一种便捷的方式让 Bean获取对Spring容器的引用,本文介绍ApplicationContextAware接口的作用、使用方式,以及在实际应用中的常见场景,感兴趣的朋友一起看看吧
    2024-01-01
  • Java8中StringJoiner类的使用详解

    Java8中StringJoiner类的使用详解

    Java在java.util包中添加了一个新的最终类StringJoiner。可以用于构造由定界符分隔的字符序列。本文将通过示例和大家分享一下StringJoiner类的使用,需要的可以参考一下
    2022-10-10
  • 深入分析JAVA 反射和泛型

    深入分析JAVA 反射和泛型

    这篇文章主要介绍了JAVA 反射和泛型的的相关资料,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-06-06
  • Java多线程CountDownLatch的实现

    Java多线程CountDownLatch的实现

    本文主要介绍了Java多线程CountDownLatch的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • java算法导论之FloydWarshall算法实现代码

    java算法导论之FloydWarshall算法实现代码

    这篇文章主要介绍了算法导论之FloydWarshall算法实现代码的相关资料,需要的朋友可以参考下
    2017-05-05
  • Elasticsearch聚合查询概念及字段类型示例

    Elasticsearch聚合查询概念及字段类型示例

    这篇文章主要为大家介绍了Elasticsearch聚合查询概念及字段类型示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • SpringBoot详解如何整合Redis缓存验证码

    SpringBoot详解如何整合Redis缓存验证码

    本文主要介绍了SpringBoot集成Redis实现验证码的缓存简单案例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-07-07
  • Java获取时间差(天数差,小时差,分钟差)代码示例

    Java获取时间差(天数差,小时差,分钟差)代码示例

    这篇文章主要介绍了Java获取时间差(天数差,小时差,分钟差)代码示例,使用SimpleDateFormat来实现的相关代码,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • java字符串日期类Date和Calendar相互转化及相关常用方法

    java字符串日期类Date和Calendar相互转化及相关常用方法

    Java语言的Calendar(日历),Date(日期),和DateFormat(日期格式)组成了Java标准的一个基本但是非常重要的部分,下面这篇文章主要给大家介绍了关于java字符串日期类Date和Calendar相互转化及相关常用方法的相关资料,需要的朋友可以参考下
    2023-12-12
  • 详解Kotlin:forEach也能break和continue

    详解Kotlin:forEach也能break和continue

    这篇文章主要介绍了详解Kotlin:forEach也能break和continue的相关资料,需要的朋友可以参考下
    2017-06-06

最新评论