zoukankan      html  css  js  c++  java
  • Java连接MySQL数据库

    Java连接MySQL数据库增删改查通用方法

      运行环境:eclipse+MySQL

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

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

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

    基本思想:

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

    1. Class.forName():加载驱动   ——》com.mysql.jdbc.Driver
    2. DriverManager.getConnection():驱动管理,连接到数据库 三个属性1.数据库地址  2.数据库用户名   3.密码
    3. createStatement():创建Statement对象
    4. 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);

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

    坚定信念,持之以恒
  • 相关阅读:
    Echarts框架的使用
    变身windows达人,用运行命令直接启动所有应用程序
    Google为何这么屌
    骗子利用淘宝支付宝退款欺诈
    卡常技巧
    C++set用法
    分块大法好
    高精度乘法
    phpstudy初谈(基础教程)
    读入,输出优化
  • 原文地址:https://www.cnblogs.com/Magic_liao/p/7289633.html
Copyright © 2011-2022 走看看