如何提供使用JDBC更新多列的代码?

时间:2017-01-05 10:40:39

标签: java mysql jdbc

我正在开发一个使用MySql数据库的java应用程序。这将由我的一位同事用作外部罐子。

我的问题是他们需要更新表的某些列。有没有办法提供一种方法,他们可以选择要更新的列?

我知道的替代方法是为每列创建不同的方法,例如

Update.updateName(String name);
Update.updateAge(int age);
....

这需要花费很多精力来编写,因为有超过20列可用。

编辑

好吧,我似乎并不清楚:)

Update只是一个处理数据库更新的类。没有什么重要的。

因此,重新说一下,我需要一种方法来处理具有多列的表的更新。

我的代码将被其他人使用,所以我需要一种方法来使用一些方法来强制"强迫"他们从可用列中选择一列(或多个列),而不是让它们作为自由文本插入。

我们说我有一张这样的桌子

name    varchar(50)
age     int(3)
address varchar(300)

如果我只有这三列我会做

public class Update{
  public void updateName(String name,int id){
     //connect to mysql and update name
  }

  public void updateAge(int age,int id){
     //connect to mysql and update age
  }

  public void updateAddress(String address,int id){
     //connect to mysql and update address
  }
}

我的同事们会这样做

Update update =new Update();
update.updateName("newName",1);
update.updateAge(20,1);
.....

正如我之前提到的那样,由于桌子的大小,这需要很多努力。有没有办法去装载"我的代码上的列名,并允许jar库的用户从该列表中选择一个? (因为这是一个库,所以不会提前执行,以便从数据库中获取名称)

4 个答案:

答案 0 :(得分:3)

如果您希望这样做,我建议为每个列名使用willUpdateDeviceList。即:

enum

使用方法public enum ColumnName { FistName("first_name"), LastName("last_name"); private String columnName; private ColumnName(String name){ this.columnName = name; } public String getColumnName(){ return this.columnName; } } ,用以下内容替换内部代码:

“UPDATE TableName SET”+ cn.getColumnName()+“=”+ value +“WHERE ...”

希望这很清楚并有所帮助。

答案 1 :(得分:2)

我不确定我理解你的问题,我希望以下代码可以提供帮助。

public void updateTableColumns(){
    Connection c = DBConnection.getConnection(); //Connect with SQL DateBase
    String sql = "update tableName set column1 = ? , column2 = ? , column3 = ? where rowName = ?";  //Create a SQL sentence 
    try {
        PreparedStatement ps = c.prepareStatement(sql); 
        ps.setString(1, "Value of column1");// Set value for each ?
        ps.setString(2, "Value of column2");
        ps.setString(3, "Value of column3");
        ps.setString(4, "Value of rowName");

        ps.execute(sql); //execute the sql sentence in sql database
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

如果你想要columnName灵活,你可以使用String concate make columnName到一个变量。 - george970 1分钟前

答案 2 :(得分:0)

以下插图可能会对您有所帮助。

public SomeClass{
    //select the columns for update and add them into a List.
      selectedColumnList.add(columnNames);
    //insert values for columns to update in another List.
      valuesToUpdateList.add(values);
}

然后你可以执行下面提到的查询

String columns=selectedColumnList.get(0)+"='"+valuesToUpdateList.get(0)+"'";
for(int i=1;i<selectedColumnList.size();i++){
    columns = columns+","+selectedColumnList.get(i)+"='"+valuesToUpdateList.get(i)+"'";
}
String query = "UPDATE table_name SET columns WHERE something='some value';"

我希望它对您有所帮助,谢谢

答案 3 :(得分:0)

我不确定这是否是正确的方法,但它对我有用,所以我也希望听到你的想法。 首先,我创建了一个包含列名称的类

public class ColumnNames {

    String column;
    public String getColumn(){      
        return column;
    }

    public ColumnNames name(){
        column = "name";
        return this;
        }
    public ColumnNames status(){
        column = "status";
        return this;
        }
    public ColumnNames url(){
        column = "url";
        return this;
        }
    public ColumnNames postalCode(){
        column = "postalCode";
        return this;
        }
.....

}

然后我创建了一个可以处理更新过程的类。

public class Update {
/**
     * A class containing the column names and the new values
     */
    class UploadData{
        private ColumnNames column;
        private String value;

        public String getValue(){
            return value;
        }
        public String getColumnName(){
            return column.getColumn();
        }
        UploadData(ColumnNames column,String value){
            this.column=column;
            this.value=value;
        }
}
    //An array List that would hold the column title and the value 
    List<UploadData> uploadDatas=new ArrayList<UploadData>();
    public void addItem(ColumnNames column,String value){
        uploadDatas.add(new UploadData(column,value));
    }
    public List<UploadData> getItems(){
        return uploadDatas;
}
}

然后设置我想要更新的值

Update up =new Update();
up.addItem(new ColumnNames().name(), "Name");
up.addItem(new ColumnNames().status(),"active");
up.addItem(new ColumnNames().postalCode(),"xxxxx");
.....

使用这些值更新表格 更新(上);

public boolean update(Update up){
        Connection conn = null;

        String updateTable="update table set ";
        for(int i=0;i<up.getItems().size();i++){
            updateTable+=up.getColumnName(i)+"='"+up.getValue(i)+"' ";
            if(i<up.getItems().size()-1){
                updateTable+=", ";
            }
        }
        updateTable+=" where ...";
        try {
            conn = DriverManager.getConnection(DB_ADDRS,DB_USER,DB_PASS);

            boolean result=conn.createStatement().execute(updateTable);
            try{conn.close();}catch (Exception e1) { /* ignored */ }
            return result;
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            try{conn.close();}catch (Exception e2) { /* ignored */ }
            return false;
        }
}

由于这是有效的,我是否应该像这样使用它?

由于