2 xuanwomingren01 Xuanwomingren01 于 2017.01.16 14:11 提问

谁能看下那里错了,sql问题
sql

public List SerachLog(String module, String target, String method, String targetID, String eventType,
String eventLevel) {
// TODO Auto-generated method stub
List logs = new ArrayList();
try {
/**
* 拼接sql
*/

        String sqlStr3 = "select * from logs where 1 = 1";

        if (!"".equals(module) && module != null) {
            sqlStr3 += "and module='" + module + "' ";
        }
        if (!"".equals(target) && target != null) {
            sqlStr3 += "and target='" + target + "' ";
        }
        if (!"".equals(method) && method != null) {
            sqlStr3 += "and method='" + method + "' ";
        }
        if (!"".equals(targetID) && targetID != null) {
            sqlStr3 += "and targetID='" + targetID + "' ";
        }
        if (!"".equals(eventType) && eventType != null) {
            sqlStr3 += "and eventType='" + eventType + "' ";
        }
        if (!"".equals(eventLevel) && eventLevel != null) {
            sqlStr3 += "and eventLevel='" + eventLevel + "' ";
        }

        Connection con = JDBC.open();
        PreparedStatement ps = con.prepareStatement(sqlStr3);
        ResultSet rs = ps.executeQuery();//一会儿提示这里错误
        while (rs.next()) {
            Log log = new Log(rs.getString(5), rs.getString(6), rs.getString(7), rs.getString(8), rs.getString(9),
                    rs.getString(10));
            logs.add(log);//一会儿又说这里错了
        }
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return logs;
}
----------------------------------------------------------
错误提示
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'module='n'' at line 1
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
at com.mysql.jdbc.Util.getInstance(Util.java:386)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1052)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3609)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3541)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2002)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2163)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2624)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2127)
at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2293)
at cn.kerui.adapter.DBAdapter.SerachLog(DBAdapter.java:125)
at cn.kerui.test.Test1.main(Test1.java:49)
----------------------------------------------
List<Log> Q = as.SerachLog("n", null, null, null, null, null);
    System.out.println(Q.size());
    测试语句

8个回答

haikuokuangtu
haikuokuangtu   2017.01.16 14:18
已采纳

首先不知道你的1=1是干什么的,其次每一个and前面要有空格

a2279860a
a2279860a 一楼正解
11 个月之前 回复
qq_34379959
qq_34379959 1楼正解
11 个月之前 回复
Xuanwomingren01
Xuanwomingren01 1=1使它永远成立 参数全为空值 可以查全部
11 个月之前 回复
lihongbiao0610
lihongbiao0610   Rxr 2017.01.16 14:15

把你的sqlStr3 打印出来,不就知道了吗
应该是sqlStr3 += "and module='" + module + "' "; 改成 sqlStr3 += " and module='" + module + "' ";
多个空格

Xuanwomingren01
Xuanwomingren01 嗯嗯 感谢要多加个空格
11 个月之前 回复
u012976158
u012976158   2017.01.16 16:29

在 1=1 的后面加空格 , 下次再有类似的问题 你手动将拼接好的sql 打印出来。 自己手动 去数据库中执行一下 就知道了

static_coder
static_coder   2017.01.16 14:15

是不是多了单引号呀?你可以试试看

Xuanwomingren01
Xuanwomingren01   2017.01.16 14:18

谢谢 前面加了空格后好了

haikuokuangtu
haikuokuangtu   2017.01.16 14:23

需要吗,既然用了判断,当参数全是空值的时候,后面就可以不用有条件,直接全查询。

haikuokuangtu
haikuokuangtu 回复Xuanwomingren01: 如果是一直拼接的话就不用改了。因为前面的确需要一个不变的条件
11 个月之前 回复
Xuanwomingren01
Xuanwomingren01 直接去掉1=1? where后面不用跟什么吗?select * from logs where 感觉好怪异
11 个月之前 回复
haikuokuangtu
haikuokuangtu   2017.01.16 14:26

where 1=1去掉,把and都换成where,然后你试试就知道了

Xuanwomingren01
Xuanwomingren01 这样的话 要是设置两个参数 就有两个WHERE了 我刚试了 出错了
11 个月之前 回复
ericjrf
ericjrf   2017.01.16 15:29

还是建议先把sqlStr3打印出来看看是否有错,所有的and前面至少应该有一个空格。
你现在打印出来的sql应该是select * from logs where 1 = 1and XXX=XXXand XXX=XXX...这种形式

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!