实现效果图 :

项目结构搭建

代码实现
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 + "¤tPageNumber=1&tname=" + $(":text[name='tname']").val() + "&sname=" + $(":text[name='sname']").val(); }) //单选按钮点击事件 $(":radio").click(function () { pageSize = $(this).val(); location.href = "ShowServlet?pageSize=" + pageSize + "¤tPageNumber=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 + "¤tPageNumber=" + 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 + "¤tPageNumber=" + 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不要慌,一般可以按照以下的解决思路
-
先在需要输出结果的地方,在控制台打印一下看能否打印出来,如果不能,进入第二步
-
如果是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);
-
-
在可疑的地方打断点一步一步调试,看程序进行到哪个地方出错了
-
找到程序的出错原因后,还是知道问题出在哪,可以网上找下答案,或者写个测试程序
本文详细介绍了如何使用MyBatis实现分页查询,包括数据库搭建、环境配置、代码实现及异常处理,展示了学生信息的分页展示过程。
434

被折叠的 条评论
为什么被折叠?



