mybatis实现简单分页功能 - 完整代码版

本文详细介绍了如何使用MyBatis实现分页查询,包括数据库搭建、环境配置、代码实现及异常处理,展示了学生信息的分页展示过程。
实现效果图 :

在这里插入图片描述

项目结构搭建

在这里插入图片描述

代码实现

1.数据库搭建

CREATE DATABASE teachsys
USE teachsys

CREATE TABLE teacher(
id INT(10) PRIMARY KEY AUTO_INCREMENT,
tname VARCHAR(20)
);
INSERT INTO teacher VALUES(DEFAULT, 1);
INSERT INTO teacher VALUES(DEFAULT, 2);


CREATE TABLE student(
id INT(10) PRIMARY KEY AUTO_INCREMENT,
sname VARCHAR(20),
sage INT(3),
tid INT(10),
CONSTRAINT fk_teacher FOREIGN KEY (tid) REFERENCES teacher(id)
);

INSERT INTO student VALUES(DEFAULT,'学生1',22,1);
INSERT INTO student VALUES(DEFAULT,'学生2',22,1);
INSERT INTO student VALUES(DEFAULT,'学生3',22,1);
INSERT INTO student VALUES(DEFAULT,'学生4',22,1);
INSERT INTO student VALUES(DEFAULT,'学生5',22,1);
INSERT INTO student VALUES(DEFAULT,'学生6',22,1);
INSERT INTO student VALUES(DEFAULT,'学生7',22,1);
INSERT INTO student VALUES(DEFAULT,'学生8',22,1);
INSERT INTO student VALUES(DEFAULT,'学生9',22,2);
INSERT INTO student VALUES(DEFAULT,'学生10',22,2);
INSERT INTO student VALUES(DEFAULT,'学生11',22,2);
INSERT INTO student VALUES(DEFAULT,'学生12',22,2);
INSERT INTO student VALUES(DEFAULT,'学生13',22,2);
INSERT INTO student VALUES(DEFAULT,'学生14',22,2);

2. mybatis环境搭建

2.1 mybatis基础配置

  • 导包
    该项目所有依赖包下载

  • src下新建mybatis-config.xml配置文件

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration
            PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>
        <!--引入log4j-->
        <settings>
            <setting name="logImpl" value="LOG4J"/>
        </settings>
        <!--pojo包下类的别名,使用后在xxxMapper.xml中resultType等就可以直接使用
            JavaBean的对象名
        -->
        <typeAliases>
            <package name="com.daohewang.pojo"/>
        </typeAliases>
        <environments default="development">
            <environment id="development">
                <transactionManager type="JDBC"/>
                <dataSource type="POOLED">
                    <property name="driver" value="com.mysql.jdbc.Driver"/>
                    <property name="url" value="jdbc:mysql://localhost:3306/teachsys"/>
                    <property name="username" value="root"/>
                    <property name="password" value="123"/>
                </dataSource>
            </environment>
        </environments>
        <!--接口绑定需要使用package,下面的是不使用接口绑定情况,需要注意
    		<mappers>
                <mapper resource="com/daohewang/mapper/AccountMapper.xml"/>
                <mapper resource="com/daohewang/mapper/LogMapper.xml"/>
           </mappers>
    	-->
        <mappers>
            <package name="com.daohewang.mapper"/>
        </mappers>
    </configuration>
    
  • src下新建log4j.properties配置文件

    log4j.rootCategory=INFO, CONSOLE ,LOGFILE
    
    log4j.logger.com.daohewang.mapper=DEBUG
    
    
    log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
    log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
    log4j.appender.CONSOLE.layout.ConversionPattern=%C %p  %m %n
    
    log4j.appender.LOGFILE=org.apache.log4j.FileAppender
    log4j.appender.LOGFILE.File=E:/my.log
    log4j.appender.LOGFILE.Append=true
    log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
    log4j.appender.LOGFILE.layout.ConversionPattern=%C %p  %m %n
    
2.2 mybatis代码实现
com.daohewang.pojo包
  • Teacher.java

    public class Teacher {
        private int id;
        private String tname;
        get/set方法
    }
    
  • Student.java

    public class Student {
        private int id;
        private String sname;
        private int sage;
        private int tid;
        private Teacher teacher;
        get/set方法
    }
    
  • PageInfo.java

    public class PageInfo {
       /**
         * 每页显示个数
         */
        private int pageSize;
        /**
         * 当前属于第几页
         */
        private int currentPageNumber;
        /**
         * 总页数
         */
        private long totalPage;
        /**
         * 每页开始的序号
         */
        private int pageStart;
        /**
         * 学生姓名
         */
        private String sname;
        /**
         * 老师姓名
         */
        private String tname;
        /**
         *pageInfo列表
         */
        private List<?> list;
        get/set方法
    }
    
com.daohewang.mapper包
  • StudentMapper.java

    public interface StudentMapper {
        /**
         * 查询所有的学生信息
         * @param pageInfo
         * @return
         */
        List<Student> selByPage(PageInfo pageInfo);
    
        /**
         * 查询总共的学生条数
         * @param pageInfo
         * @return
         */
        long selCountByPageInfo(PageInfo pageInfo);
    }
    
  • StudentMapper.xml

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.daohewang.mapper.StudentMapper">
        <select id="selByPage" parameterType="pageinfo" resultType="student">
            select * from student
            <where>
                <if test="sname!=null and sname!=''">
                    <bind name="sname" value="'%'+sname+'%'"></bind>
                    and sname like #{sname}
                </if>
                <if test="tname!=null and tname!=''">
                    <bind name="tname" value="'%'+tname+'%'"></bind>
                    and tid in (select id from teacher where tname like #{tname})
                </if>
            </where>
            limit #{pageStart},#{pageSize}
        </select>
    
        <select id="selCountByPageInfo" resultType="long" parameterType="pageinfo">
            select count(*) from student
            <where>
                <if test="sname!=null and sname!=''">
                    <bind name="sname" value="'%'+sname+'%'"></bind>
                    and sname like #{sname}
                </if>
                <if test="tname!=null and tname!=''">
                    <bind name="tname" value="'%'+tname+'%'"></bind>
                    and tid in (select id from teacher where tname like #{tname})
                </if>
            </where>
        </select>
    </mapper>
    
  • TeacherMapper.java

    public interface TeacherMapper {
        /**
         * 根据id查询老师信息
         * @param id
         * @return Teacher对象
         */
        Teacher selById(int id);
    }
    
  • TeacherMapper.xml

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.daohewang.mapper.TeacherMapper">
        <select id="selById" resultType="Teacher" parameterType="int">
            SELECT * FROM teacher WHERE id=#{0}
        </select>
    </mapper>
    

    BUG警告:

    如果出现 no Result Maps were found for the Mapped Statement 说明你没有指定返回值,mybatis不知道你要返回什么,添加返回值即可。

    注意: 返回值和参数要写对了,不要写反了,不然会有你意想不到的错误

com.daohewang.utils包
  • MyBatisUtil.java
package com.daohewang.utils;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;
public class MyBatisUtil {
    private static SqlSessionFactory factory;
    private static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<>();
    static {
        try {
            InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
            factory = new SqlSessionFactoryBuilder().build(is);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    /**
     * 获取SqlSession方法
     */
    public static SqlSession getSession() {
        SqlSession session = threadLocal.get();
        if (session == null) {
            session = factory.openSession();
            threadLocal.set(session);
        }
        return session;
    }

    /**
     * 关闭session
     */
    public static void closeSession() {
        SqlSession session = threadLocal.get();
        if (session != null) {
            session.close();
        }
         threadLocal.set(null);
    }
}

BUG警告:

如果将下面中的代码
session = factory.openSession();
threadLocal.set(session);

简写为
threadLocal.set(factory.openSession());

将会出现空指针异常,慎重!!!
com.daohewang.filter包
  • OpenSessionInViewFilter.java

    package com.daohewang.filter;
    
    import com.daohewang.utils.MyBatisUtil;
    import org.apache.ibatis.session.SqlSession;
    
    import javax.servlet.*;
    import javax.servlet.annotation.WebFilter;
    import java.io.IOException;
    @WebFilter(filterName = "/*")
    public class OpenSessionInViewFilter implements Filter {
        @Override
        public void destroy() {
        }
    
        @Override
        public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
            SqlSession session = MyBatisUtil.getSession();
            try {
                chain.doFilter(req, resp);
                session.commit();
            } catch (Exception e) {
                session.rollback();
                e.printStackTrace();
            } finally {
                MyBatisUtil.closeSession();
            }
        }
    
        @Override
        public void init(FilterConfig config) throws ServletException {
    
        }
    
    }
    
com.daohewang.service包
  • StudentService.java

    public interface StudentService {
        /**
         * 查询每一页的页面信息
         * @param sname 学生姓名
         * @param tname 老师姓名
         * @param pageSize 每页显示的数目
         * @param currentPageNumer 当前属于第几页
         * @return
         */
        PageInfo showPage(String sname, String tname, String pageSize, String currentPageNumer);
    }
    
com.daohewang.service.impl包
  • StudentServiceImpl.java
package com.daohewang.service.impl;

import com.daohewang.mapper.StudentMapper;
import com.daohewang.mapper.TeacherMapper;
import com.daohewang.pojo.PageInfo;
import com.daohewang.pojo.Student;
import com.daohewang.service.StudentService;
import com.daohewang.utils.MyBatisUtil;
import org.apache.ibatis.session.SqlSession;
import org.apache.log4j.Logger;

import java.util.List;
public class StudentServiceImpl implements StudentService {
    @Override
    public PageInfo showPage(String sname, String tname, String pageSizeStr, String currentPageNumberStr) {
        int pageSize = 2;
        if (pageSizeStr != null && !pageSizeStr.equals("")) {
            pageSize = Integer.parseInt(pageSizeStr);
        }
        int currentPageNumber = 1;
        if (currentPageNumberStr != null && !currentPageNumberStr.equals("")) {
            currentPageNumber = Integer.parseInt(currentPageNumberStr);
        }
        SqlSession session = MyBatisUtil.getSession();
        StudentMapper studentMapper = session.getMapper(StudentMapper.class);

        PageInfo pi = new PageInfo();
        pi.setCurrentPageNumber(currentPageNumber);
        pi.setPageSize(pageSize);
        pi.setPageStart((currentPageNumber - 1) * pageSize);
        pi.setTname(tname);
        pi.setSname(sname);

        List<Student> list = studentMapper.selByPage(pi);
        //查询出每个学生对应的老师信息
        TeacherMapper teacherMapper = session.getMapper(TeacherMapper.class);
        for (Student student : list) {
            student.setTeacher(teacherMapper.selById(student.getTid()));
            // System.out.println(student.toString());
        }
        pi.setList(list);
        long count = studentMapper.selCountByPageInfo(pi);
       // System.out.println(count);
        Logger logger = Logger.getLogger(StudentServiceImpl.class);
        pi.setTotalPage(count % pageSize == 0 ? count / pageSize : count / pageSize + 1);
        return pi;
    }
}

com.daohewang.servlet包
  • ShowServlet.java

    package com.daohewang.servlet;
    
    import com.daohewang.pojo.PageInfo;
    import com.daohewang.service.StudentService;
    import com.daohewang.service.impl.StudentServiceImpl;
    import com.sun.xml.internal.bind.v2.runtime.unmarshaller.TagName;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    import java.io.IOException;
    @WebServlet(name = "ShowServlet", urlPatterns = "/ShowServlet")
    public class ShowServlet extends HttpServlet {
        private StudentService studentService = new StudentServiceImpl();
        @Override
        protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            String sname = req.getParameter("sname");
            if (sname != null && !sname.equals("")) {
                sname = new String(sname.getBytes("iso-8859-1"), "utf-8");
            }
            String tname = req.getParameter("tname");
            if (tname != null && !tname.equals("")) {
                tname = new String(tname.getBytes("iso-8859-1"), "utf-8");
            }
            String pageSize = req.getParameter("pageSize");
            String currentPageNumber = req.getParameter("currentPageNumber");
            PageInfo pageInfo = studentService.showPage(sname, tname, pageSize, currentPageNumber);
            req.setAttribute("pageinfo", pageInfo);
            req.getRequestDispatcher("index.jsp").forward(req, resp);
        }
    }
    

    index.jsp

    <%--
      Created by IntelliJ IDEA.
      User: Administrator
      Date: 2020/1/4
      Time: 11:05
      To change this template use File | Settings | File Templates.
    --%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <html>
    <head>
        <title>$Title$</title>
        <script type="text/javascript" src="js/jquery-1.7.2.js"></script>
        <script type="text/javascript">
            $(function () {
                var pageSize = "${pageinfo.pageSize}";
                var currentPageNumber = "${pageinfo.currentPageNumber}";
                var tname = "${pageinfo.tname}";
                var sname = "${pageinfo.sname}";
                var totalPage = "${pageinfo.totalPage}";
                //i表示循环脚标   n表示迭代变量  n=数组[i]  n是dom对象
    
                //dom对象转换成jquery对象 ->  $(dom对象)
                //把jquery对象转换成dom对象 ?   jquery对象[0]  jquery对象.get(0)
                $.each($(":radio"), function (i, n) {
                    if ($(n).val() == pageSize) {
                        $(n).attr("checked", "checked");
                    }
                });
                // 对输入框设置值
                $(":text[name='sname']").val(sname);
                $(":text[name='tname']").val(tname);
    
                // 查询按钮点击事件
                $("button").click(function () {
                    location.href = "ShowServlet?pageSize=" + pageSize + "&currentPageNumber=1&tname=" + $(":text[name='tname']").val() + "&sname=" + $(":text[name='sname']").val();
                })
    
                //单选按钮点击事件
                $(":radio").click(function () {
                    pageSize = $(this).val();
                    location.href = "ShowServlet?pageSize=" + pageSize + "&currentPageNumber=1&tname=" + $(":text[name='tname']").val() + "&sname=" + $(":text[name='sname']").val();
                })
                //点击上一页
                $(".page_a:eq(0)").click(function () {
                    currentPageNumber = parseInt(currentPageNumber) - 1;
                    if (currentPageNumber >= 1) {
                        location.href = "ShowServlet?pageSize=" + pageSize + "&currentPageNumber=" + currentPageNumber + "&tname=" + $(":text[name='tname']").val() + "&sname=" + $(":text[name='sname']").val();
                    } else {
                        pageNumber = 1;
                    }
                    return false;
                });
                //点击上一页
                $(".page_a:eq(1)").click(function () {
                    currentPageNumber = parseInt(currentPageNumber) + 1;
                    if (currentPageNumber <= total) {
                        location.href = "ShowServlet?pageSize=" + pageSize + "&currentPageNumber=" + currentPageNumber + "&tname=" + $(":text[name='tname']").val() + "&sname=" + $(":text[name='sname']").val();
                    } else {
                        currentPageNumber = totalPage;
                    }
                    return false;
                });
            });
        </script>
    </head>
    <body>
    <input type="radio" value="2" name="pageSize"/>2
    <input type="radio" value="3" name="pageSize"/>3
    <input type="radio" value="4" name="pageSize"/>4<br/>
    学生姓名:<input type="text" name="sname"/>老师姓名<input type="text" name="tname"/>
    <button>查询</button>
    <br/>
    <table border="1">
        <tr>
            <td>学生编号</td>
            <td>学生姓名</td>
            <td>年龄</td>
            <td>任课老师</td>
        </tr>
        <c:forEach items="${pageinfo.list }" var="stu">
            <tr>
                <td>${stu.id}</td>
                <td>${stu.sname}</td>
                <td>${stu.sage}</td>
                <td>${stu.teacher.tname}</td>
            </tr>
        </c:forEach>
    </table>
    <a href="" class="page_a">上一页</a><a href="" class="page_a">下一页</a>
    </body>
    </html>
    
    

    BUG警告: 如果jstl表达式不起作用,一般来说是你的表达式写错了,或者没有引入

    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    

BUG总结:

遇到控制台不报错误的BUG不要慌,一般可以按照以下的解决思路

  1. 先在需要输出结果的地方,在控制台打印一下看能否打印出来,如果不能,进入第二步

    • 如果是sql语句出不了,通过log4j看下是哪条语句出问题了

      log4j快速使用 
      
      1.引入log4j jar包支持
      2.配置log4j.propertis文件,具体使用可以自行查询,上面也给到了简单使用版本
      3.在mybatis-config.xml中加入这么一句
      <!--引入log4j-->
      <settings>
      	<setting name="logImpl" value="LOG4J"/>
      </settings>
      4. 在sql查询语句下面加入这么一句就好了
       Logger logger = Logger.getLogger(所在类.class);
      
  2. 在可疑的地方打断点一步一步调试,看程序进行到哪个地方出错了

  3. 找到程序的出错原因后,还是知道问题出在哪,可以网上找下答案,或者写个测试程序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值