使用注解完成动态sql时出现 java.sql.SQLSyntaxErrorException: ORA-00971: 缺失 SET 关键字
异常信息:
### The error may involve com.baizhi.dao.BookDao.uodateBook-Inline
### The error occurred while setting parameters
### SQL: update t_book setbookname=?,author=?,status=?
### Cause: java.sql.SQLSyntaxErrorException: ORA-00971: 缺失 SET 关键字
at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)
at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:200)
at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:62)
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:59)
at com.sun.proxy.$Proxy16.uodateBook(Unknown Source)
at com.baizhi.service.impl.BookServiceImpl.updateBook(BookServiceImpl.java:119)
at com.baizhi.action.BookAction.updateBook(BookAction.java:127)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
可以看到异常信息中有
setbookname=?,很明显这是由于没有分隔set和bookname的原因,查看相应的方法,代码如下:
public String updateProvider(Book b){
//可以看到由于set后没有空格造成set与bookname连在一起
String sql="update t_book set";
if (b.getBookname()!=null){
sql+="bookname=#{bookname},";
}
if (b.getPrice()!=null){
sql+="price=#{price},";
}
if (b.getAuthor()!=null){
sql+="author=#{author},";
}
if (b.getNum()!=null){
sql+="num=#{num},";
}
if (b.getDescribe()!=null){
sql+="describe=#{describe},";
}
if (b.getStatus()!=null){
sql+="status=#{status}";
}
if(sql.endsWith(",")){
sql.substring(0,sql.length()-1);
}
System.out.println(sql);
return sql;
}
因此需要在set后加上空格分隔。