• 用反射完毕学生管理系统(包含数据库连接)


    今天我最终将坑爹的万能数据库链接做好了第一步了,插入数据。
    虽说非常easy。但还是应该总结一些问题。

    一路的坎坷仅仅能如今表达了。
    以下就是一些问题以及过程:
    最重要的问题可能就是sql语句了。今天弄了好久的sql语句中的错误。

    一、我们须要先来总结我们的sql几个语句:

    推断表是否存在:
    方法:
    ResultSet getTables(String catalog,String schemaPattern,String tableNamePattern,String[] types)

    參数:
    catalog - 类别名称,由于存储在数据库中,所以它必须匹配类别名称。

    该參数为 "" 则检索没有类别的描写叙述。为 null 则表示该类别名称不应用于缩小搜索范围
    schemaPattern - 模式名称的模式,由于存储在数据库中,所以它必须匹配模式名称。该參数为 "" 则检索那些没有模式的描写叙述,为 null 则表示该模式名称不应用于缩小搜索范围
    tableNamePattern - 表名称模式。由于存储在数据库中。所以它必须匹配表名称
    types - 要包含的表类型组成的列表,null 表示返回全部类型 
    返回:
    ResultSet - 每一行都是一个表描写叙述


    以下是代码:
    DatabaseMetaData meta = con.getMetaData(); 
    ResultSet rsTable = meta.getTables(null, null, this.Clazz.getSimpleName(), null);
    if(rsTable.next()){
        表存在
    }


    推断完表后,我们就该做做下一步:假设没表,新建。添数据:
    新建表的语句:
    CREAT TABLE tablename (id varchar(255) , age int(255))
    后面的參数是    :      你的变量名 变量类型(变量长度) , ......

    加入数据的语句:
    insert into tablename (id , age) values (1,1)
    这里就不具体解释了

    其它的连接数据库直接上代码:
    //----------------------------- 连接数据库 --------------------------------------//
     public Connection ConnectingMysql() throws SQLException{
      String drivename = "com.mysql.jdbc.Driver";
      String url = "jdbc:mysql://localhost:3306/dbhouse";
      String userName = "root";//mysqlusername
      String password = "root";//mysql用户密码
      try {
       Class.forName(drivename);
      } catch (ClassNotFoundException e) {
       // TODO Auto-generated catch block
       e.printStackTrace();
      }
      connection = DriverManager.getConnection(url, userName, password);
      return connection;
     }
     //---------------------------------------------------------------------------------------//


    还有个值得注意的地方:
    关于最后运行sql语句的时候,statement这个接口下的三个带execute的方法,非常easy混淆。
    二、关于反射传递的数据
    首先传入的是我要保存的对象名,通过newinstance()方法取出我的对象
    Object object = this.Clazz.newInstance();

    再来就是循环输出对象中的变量名和变量类型,提示输入
    for (Field field : this.Clazz.getDeclaredFields())
    System.out.println("please input "+field.getName()+"("+field.getType().getSimpleName()+"):");
        String valueString = scanner.nextLine(); //输入数据
        Object value = null;
       
        if(field.getType().equals(String.class)) //推断数据类型
        {
         value = valueString;
        }
    ......还有非常多其它的类型推断我就不贴在这里了

    每次输入完毕,保存对象信息
    field.set(object, value);
     
    最后。保存数据给全局变量,以便最后传给数据库做准备
    dataName += field.getName() + ","; //全部数据的名字
        if(field.getType().equals(Integer.class) || field.getType().equals(int.class)){
         data[dataLength ++] = field.getName() + " int(255),"; //为数据库的creat table 做准备
         dataType += "int,"; //数据类型
         System.out.println("datatype : " + dataType);
         dataValue += valueString + ","; //数据值
         System.out.println("datavalue : " + dataValue);
        }
        else {
         data[dataLength ++] = field.getName() + " varchar(255),";
         dataType += "varchar,";
         System.out.println("datatype : " + dataType);
         dataValue += valueString + ",";
         System.out.println("datavalue : " + dataValue);
        }

    到这里。基本就已经完毕了。数据库中的insert 以及create table 也直接上代码
    不上台面的方法大家就睁一仅仅眼闭一仅仅眼吧。

    //新建表
       String tableMessage = "";
       for(int i = 0 ; i < dataLength ; i++){
        tableMessage += data[i];
       }
       String sql_newTable = "CREATE TABLE " + this.Clazz.getSimpleName() + "("
         + tableMessage.substring(0, tableMessage.length() - 1) + ")";
       System.out.println(sql_newTable);
       
       statement.execute(sql_newTable);
       //插入数据
       String sql_add = "insert into " + this.Clazz.getSimpleName() + "("
         + dataName.substring(0, dataName.length() - 1) + ") "//变量名
         + "values(" + dataValue.substring(0, dataValue.length() - 1) +")";//(?

    ,?,?,?

    )

       System.out.println(sql_add);
       statement.executeUpdate(sql_add);

    小白一枚,有错之处希望大家及时帮我改正。

  • 相关阅读:
    asp.net图片上传代码
    C#(同步调用、异步调用、异步回调)
    跨线程的控件调用
    C# ListView用法详解 很完整
    获取dataGridView双击时判断双击的是下面的行,还是列头
    加密解密类
    C# 中DataGridView 绑定List<T>做数据源的操作问题
    C#获取当前程序集的完整路径
    接口测试-小结
    接口测试用例
  • 原文地址:https://www.cnblogs.com/wzzkaifa/p/6944844.html
Copyright © 2020-2023  润新知