我有一个用@符号分隔的输入字符串,如图所示
Popcorn@Bucket
我有一张表格如图所示
mysql> desc document;
+-----------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+-------------+------+-----+---------+----------------+
| document_id | int(11) | NO | PRI | NULL | auto_increment |
| T1 | varchar(50) | YES | | NULL | |
| T2 | varchar(50) | YES | | NULL | |
| T3 | varchar(50) | YES | | NULL | |
| T4 | varchar(50) | YES | | NULL | |
| T5 | varchar(50) | YES | | NULL | |
| T6 | varchar(50) | YES | | NULL | |
| T7 | varchar(50) | YES | | NULL | |
| T8 | varchar(50) | YES | | NULL | |
| T9 | varchar(50) | YES | | NULL | |
| T10 | varchar(50) | YES | | NULL | |
| vendor_brand_id | varchar(10) | YES | | NULL | |
| vendor_id | varchar(10) | YES | | NULL | |
+-----------------+-------------+------+-----+---------+----------------+
根据输入我试图形成如图所示的插入查询
String reqstr = "Popcorn@Bucket"
String valuess[] = reqstr.split("@");
if (valuess.length == 1) {
sql = "Insert into document (T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,vendor_brand_id,vendor_id) values ('"+valuess[0]+"',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,"+vendor_brand_id+","+vendor_id+") ";
}
else if (valuess.length == 2) {
sql = "Insert into document (T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,vendor_brand_id,vendor_id) values ('"+valuess[0]+"','"+valuess[1]+"',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,"+vendor_brand_id+","+vendor_id+") ";
}
// Upto length 10
我的问题是我怎样才能动态地形成这个?
答案 0 :(得分:1)
我猜您可以使用PreparedStatement来构建查询
检查link。
构建查询后,您可以根据收到的输入在查询中设置值,也可以设置为null。
答案 1 :(得分:1)
如何使用StringBuilder
StringBuilder sb = new StringBuilder();
sb.append("Insert into document (T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,vendor_brand_id,vendor_id) values (");
for (int i = 0; i < 10; i++) {
if (i < valuess.length) {
sb.append("'" + valuess[i] + "',");
} else {
sb.append("NULL,");
}
}
sb.append(vendor_brand_id+","+vendor_id+")");
//now sb.toString() is ready for required sql
System.out.println(sb.toString());
答案 2 :(得分:0)
虽然您可以使用StringBuilder解决问题的动态方面,但我会强烈反对这种方法,因为它忽略了为避免对前端和后端进行此类操作而开发的大量技术/框架
我可以指出的第一件事是,尽管你可以传递由角色分隔的值,但它可能不一定是个好主意。例如,如果订单很重要,那么当有人通过时(t1,t3,t6),上述方法将失败。分隔的字符串不指定变量的顺序。因此,为了正确地定义分隔值,您需要另一个分隔符,因此为实际应该解决的简单问题添加更多复杂性....即使订单不是问题,它也会非常难别人了解使用这种方法的情况;甚至你,如果你必须在一段时间后回去查看这段代码:)
我假设您正在使用Java,因此请查看以下内容:
http://www.edu4java.com/en/servlet/servlet3.html
它应该让您了解如何使用servlet和表单重写您的问题。如果这太模糊或令人困惑,那么总是有谷歌:)
其次,如果你上面的部分是正确的,那么你可以像其他人所建议的那样在Java中使用PreparedStatment,而不需要做任何动态的事情。如果您阅读并理解Java如何与数据库一起工作,您将看到您尝试制作的动态SQL方法几乎没有任何好处。见这个例子:
http://www.mkyong.com/jdbc/jdbc-preparestatement-example-insert-a-record/
祝你好运,不要停止探索