请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

分页问题

HTTP Status 500 - Request processing failed; nested exception is org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException:
type Exception report
message Request processing failed; nested exception is org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException:
description The server encountered an internal error that prevented it from fulfilling this request.
exception
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException: 
### Error querying database.  Cause: java.lang.NullPointerException
### The error may exist in file [/usr/local/Cellar/tomcat/8.5.4/libexec/webapps/ROOT/WEB-INF/classes/mapper/AdDao.xml]
### The error may involve defaultParameterMap
### The error occurred while setting parameters
### Cause: java.lang.NullPointerException
	org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:982)
	org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
	org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
	org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
	org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:121)
	org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
root cause
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException: 
### Error querying database.  Cause: java.lang.NullPointerException
### The error may exist in file [/usr/local/Cellar/tomcat/8.5.4/libexec/webapps/ROOT/WEB-INF/classes/mapper/AdDao.xml]
### The error may involve defaultParameterMap
### The error occurred while setting parameters
### Cause: java.lang.NullPointerException
	org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:77)
	org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:446)
	com.sun.proxy.$Proxy17.selectList(Unknown Source)
	org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:230)
	org.apache.ibatis.binding.MapperMethod.executeForMany(MapperMethod.java:122)
	org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:64)
	org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:53)
	com.sun.proxy.$Proxy18.selectByPage(Unknown Source)
	org.imooc.service.impl.AdServiceImpl.searchByPage(AdServiceImpl.java:63)
	org.imooc.controller.content.AdController.initList(AdController.java:27)
	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	java.lang.reflect.Method.invoke(Method.java:498)
	org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:222)
	org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137)
	org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110)
	org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:814)
	org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:737)
	org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
	org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959)
	org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893)
	org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
	org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
	org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
	org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
	org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:121)
	org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
root cause
org.apache.ibatis.exceptions.PersistenceException: 
### Error querying database.  Cause: java.lang.NullPointerException
### The error may exist in file [/usr/local/Cellar/tomcat/8.5.4/libexec/webapps/ROOT/WEB-INF/classes/mapper/AdDao.xml]
### The error may involve defaultParameterMap
### The error occurred while setting parameters
### Cause: java.lang.NullPointerException
	org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)
	org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:122)
	org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:113)
	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	java.lang.reflect.Method.invoke(Method.java:498)
	org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:433)
	com.sun.proxy.$Proxy17.selectList(Unknown Source)
	org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:230)
	org.apache.ibatis.binding.MapperMethod.executeForMany(MapperMethod.java:122)
	org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:64)
	org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:53)
	com.sun.proxy.$Proxy18.selectByPage(Unknown Source)
	org.imooc.service.impl.AdServiceImpl.searchByPage(AdServiceImpl.java:63)
	org.imooc.controller.content.AdController.initList(AdController.java:27)
	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	java.lang.reflect.Method.invoke(Method.java:498)
	org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:222)
	org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137)
	org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110)
	org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:814)
	org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:737)
	org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
	org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959)
	org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893)
	org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
	org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
	org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
	org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
	org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:121)
	org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
root cause
java.lang.NullPointerException
	org.imooc.dao.interceptor.PageInterceptor.intercept(PageInterceptor.java:39)
	org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)
	com.sun.proxy.$Proxy29.prepare(Unknown Source)
	org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:76)
	org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:61)
	org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:303)
	org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:154)
	org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:102)
	org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:82)
	org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:120)
	org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:113)
	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	java.lang.reflect.Method.invoke(Method.java:498)
	org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:433)
	com.sun.proxy.$Proxy17.selectList(Unknown Source)
	org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:230)
	org.apache.ibatis.binding.MapperMethod.executeForMany(MapperMethod.java:122)
	org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:64)
	org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:53)
	com.sun.proxy.$Proxy18.selectByPage(Unknown Source)
	org.imooc.service.impl.AdServiceImpl.searchByPage(AdServiceImpl.java:63)
	org.imooc.controller.content.AdController.initList(AdController.java:27)
	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	java.lang.reflect.Method.invoke(Method.java:498)
	org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:222)
	org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137)
	org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110)
	org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:814)
	org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:737)
	org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
	org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959)
	org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893)
	org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
	org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
	org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
	org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
	org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:121)
	org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
note The full stack trace of the root cause is available in the Apache Tomcat/8.5.4 logs.
Apache Tomcat/8.5.4

做分页的时候遇到这个报错,研究两三天了,解决不了。老师给看看怎么回事

AdDao.xml这样写的:

<select id="selectByPage" resultType="Ad">
    select id,title,img_file_name,link,weight from ad
    <where>
        <if test="title != null and title != ''">
            title like '%' #{title} '%'
        </if>
    </where>
    order by weight desc,id
</select>


正在回答

11回答

单纯的模仿会有问题的,要想一想,难道非要在

AdDto adDto = new AdDto();

