SpringMVC学习历程04-SSM实战03增加搜索功能
添加搜索功能
1.在allBook.jsp里添加搜索功能的按钮和样式
<div class="col-md-4 column">
<%--查询搜索框--%>
<form action="${pageContext.request.contextPath}/book/queryBook" method="post" style="float: right;">
<input type="text" name="queryBookName" class="form-control" placeholder="输入要查询的书籍名称">
<input type="submit" value="查询" class="btn btn-primary">
</form>
</div>
注意:这段代码里的name="queryBookName"要和Controller里的方法参数一样
2.因为之前写service层dao层的时候增加了一个查询方法和SQL语句映射,所以我们不用额外写,直接写Controller层
//模糊查询书籍
@RequestMapping("/queryBook")
public String queryBook(String queryBookName,Model model) {
List<Books> list = bookService.queryBookByName(queryBookName);
//查询优化
if (list == null) {
list = bookService.queryAllBook();
}
model.addAttribute("list", list);
return "allBook";
}
这里加入了判断语句,如果接受的信息是空值,则执行其他方法
但是,sql语句的方法是直接查询(原代码)
<select id="queryBookByName" resultType="Books">
select * from ssmbuild.books where bookName = #{bookName}
</select>
好处是即使是个空值,也可以进行页面的跳转 坏处是搜索必须整段搜索,即跟表的字段一模一样不能少
<select id="queryBookByName" resultType="Books">
select * from ssmbuild.books
<where>
<if test="bookName != null">
bookName like CONCAT('%', bookName, '%')
</if>
</where>
</select>
于是我改成了模糊查询,即上面的代码,解决了搜索功能死板的问题,可以模糊查询,但是一旦空值查询,就会出现页面状态码报错
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 4
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1013)
org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:908)
javax.servlet.http.HttpServlet.service(HttpServlet.java:652)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:882)
javax.servlet.http.HttpServlet.service(HttpServlet.java:733)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:118)
原因是因为
这个错误是由于在使用 MyBatis 的 selectOne() 方法时,预期只返回一个结果或 null,但实际上查询返回了多个结果(在这个例子中是 4 个结果)。selectOne() 方法通常用于执行那些应该只返回一个结果集的查询,比如根据主键查询单条记录。