我正在开发一个使用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库的用户从该列表中选择一个? (因为这是一个库,所以不会提前执行,以便从数据库中获取名称)
答案 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;
}
}
由于这是有效的,我是否应该像这样使用它?
由于