的时候也同时new一个Page对象才可以吗?我的代码没报错,而你的报错,就是因为模仿时,会有疏漏,要有自己的想法才行,不过你已经有收获了,因为你现在这种写法是个办法,不一定非要和我的代码一模一样,但要知道【为什么】,这个非常非常重要!想想,【为什么】

0 回复 有任何疑惑可以回复我~
  • 提问者 田心枫 #1
    非常感谢!
    回复 有任何疑惑可以回复我~ 2017-06-01 22:29:32
  • 源_ #2
    我也被这个错误拦了几个小时,原来是BaseBean里没有写构造函数初始化page对象。用private Page page = new Page();也行
    回复 有任何疑惑可以回复我~ 2017-11-06 19:54:36
源生活 2017-06-01 22:19:40

嘿嘿,你的没错,我的也没错!

想想,如何让我的代码不报错?

0 回复 有任何疑惑可以回复我~
  • 提问者 田心枫 #1
    在AdDto里面直接new一个Page吗?
    回复 有任何疑惑可以回复我~ 2017-06-01 22:22:08
  • 源生活 回复 提问者 田心枫 #2
    嗯,很好,差不多这个意思,我在BeseBean的构造函数里已经把Page对象创建好了。
    回复 有任何疑惑可以回复我~ 2017-06-01 22:26:09
提问者 田心枫 2017-06-01 22:17:26

老师  

这个地方初始化广告列表页面的时候AdDto adDto = new AdDto()后,要new 一个Page吧?然后adDto.setPage(page);不然直接用adDto里面的Page对象是null吧。

0 回复 有任何疑惑可以回复我~
提问者 田心枫 2017-06-01 22:12:14
@RequestMapping
public String init(Model model) {
   AdDto adDto = new AdDto();
   Page page = new Page();
   adDto.setPage(page);
   model.addAttribute("list", adService.searchByPage(adDto));
   model.addAttribute("searchParam", adDto);
   return "/content/adList";
}
@RequestMapping
public String init(Model model) {
   AdDto adDto = new AdDto();
   model.addAttribute("list", adService.searchByPage(adDto));
   model.addAttribute("searchParam", adDto);
   return "/content/adList";
}

下面这种方法不对  照着老师视频上的错了

0 回复 有任何疑惑可以回复我~
新手上路wn 2017-06-01 20:23:13

<select id="selectByPage" resultType="Ad">

    select id,title,img_file_name,link,weight from ad

    <where>

        <if test="title != null and title != ''">

            title like '%' #{title} '%'

        </if>

    </where>

    order by weight desc,id

</select>

like '%'#{title}'%' 不能这么写

1、可以把%在传入的时候添加到title字段
2、也可以使用CONCAT('%,', #{id}, ',%'),这个函数是mysql的,其他sql有其他写法

0 回复 有任何疑惑可以回复我~
  • 这位同学说的第1、2都是对的,但是:
    【like '%'#{title}'%' 不能这么写】这句话有点不准确,
    Mysql比较特殊,字符串的拼接,可以是两个字符串中间用空格隔开即可,这里的【'%' #{title} '%'】两两之间是有空格的,不是不能这么写,是很多人没注意到代码里其实是:
    【'%'空格#{title}空格'%'】
    回复 有任何疑惑可以回复我~ 2017-06-01 20:58:56
  • 又学到了
    回复 有任何疑惑可以回复我~ 2017-06-01 21:35:31
源生活 2017-06-01 16:39:21

分页拦截器只是共通,它并不知道怎么个分法:【每页显示多少条】、【当前需要的是第几页】,这些都要有人告诉它。

谁告诉它的?以【ByPage】结尾的Dao层方法,Dao层方法里参数又是谁给的?Service层,Service层的参数又是谁给的?

Controller,视频里,到底最终是谁决定了:【每页显示多少条】、【当前需要的是第几页】?

直接告诉你,没有任何意义。我相信这样说你再跟着视频看,如果看懂了,一定能解决问题,祝你成功!

0 回复 有任何疑惑可以回复我~
  • 提问者 田心枫 #1
    好的 谢谢老师 我在看看  好像有些地方真的没弄懂  我在多看看视频  琢磨琢磨
    回复 有任何疑惑可以回复我~ 2017-06-01 17:07:12
  • 提问者 田心枫 #2
    我分页出不来不是上面那个原因
    回复 有任何疑惑可以回复我~ 2017-06-01 22:10:26
源生活 2017-06-01 16:26:57

问题不在分页拦截器本身了,分页拦截器最多加个判断可以防止【空指针异常】的发生,但结果肯定是错的,仔细看视频,想想,是哪出问题了。

0 回复 有任何疑惑可以回复我~
  • 提问者 田心枫 #1
    好的。
    回复 有任何疑惑可以回复我~ 2017-06-01 16:28:23
提问者 田心枫 2017-06-01 16:20:13

是的https://img1.sycdn.imooc.com/szimg//592fce2b0001415425121480.jpg.

0 回复 有任何疑惑可以回复我~
  • 你已经找到问题的原因了,知道怎么解决吗?
    回复 有任何疑惑可以回复我~ 2017-06-01 16:21:35
  • 提问者 田心枫 回复 源生活 #2
    说实话  还不知道啊
    回复 有任何疑惑可以回复我~ 2017-06-01 16:23:59
  • 源生活 回复 提问者 田心枫 #3
    反复看下广告接口的视频,从发起请求-->Controller-->Service-->Dao-->分页拦截器,page对象在这个过程中,从哪开始产生的?反复看一下,不要轻易说不知道。
    回复 有任何疑惑可以回复我~ 2017-06-01 16:29:02
提问者 田心枫 2017-06-01 15:49:06
package org.imooc.dao.interceptor;

import org.apache.ibatis.executor.parameter.ParameterHandler;
import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.plugin.Intercepts;
import org.apache.ibatis.plugin.Invocation;
import org.apache.ibatis.plugin.Plugin;
import org.apache.ibatis.plugin.Signature;
import org.apache.ibatis.reflection.DefaultReflectorFactory;
import org.apache.ibatis.reflection.MetaObject;
import org.apache.ibatis.reflection.SystemMetaObject;
import org.imooc.bean.BaseBean;
import org.imooc.bean.Page;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Properties;

@Intercepts({@Signature(type=StatementHandler.class,method="prepare",args={Connection.class})})
public class PageInterceptor implements Interceptor{

   @Override
   public Object intercept(Invocation arg0) throws Throwable {
      StatementHandler statementHandler = (StatementHandler)arg0.getTarget();
      MetaObject metaObject = MetaObject.forObject(statementHandler, SystemMetaObject.DEFAULT_OBJECT_FACTORY, SystemMetaObject.DEFAULT_OBJECT_WRAPPER_FACTORY,new DefaultReflectorFactory());
      MappedStatement mappedStatement = (MappedStatement)metaObject.getValue("delegate.mappedStatement");
      String id = mappedStatement.getId();
      if(id.endsWith("ByPage")) {
         BoundSql boundSql = statementHandler.getBoundSql();
         String sql = boundSql.getSql();
         String countSql = "select count(*) from(" + sql + ")t";
         Connection conn = (Connection)arg0.getArgs()[0];
         PreparedStatement statement = conn.prepareStatement(countSql);
         ParameterHandler parameterHandler = (ParameterHandler)metaObject.getValue("delegate.parameterHandler");
         parameterHandler.setParameters(statement);
         ResultSet rs = statement.executeQuery();
         BaseBean bean = (BaseBean)boundSql.getParameterObject();
         Page page = bean.getPage();
         if(rs.next()) {
            page.setTotalNumber(rs.getInt(1));
         }
         String pageSql = sql + " limit " + (page.getCurrentPage() - 1) * page.getPageNumber() + "," + page.getPageNumber();
         metaObject.setValue("delegate.boundSql.sql", pageSql);
      }
      return arg0.proceed();
   }

   @Override
   public Object plugin(Object arg0) {
      return Plugin.wrap(arg0, this);
   }
   @Override
   public void setProperties(Properties arg0) {

   }

}

那个我已经看过了。PageInterceptor是这样的。

0 回复 有任何疑惑可以回复我~
源生活 2017-06-01 14:24:56

### The error may involve defaultParameterMap
### The error occurred while setting parameters

根据这两行提示,非常有可能是分页拦截器里:

PreparedStatement statement = conn.prepareStatement(countSql);
ParameterHandler parameterHandler = (ParameterHandler)metaObject.getValue("delegate.parameterHandler");
parameterHandler.setParameters(statement);

这几行代码,有写错的,导致PreparedStatement在执行SQL时,参数为空。

建议:

把《通过自动回复机器人学Mybatis---加强版》中分页拦截器的讲解认真看完再接着看这边的。

本门课提到的基础课程都是有原因,如果不熟悉是必须要看懂的,不是可看可不看的。

0 回复 有任何疑惑可以回复我~
源生活 2017-06-01 14:14:04

org.imooc.dao.interceptor.PageInterceptor.intercept(PageInterceptor.java:39)

分页拦截器PageInterceptor第39行空指针,你先自己判断一下,这一行是什么导致的空指针,然后不行把分页拦截器代码贴出来看下。

0 回复 有任何疑惑可以回复我~
  • 提问者 田心枫 #1
    PageInterceptor贴在上面了
    回复 有任何疑惑可以回复我~ 2017-06-01 15:49:32
  • 源生活 回复 提问者 田心枫 #2
    这个在你开发环境中,第39行是哪一句?你打断点调试过了吗?哪个对象为空?
    回复 有任何疑惑可以回复我~ 2017-06-01 16:08:38
  • 提问者 田心枫 回复 源生活 #3
    我断点看过了  又改了下  是这行空指针:page.setTotalNumber(rs.getInt(1));
    回复 有任何疑惑可以回复我~ 2017-06-01 16:10:52

相似问题

登录后可查看更多问答,登录/注册

问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信