在这种情况下如何动态地形成插入查询

时间:2014-11-04 10:58:01

标签: java

我有一个用@符号分隔的输入字符串,如图所示

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 

我的问题是我怎样才能动态地形成这个?

3 个答案:

答案 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/

祝你好运,不要停止探索