mybatis和servlet整和 增删改查
重定向和请求转发的区别
一个会改变地址,一个不会改变url的地址
一个不能传对象,一个可以传对象过去
1.OpenSessionInView 的使用
Open Session In View 模式:
Open Session In View 是将一个数据库会话对象绑定到当前请求线程中,在请求期间一直
保持数据库会话对象处于Open 状态,使数据库会话对象在请求的整个期间都可以使用。直
到产生响应后关闭当前的数据库会话对象。

点击查看代码
/**
* 在Filter 中打开一个SqlSession
*/
@WebFilter("/*")
public class OpenSqlSessionInViewFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws
ServletException {
}
//一有请求就创建sqlsession,这里直接进行业务提交和回滚等操作,不用在业务层操作了
@Override
public void doFilter(ServletRequest servletRequest,
ServletResponse servletResponse, FilterChain filterChain) throws
IOException, ServletException {
SqlSession sqlSession = MybatisUtils.getSqlSession();
try{
filterChain.doFilter(servletRequest, servletResponse);
sqlSession.commit();
}catch(Exception e){
e.printStackTrace();
sqlSession.rollback();
}finally {
MybatisUtils.closeSqlSession();
}
}
@Override
public void destroy() {
}
}
2.创建页面
开始页面有增删改查四个超链接,每个超链接对应一个页面
创建操作完成界面,完成每个页面,都重定向到这个页面
2.1创建查看页面
需要导入jstl标签,进行一些操作,还要进行js和form表单的提交
点击查看代码
<%--
Created by IntelliJ IDEA.
User: muzi
Date: 2021/12/9
Time: 15:04
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>
<script>
function subForm(pageIndex) {
// 将页码给form表单的pageInfo
document.getElementById("pageInfo").value=pageIndex;
// 执行form表达
document.forms[0].submit();
}
</script>
</head>
<body>
<%--要传回的数据--%>
<form action="usersServlet.do" method="post">
<%-- 隐藏的信息,用于servlet判断当前操作--%>
<input type="hidden" name="flag" value="selectUsers"/>
<%-- 回传给 servlet当前页码--%>
<input type="hidden" name="pageIndex" id="pageInfo"/>
<input type="hidden" name="${users.username}"/>
<input type="hidden" name="${users.usersex}"/>
</form>
<table align="center" border="1" width="40%">
<tr>
<th>id</th>
<th>姓名</th>
<th>性别</th>
</tr>
<%-- 遍历pageInfo中的users--%>
<c:forEach items="${pageInfo.list}" var="user">
<tr>
<td>${user.userid}</td>
<td>${user.username}</td>
<td>${user.usersex}</td>
</tr>
</c:forEach>
<%-- 添加换页的功能--%>
<tr>
<td align="center" colspan="3">
<c:if test="${pageInfo.pageNum > 1}">
<a href="#" onclick="subForm(${pageInfo.pageNum - 1})">上一页</a>
</c:if>
<%-- 这就相当于for 1到pageInfo.pages的循环打印数字,数字放在st中--%>
<c:forEach begin="1" end="${pageInfo.pages}"
varStatus="st">
<c:choose>
<c:when test="${pageInfo.pageNum eq st.count}">
<a style="color: red" href="#"
onclick="subForm(${st.count})">${st.count}</a>
</c:when>
<c:otherwise>
<a href="#"
onclick="subForm(${st.count})">${st.count}</a>
</c:otherwise>
</c:choose>
</c:forEach>
<c:if test="${pageInfo.pageNum < pageInfo.pages}">
<a href="#" onclick="subForm(${pageInfo.pageNum + 1})">下一页</a>
</c:if>
</td>
</tr>
</table>
</body>
</html>
3.创建servlet控制层
3.1添加用户
点击查看代码
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String flag = req.getParameter("flag");
//判断页面传来的表达是干什么
if (flag.equals("addUsers") ) {
this.addUsers(req, resp);
}
}
//添加用户操作
public void addUsers(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取数据
Users users = this.createUsers(req);
//调用服务层
UsersService usersService = new UsersServiceImpl();
usersService.addUsers(users);
resp.sendRedirect("ok.jsp");
}
//获取页面传来的数据
public Users createUsers(HttpServletRequest req) {
Users users = new Users();
users.setUsername(req.getParameter("username") );
users.setUsersex(req.getParameter("usersex") );
return users;
}
3.2 查看用户
点击查看代码
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String flag = req.getParameter("flag");
//判断页面传来的表达是干什么
if (flag.equals("addUsers") ) {
this.addUsers(req, resp);
} else if (flag.equals("selectUsers") ) {
this.selectUsers(req, resp);
}
}
//查看用户
public void selectUsers(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取数据
Users users = this.createUsers(req);
//用于获取当前页数,用于分页操作
String pageIndex = req.getParameter("pageIndex");
int page = 1;
if( pageIndex != null && pageIndex.length() > 0) {
//查询的页数存放 进page
page = Integer.parseInt(pageIndex);
}
//业务操作
UsersService usersService = new UsersServiceImpl();
PageInfo<Users> pageInfo = usersService.selectUsers(page, users);
//返回 users对象,用于下次分页查询, pagInfo 这次查询结果
//放入Attribute对象中,后面 请求转发给界面
req.setAttribute("users", users);
req.setAttribute("pageInfo", pageInfo);
// 请求转发给界面
req.getRequestDispatcher("showUsers.jsp").forward(req, resp);
}
3.3删除用户
点击查看代码
3.4修改用户
点击查看代码
4. 创建业务层
4.1 添加用户的
点击查看代码
public void addUsers(Users users) {
SqlSession sqlSession = MybatisUtils.getSqlSession();
UsersMapper mapper = sqlSession.getMapper(UsersMapper.class);
mapper.insertSelective(users);
//这里不用提交事务和处理异常,监听那边已经处理了
}
4.2查看用户
点击查看代码
@Override
public PageInfo<Users> selectUsers(int page, Users users) {
SqlSession sqlSession = MybatisUtils.getSqlSession();
UsersMapper mapper = sqlSession.getMapper(UsersMapper.class);
//拼接查询条件
UsersExample usersExample = this.createUsersExample(users);
PageHelper.startPage(page,2);
List<Users> list = mapper.selectByExample(usersExample);
PageInfo<Users> pageInfo = new PageInfo(list);
return pageInfo;
}
//查询条件
private UsersExample createUsersExample(Users users) {
UsersExample usersExample = new UsersExample();
UsersExample.Criteria criteria = usersExample.createCriteria();
if(users.getUsername() != null && users.getUsername().length() > 0) {
criteria.andUsersexEqualTo(users.getUsername() );
}
if(users.getUsersex() != null && users.getUsersex().length() > 0) {
criteria.andUsersexEqualTo(users.getUsersex() );
}
return usersExample;
}
分页查询时,查询对象要维护好,第一次查询是按照给定的users查询的,但是点第二次查询时也要以前的对象进行查询,否则点下一次查询的就有问题,分页插件PageHelper中的PageInfo 对象可以用来进行分页的一些列操作。

浙公网安备 33010602011771号