需求:
实体类:
package com.tao.pojo; public class Student { private int id; private String name; private int age; private int tid; private Teacher teacher; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public int getTid() { return tid; } public void setTid(int tid) { this.tid = tid; } public Teacher getTeacher() { return teacher; } public void setTeacher(Teacher teacher) { this.teacher = teacher; } }
package com.tao.pojo; public class Teacher { private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
package com.tao.pojo; import java.util.List; public class PageInfo { private int pageSize; private int pageNumber; private long total; private List<?> list; //学生姓名 private String sname; //老师姓名 private String tname; //起始行 private int pageStart; public int getPageStart() { return pageStart; } public void setPageStart(int pageStart) { this.pageStart = pageStart; } public int getPageSize() { return pageSize; } public void setPageSize(int pageSize) { this.pageSize = pageSize; } public int getPageNumber() { return pageNumber; } public void setPageNumber(int pageNumber) { this.pageNumber = pageNumber; } public long getTotal() { return total; } public void setTotal(long total) { this.total = total; } public List<?> getList() { return list; } public void setList(List<?> list) { this.list = list; } public String getSname() { return sname; } public void setSname(String sname) { this.sname = sname; } public String getTname() { return tname; } public void setTname(String tname) { this.tname = tname; } }
Mapper接口:
package com.tao.mapper; import java.util.List; import com.tao.pojo.PageInfo; import com.tao.pojo.Student; public interface StudentMapper { List<Student> selByPage(PageInfo pageInfo); long selCountByPageInfo(PageInfo pageInfo); }
package com.tao.mapper; import com.tao.pojo.Teacher; public interface TeacherMapper { Teacher selById(int id); }
映射Mapper.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.tao.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 name like #{sname} </if> <if test="tname!=null and tname!=''"> <bind name="tname" value="'%'+tname+'%'"/> and tid in (select id from teacher where name 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 name like #{sname} </if> <if test="tname!=null and tname!=''"> <bind name="tname" value="'%'+tname+'%'"/> and tid in (select id from teacher where name like #{tname}) </if> </where> </select> </mapper>
<?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.tao.mapper.TeacherMapper"> <select id="selById" parameterType="int" resultType="Teacher"> select * from teacher where id=#{0} </select> </mapper>
service接口:
package com.tao.service; import com.tao.pojo.PageInfo; public interface StudentService { PageInfo showPage(String sname,String tname,String pageSizeStr,String pageNumberStr); }
service实现:
package com.tao.service.impl; import java.util.List; import org.apache.ibatis.session.SqlSession; import com.tao.mapper.StudentMapper; import com.tao.mapper.TeacherMapper; import com.tao.pojo.PageInfo; import com.tao.pojo.Student; import com.tao.service.StudentService; import com.tao.util.MyBatisUtil; public class StudentServiceImpl implements StudentService{ /** * 分页查询学生和老师信息 */ @Override public PageInfo showPage(String sname, String tname, String pageSizeStr, String pageNumberStr) { int pageSize = 2; if(pageSizeStr!=null && !pageSizeStr.equals("")){ pageSize = Integer.parseInt(pageSizeStr); } int pageNumber = 1; if(pageNumberStr!=null && !pageNumberStr.equals("")){ pageNumber = Integer.parseInt(pageNumberStr); } SqlSession session = MyBatisUtil.getSqlSession(); StudentMapper studentMapper = session.getMapper(StudentMapper.class); TeacherMapper teacherMapper = session.getMapper(TeacherMapper.class); //封装信息 PageInfo pageInfo = new PageInfo(); pageInfo.setPageNumber(pageNumber); pageInfo.setPageSize(pageSize); pageInfo.setPageStart(pageSize*(pageNumber-1)); pageInfo.setTname(tname); pageInfo.setSname(sname); //查询出学生信息 List<Student> list = studentMapper.selByPage(pageInfo); //循环遍历集合查出老师信息 for(Student student:list){ student.setTeacher(teacherMapper.selById(student.getTid())); } pageInfo.setList(list); long count = studentMapper.selCountByPageInfo(pageInfo); pageInfo.setTotal(count%pageSize==0?count/pageSize:count/pageSize+1); return pageInfo; } }
控制层servlet:
package com.tao.servlet; import java.io.IOException; 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 com.tao.pojo.PageInfo; import com.tao.service.StudentService; import com.tao.service.impl.StudentServiceImpl; @WebServlet("/show") public class ShowServlet extends HttpServlet{ private static final long serialVersionUID = 1L; private StudentService studentService = new StudentServiceImpl(); @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String sname = req.getParameter("sname"); String tname = req.getParameter("tname"); String pageSize = req.getParameter("pageSize"); String pageNumber = req.getParameter("pageNumber"); PageInfo pageInfo = studentService.showPage(sname, tname, pageSize, pageNumber); req.setAttribute("pageInfo", pageInfo); req.getRequestDispatcher("/index.jsp").forward(req, resp); } }
过滤器对session的处理:
package com.tao.filter; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.annotation.WebFilter; import org.apache.ibatis.session.SqlSession; import com.tao.util.MyBatisUtil; @WebFilter("/*") public class OpenSessionInView implements Filter{ @Override public void destroy() { // TODO Auto-generated method stub } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { SqlSession session = MyBatisUtil.getSqlSession(); try { filterChain.doFilter(servletRequest, servletResponse); session.commit(); } catch (Exception e) { session.rollback(); e.printStackTrace(); }finally { MyBatisUtil.closeSession(); } } @Override public void init(FilterConfig arg0) throws ServletException { // TODO Auto-generated method stub } }
MyBatis工具类:
package com.tao.util; import java.io.IOException; import java.io.InputStream; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; public class MyBatisUtil { private static SqlSessionFactory factory; private static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<>(); static{ try{ InputStream is = Resources.getResourceAsStream("mybatis.xml"); factory = new SqlSessionFactoryBuilder().build(is); }catch(IOException e){ e.printStackTrace(); } } /** * 获取SqlSession的方法 */ public static SqlSession getSqlSession(){ SqlSession session = threadLocal.get(); if(session==null){ threadLocal.set(factory.openSession()); } return threadLocal.get(); } /** * 关闭Session的方法 */ public static void closeSession(){ SqlSession session = threadLocal.get(); if(session!=null){ session.close(); } threadLocal.set(null); } }
核心配置文件 mybaits.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> <!-- mybatis 开启log4j支持功能 --> <settings> <setting name="logImpl" value="LOG4J"/> </settings> <!-- 给某个包下所有类起别名,别名为类名, 不区分大小写 --> <typeAliases> <package name="com.tao.pojo"/> </typeAliases> <environments default="dev"> <environment id="dev"> <!-- JDBC 原生事务管理方式 --> <transactionManager type="JDBC"></transactionManager> <!-- 使用数据库连接池 --> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/ssm"/> <property name="username" value="root"/> <property name="password" value="root"/> </dataSource> </environment> </environments> <mappers> <!-- <mapper resource="com/tao/mapper/LogMapper.xml"/> --> <package name="com.tao.mapper"/> </mappers> </configuration>
index.jsp界面展示:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> <script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery-1.7.2.js"></script> <script type="text/javascript"> $(function(){ var pageSize = "${pageInfo.pageSize}"; var pageNumber = "${pageInfo.pageNumber}"; var tname = "${pageInfo.tname}"; var sname = "${pageInfo.sname}"; var total = ${pageInfo.total} //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="show?pageSize="+pageSize+"&pageNumber=1&tname="+$(":text[name='tname']").val()+"&sname="+$(":text[name='sname']").val(); }); //单选按钮点击事件 $(":radio").click(function(){ pageSize = $(this).val(); location.href="show?pageSize="+pageSize+"&pageNumber=1&tname="+$(":text[name='tname']").val()+"&sname="+$(":text[name='sname']").val(); }); //点击上一页 $(".page_a:eq(0)").click(function(){ pageNumber=parseInt(pageNumber)-1; if(pageNumber>=1){ location.href="show?pageSize="+pageSize+"&pageNumber="+pageNumber+"&tname="+$(":text[name='tname']").val()+"&sname="+$(":text[name='sname']").val(); }else{ pageNumber = 1; } return false; }); //点击上一页 $(".page_a:eq(1)").click(function(){ pageNumber=parseInt(pageNumber)+1; if(pageNumber<=total){ location.href="show?pageSize="+pageSize+"&pageNumber="+pageNumber+"&tname="+$(":text[name='tname']").val()+"&sname="+$(":text[name='sname']").val(); }else{ pageNumber = total; } 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 学生姓名:<input type="text" name="sname"> 老师姓名:<input type="text" name="tname"> <button>查询</button> <table border="1"> <tr> <th>学生编号</th> <th>学生姓名</th> <th>年龄</th> <th>任课老师</th> </tr> <c:forEach items="${pageInfo.list}" var="stu"> <tr> <td>${stu.id}</td> <td>${stu.name}</td> <td>${stu.age}</td> <td>${stu.teacher.name}</td> </tr> </c:forEach> </table> <a href="" class="page_a">上一页</a><a href="" class="page_a">下一页</a> </body> </html>
数据库表设计: