Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Cách chèn giá trị trong bảng có cột động Jdbc / Mysql

Bạn cũng có thể sử dụng siêu dữ liệu cơ sở dữ liệu để lấy tên cột. Điều này có lợi thế là bạn thậm chí không cần biết tên cột, thay vào đó chúng được truy xuất động trong mã của bạn.

public static List<String> getColumns(String tableName, String schemaName) throws  SQLException{

    ResultSet rs=null;

    ResultSetMetaData rsmd=null;
    PreparedStatement stmt=null;
    List<String> columnNames =null;
    String qualifiedName = (schemaName!=null&&!schemaName.isEmpty())?(schemaName+"."+tableName):tableName;
    try{
        stmt=conn.prepareStatement("select * from "+qualifiedName+" where 0=1");
        rs=stmt.executeQuery();//you'll get an empty ResultSet but you'll still get the metadata
        rsmd=rs.getMetaData();
        columnNames = new ArrayList<String>(); 
        for(int i=1;i<=rsmd.getColumnCount();i++)
            columnNames.add(rsmd.getColumnLabel(i));    
    }catch(SQLException e){
        throw e;//or log it
    }
    finally{
        if(rs!=null)
            try {
                rs.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                throw e
            }
        if(stmt!=null)
            try {
                stmt.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                throw e
            }
    }
    return columnNames;
}

Khi bạn có tên cột, bạn có thể sử dụng nó như bình thường (List.size () tất nhiên sẽ cung cấp số lượng cột).

CẬP NHẬT:

//I will assume that your values (data to be inserted) is a List of Object types and that it is already populated



List<Object> data = new ArrayList<>();
    //you will populate this list

    //getting the column names
    List<String> columnNames = getColumns("MyTable", "MyDB");

    String insertColumns = ""; 
    String insertValues = "";

    if(columnNames != null && columnNames.size() > 0){
        insertColumns += columnNames.get(0);
        insertValues += "?";
    }


    for(int i = 1; i < columnNames.size();i++){
      insertColumns += ", " + columnNames.get(i) ;
      insertValues += "?";
    }

    String insertSql = "INSERT INTO MyDB.MyTable (" + insertColumns + ") values(" + insertValues + ")"; 

    try{
    PrepareStatement ps = conn.prepareStatement(insertSql);

    for(Object o : data){
     ps.setObject(o); //you must pass objects of correct type
    }
    ps.execute(); //this inserts your data
    }catch(SQLException sqle){
      //do something with it
    }

Mã này giả sử rằng bạn chuyển các đối tượng có kiểu chính xác vào phương thức PreparedStatement.setObject (Đối tượng o). Cũng có thể truy xuất các loại cột bằng cách sử dụng thông tin siêu cơ sở dữ liệu và sau đó sử dụng thông tin đó để thực thi kiểm tra loại nhưng điều đó sẽ làm cho mã của bạn phức tạp hơn nhiều



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tính toán phần trăm từ lần truy cập gần đây trong MySQL

  2. SQLite nhanh hơn MySQL?

  3. Truyền một mảng đến một truy vấn bằng mệnh đề WHERE

  4. Chuyển đổi dự phòng tự động sao chép không đồng bộ trong MySQL 8.0.22

  5. cách dễ dàng để chọn các hàng từ tất cả các bảng