这是包的结构,需要注意xml文件和接口文件要放到同一个目录下,通常是在resources建一个和相同目录存放xml文件,否则无法读取到xml文件。也可以直接把xml放到接口的包当中,只不过这种方法不符合规则。
userMapper接口:
public interface UserMapper { User getByName(User users); }
userMapper.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"> <!--名称空间namespace--> <mapper namespace="com.mapper.UserMapper"> <resultMap id="userSelect" type="com.pojo.User"> <!--有主键就用id标签--> <id property="username" column="username"/> <result property="password" column="password"></result> <result property="role" column="role"></result> </resultMap> <select id="getByName" resultMap="userSelect"> select * from user1 where username=#{username} </select> </mapper>
service:
public interface UserService { User login(User users); }
对应的实现类 public class UserServiceImpl implements UserService { @Override public User login(User users) { SqlSession session = SqlSessionUtil.openSession(); UserMapper mapper = session.getMapper(UserMapper.class); users = mapper.getByName(users); return users; } }
servlet:
@WebServlet("/loginServlet") public class UserServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String flag = req.getParameter("flag"); if("out".equals(flag)){ doOut(req,resp); }else{ //登录操作 //代码写到doPost里面即可,登录操作 login(req,resp); } } public void login(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException { HttpSession session = req.getSession(); String username = req.getParameter("username"); String password = req.getParameter("password"); // 绝对路径 String path = req.getContextPath(); // 通过对象传参 User users = new User(); // 设置用户名 users.setUsername(username); // 设置密码 users.setPassword(password); // 实例化业务逻辑 UserService service = new UserServiceImpl(); // 调用登录接口 users = service.login(users); if (users != null) { //判断输入用户名是否正确 if (!password.equals(users.getPassword())) { req.setAttribute("message", "密码错误,请重新输入"); req.getRequestDispatcher("login.jsp").forward(req,resp); } else { //通过会话 req.getSession().setAttribute("users",users); resp.sendRedirect("/empServlet"); } } else { req.setAttribute("message", "用户名不存在"); req.getRequestDispatcher("login.jsp").forward(req,resp); } } private void doOut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { HttpSession session = req.getSession(); session.removeAttribute("name"); req.getRequestDispatcher("login.jsp").forward(req,resp); } }
前端代码login.html:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>登录</title> </head> <body> <form method="post" action="/loginServlet"> <input type="hidden" name="flag" value="flag"> 用户名:<input name="username" type="text"><br> 密 码:<input name="password" type="password"> <input type="submit"> </form> </body> </html>
下面就是模糊查询分页了,mybatis的分页是比较简单的,当然这是导入jar包的情况下,底层代码别人都已经写好了。
EmpMapper
public interface EmpMapper { // 一对多 List<Emp> selectByPageHelper(Map map); Emp selectByEmpNo(Integer empno); Integer deleteEmp(Integer empno); Integer updateEmp(Emp emp); List<Emp> selectMoreTwoEmp(Emp emp); Integer insertEmp(Emp emp); Emp getSelectByNameEmp(String username); List<Emp> getSelectAll(); // 通过数组实现批量删除,foreach int deleteMoreByEmpNo(@Param("empnos") Integer[] empnos); // 通过集合实现批量添加 int insertMoreByList(@Param("emps") List<Emp> emps); }
EmpMapper.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"> <!--名称空间namespace--> <mapper namespace="com.mapper.EmpMapper"> <!--二级缓存--> <!--<cache/>--> <!--结果映射 property emp里面的名称 column数据库名称 --> <resultMap id="stuResultMap" type="com.pojo.Emp"> <!--有主键就用id标签--> <id property="empno" column="EMPNO"/> <result property="ename" column="ENAME"/> <result property="job" column="JOB"/> <result property="mgr" column="MGR"/> <result property="hiredate" column="HIREDATE"/> <result property="sal" column="SAL"/> <result property="comm" column="COMM"/> <result property="deptno" column="DEPTNO"/> <!-- association:处理多对一的映射关系 property:需要处理多对一的映射关系属性名 javaType:该属性的类型 --> <association property="dept" javaType="com.pojo.Dept"> <id property="deptno" column="DEPTNO"></id> <result property="dname" column="DNAME"></result> <result property="loc" column="LOC"></result> </association> </resultMap> <!--用resultMap就不需要用as了--> <resultMap id="empAndDeptByMap" type="com.pojo.Emp"> <!--有主键就用id标签--> <id property="empno" column="EMPNO"/> <result property="ename" column="ENAME"/> <result property="job" column="JOB"/> <result property="mgr" column="MGR"/> <result property="hiredate" column="HIREDATE"/> <result property="sal" column="SAL"/> <result property="comm" column="COMM"/> <result property="deptno" column="DEPTNO"/> <!-- column:分布查询的条件 select:设置分步查询的sql的唯一标识,mapper接口全类名.方法名 --> <association property="dept" select="com.mapper.DeptMapper.getDeptByStep" column="deptno"></association> </resultMap> <!--SQL标签:sql片段,把经常用的字段名写进去, 用的时候<include refid="empColumns"></include> --> <sql id="empColumns"> empno, ename, job, mgr, hiredate, sal, comm, deptno </sql> <select id="getSelectAll" resultType="com.pojo.Emp"> select * from emp </select> <!--动态SQL查询--> <!-- and ename like "%"#{ename}"%" 第一个ename和数据库对应,后面的和test="ename"中的对应 --> <!-- 设置特殊符号 转译/CDATA <![CDATA[<=]]> --> <select id="selectMore" resultType="com.pojo.Emp" resultMap="stuResultMap"> select * from emp where 1=1 <if test="ename !=null and ename != '' "> and ename like "%"#{ename}"%" </if> <if test="sal != null and sal != '' "> and sal > #{sal} </if> </select> <!--where标签:可以去掉多余的and或or,如果条件都不成立则不会生成where--> <!--set标签:可以去掉多余的逗号--> <select id="selectMoreOne" resultType="com.pojo.Emp" resultMap="stuResultMap"> select * from emp <where> <if test="ename !=null and ename != '' "> and ename like "%"#{ename}"%" </if> <if test="sal != null and sal != '' "> and sal > #{sal} </if> </where> </select> <!-- prefix|suffix 前面或后面添加指定元素 prefixOverrides|suffixOverrides 前面或后面删除指定元素 --> <select id="selectMoreTwoEmp" resultType="com.pojo.Emp" resultMap="stuResultMap"> select <include refid="empColumns"></include> from emp <trim prefix="where" prefixOverrides="and|or" > <if test="ename !=null and ename != '' "> ename like "%"#{ename}"%" and </if> <if test="sal != null and sal != '' "> sal >= #{sal} </if> </trim> </select> <!--separator=","分隔符--> <!--int deleteMoreByEmpNo(@Param("empnos") Integer[] empnos);--> <delete id="deleteMoreByEmpNo" parameterType="com.pojo.Emp"> delete from emp where empno in (<foreach collection="empnos" item="empno" separator=","> #{empno} </foreach>) </delete> <!--int insertMoreByList(@Param("emps") List<Emp> emps);--> <insert id="insertMoreByList" parameterType="com.pojo.Emp"> insert into emp values <foreach collection="emps" item="emp" separator=","> (#{emp.empno},#{emp.ename},#{emp.job},#{emp.mgr},#{emp.hiredate},#{emp.sal},#{emp.comm},null) </foreach> </insert> <select id="getSelectByNameEmp" resultType="com.pojo.Emp" resultMap="stuResultMap"> select * from emp where ename=#{ename}; </select> <insert id="insertEmp" parameterType="com.pojo.Emp"> insert into emp values(#{empno},#{ename},#{job},#{mgr},#{hiredate},#{sal},#{comm},#{deptno}) </insert> <update id="updateEmp" parameterType="com.pojo.Emp"> update emp set ename = #{ename}, job = #{job}, mgr = #{mgr}, hiredate = #{hiredate}, sal = #{sal}, comm = #{comm}, deptno = #{deptno} where empno = #{empno} </update> <delete id="deleteEmp" parameterType="com.pojo.Emp"> delete from emp where empno = #{empno} </delete> <select id="selectByEmpNo" resultType="com.pojo.Emp" resultMap="stuResultMap"> select * from emp where empno = #{empno} </select> <!-- /*empno = #{empno} and*/--> <select id="selectByPageHelper" resultType="java.util.Map" resultMap="empAndDeptByMap"> select * from emp <where> <if test="ename !=null and ename != '' "> and ename like "%"#{ename}"%" </if> <if test="sal != null and sal != '' "> and sal > #{sal} </if> </where> </select> </mapper>
EmpServlet
public interface EmpService { PageInfo<Emp> selectByPageHelper(Map map); Emp selectByEmpNo(Integer empno); List<Emp> getSelectAll(Integer pageBegin, Integer pageSize); List<Emp> selectMoreTwo(String ename, Double sal, @Param("pageBegin") Integer pageBegin, @Param("pageSize") Integer pageSize); Integer insertEmp(Emp emp); Integer deleteEmp(Integer empno); Integer updateEmp(Emp emp); } 对应的实现类EmpServletImpl
public class EmpServiceImpl implements EmpService { EmpMapper empMapper = SqlSessionUtil.openSession().getMapper(EmpMapper.class); @Override public PageInfo<Emp> selectByPageHelper(Map map) { PageHelper.startPage((Integer) map.get("pageIndex"),4); SqlSessionUtil.openSession().clearCache(); List<Emp> list = empMapper.selectByPageHelper(map); PageInfo<Emp> info = new PageInfo<>(list); return info; } @Override public Emp selectByEmpNo(Integer empno) { SqlSession session = null; try { session = SqlSessionUtil.openSession(); EmpMapper mapper = session.getMapper(EmpMapper.class); Emp emp = mapper.selectByEmpNo(empno); return emp; } catch (Exception e) { e.printStackTrace(); } finally { session.commit(); } return null; } @Override public List<Emp> getSelectAll(Integer pageBegin, Integer pageSize) { List<Emp> list = new ArrayList<>(); SqlSession session = null; try { session = SqlSessionUtil.openSession(); EmpMapper mapper = session.getMapper(EmpMapper.class); /* index:当前页起始索引 pageSize:每页显示的条数 pageNum:当前页的页码 index = (pageNum - 1) * pageSize*/ PageHelper.startPage(pageBegin,pageSize); list = mapper.getSelectAll(); PageInfo<Emp> pageInfo = new PageInfo<>(list); System.out.println(pageInfo); } catch (Exception e) { e.printStackTrace(); } finally { session.commit(); // 关闭session之前老师在讲转账那个练习时说过,只不过我没当回事 // 现在不会关了 } return list; } @Override public List<Emp> selectMoreTwo(String ename, Double sal, Integer pageBegin, Integer pageSize) { List<Emp> list = new ArrayList<>(); SqlSession session = null; try { session = SqlSessionUtil.openSession(); EmpMapper mapper = session.getMapper(EmpMapper.class); /* index:当前页起始索引 pageSize:每页显示的条数 pageNum:当前页的页码 index = (pageNum - 1) * pageSize*/ Emp emp = new Emp(); emp.setSal(sal); emp.setEname(ename); PageHelper.startPage(pageBegin,pageSize); list = mapper.selectMoreTwoEmp(emp); } catch (Exception e) { e.printStackTrace(); } finally { session.commit(); // 关闭session之前老师在讲转账那个练习时说过,只不过我没当回事 // 现在不会关了 } return list; } @Override public Integer deleteEmp(Integer empno){ SqlSession session = null; try { session = SqlSessionUtil.openSession(); EmpMapper mapper = session.getMapper(EmpMapper.class); Integer delete = mapper.deleteEmp(empno); return delete; } catch (Exception e) { e.printStackTrace(); }finally { session.commit(); } return null; } @Override public Integer updateEmp(Emp emp){ SqlSession session = null; try { session = SqlSessionUtil.openSession(); EmpMapper mapper = session.getMapper(EmpMapper.class); Integer update = mapper.updateEmp(emp); return update; } catch (Exception e) { e.printStackTrace(); }finally { session.commit(); } return null; } @Override public Integer insertEmp(Emp emp){ SqlSession session = null; try { session = SqlSessionUtil.openSession(); EmpMapper mapper = session.getMapper(EmpMapper.class); Integer insert = mapper.insertEmp(emp); return insert; } catch (Exception e) { e.printStackTrace(); }finally { session.commit(); } return null; }
控制器EmpServlet
@WebServlet("/empServlet") public class EmpServlet extends HttpServlet { EmpService empService = new EmpServiceImpl(); @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String flag = req.getParameter("flag"); if ("add".equals(flag)){ doAdd(req,resp); } else if ("update".equals(flag)){ doUpdate(req,resp); } else if ("delete".equals(flag)) { doDel(req,resp); } else if ("findName".equals(flag)) { //list.jsp中的EL表达式 var="update" value="/bookServlet?flag=findName&eno=${book.id}" Integer empno = Integer.valueOf(req.getParameter("empno")); Emp empNo = empService.selectByEmpNo(empno); // System.out.println("empNo = " + empNo); //这个emp就是update中的emp,根据键找值 req.setAttribute("emp",empNo); req.getRequestDispatcher("update.jsp").forward(req,resp); return; } // 查询所有 // SelectAll(req,resp); // selectMoreTwo(req,resp); doGetPage(req,resp); } private void doGetPage(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Map<String,Object> map=new HashMap<>(); //获得页面出传入的当前页码 String currentPage = req.getParameter("pageIndex"); if(currentPage==null){ currentPage="1"; } int pageIndex=Integer.parseInt(currentPage); map.put("pageIndex",pageIndex);//把当前页码封装到map里面 // map的key值时sql语句中写的,req从前端获得员工名称和薪资 map.put("ename",req.getParameter("ename")); /*map.put("lowSal",req.getParameter("lowSal")); map.put("highSal",req.getParameter("highSal"));*/ map.put("sal",req.getParameter("sal")); PageInfo<Emp> empPageInfo = empService.selectByPageHelper(map); //把此对象放入到作用域 req.setAttribute("pageInfo",empPageInfo); //把传输放入到作用域 req.setAttribute("serachrName",req.getParameter("ename")); // empPageInfo.getList() //转发到list.jsp页面 req.getRequestDispatcher("/list.jsp").forward(req,resp); } private void doDel(HttpServletRequest req, HttpServletResponse resp) { String empno = req.getParameter("empno"); empService.deleteEmp(Integer.parseInt(empno)); } private void doUpdate(HttpServletRequest req, HttpServletResponse resp) { Integer empno = Integer.valueOf(req.getParameter("empno")); String ename = req.getParameter("ename"); String job = req.getParameter("job"); Integer mgr = Integer.valueOf(req.getParameter("mgr")); String hiredate = req.getParameter("hiredate"); Double sal = Double.valueOf(req.getParameter("sal")); Double comm = Double.valueOf(req.getParameter("comm")); Integer deptno = Integer.valueOf(req.getParameter("deptno")); Emp emp = new Emp(empno,ename,job,mgr,hiredate,sal,comm,deptno); empService.updateEmp(emp); } private void doAdd(HttpServletRequest req, HttpServletResponse resp) { Integer empno = Integer.valueOf(req.getParameter("empno")); String ename = req.getParameter("ename"); String job = req.getParameter("job"); Integer mgr = Integer.valueOf(req.getParameter("mgr")); String hiredate = req.getParameter("hiredate"); Double sal = Double.valueOf(req.getParameter("sal")); Double comm = Double.valueOf(req.getParameter("comm")); Integer deptno = Integer.valueOf(req.getParameter("deptno")); Emp emp = new Emp(empno,ename,job,mgr,hiredate,sal,comm,deptno); empService.insertEmp(emp); }
DeptMapper接口
public interface DeptMapper { // 分布查询,第二步 Dept getDeptByStep(Integer deptno); List<Dept> getSelectAll(); int insertDept(Dept dept); int deleteDept(String username); int updateDept(Dept dept); Dept getSelectByName(String username); List<Dept> selectMoreTwo(Dept dept); }
对应的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"> <!--名称空间namespace--> <mapper namespace="com.mapper.DeptMapper"> <resultMap id="deptAndEmpResultMap" type="com.pojo.Dept"> <id property="deptno" column="DEPTNO"></id> <result property="dname" column="DNAME"/> <result property="loc" column="LOC"/> <!-- collection:专门处理集合 ofType:集合中的属性 --> <collection property="emps" ofType="com.pojo.Emp"> <id property="empno" column="EMPNO"/> <result property="ename" column="ENAME"/> <result property="job" column="JOB"/> <result property="mgr" column="MGR"/> <result property="hiredate" column="HIREDATE"/> <result property="sal" column="SAL"/> <result property="comm" column="COMM"/> </collection> </resultMap> <!--一对多分步查询--> <resultMap id="AndEmpResultMap" type="com.pojo.Dept"> <id property="deptno" column="DEPTNO"></id> <result property="dname" column="DNAME"/> <result property="loc" column="LOC"/> <collection property="emps" select="com.mapper.EmpMapper.getDeptAndEmpByStep" column="deptno"></collection> </resultMap> <select id="getDeptByStep" resultType="com.pojo.Dept"> select * from dept where deptno = #{deptno} </select> <insert id="insertDept" parameterType="com.pojo.Dept"> insert into dept values (#{deptno},#{dname},#{loc}) </insert> <update id="updateDept" parameterType="com.pojo.Dept"> update dept set deptno=#{deptno},dname=#{dname},loc=#{loc} </update> <delete id="deleteDept" parameterType="com.pojo.Dept"> delete from dept where deptno=#{deptno} </delete> </mapper>
前端代码list.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib uri="http://java.sun.com/jstl/fmt_rt" prefix="fmt"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%> <%@ page import="com.pojo.Emp" %> <%@ page import="java.util.List" %> <%--在以前使用EL表达式的时候,通过<%@ page language="java" pageEncoding="utf-8" isELIgnored="false" %>可解决EL表达式不能识别问题。--%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ page language="java" pageEncoding="utf-8" isELIgnored="false" %> <html> <head> <title>员工</title> <script> /*$(function () { $("#delete").click(function (empno) { var b=confirm('确定删除?') if(b){ location.href='/empServlet?flag=delete&eno='+empno } }) })*/ </script> </head> <body> <div id="nav"> <button type="button" οnclick="window.location.href='/add.jsp'"> <p id="add">添加员工</p> </button> </div> <div id="comm"> <%--指定不指定提交到控制器没影响--%> <form action="/empServlet"> <%-- <form>--%> 员工姓名:<input name="ename" type="text" value="${serachrName}"> 员工工资:<input name="sal" type="text" value="${sal}"> <input type="submit" value="查询" /> </form> </div> <table> <tr> <th>员工编号</th> <th>员工姓名</th> <th>员工工作</th> <th>员工经理</th> <th>工作时间</th> <th>员工工资</th> <th>员工奖金</th> <th>部门编号</th> <th>操作</th> </tr> <c:forEach items="${pageInfo.list}" var="emp"> <tr> <td>${emp.empno}</td> <td>${emp.ename}</td> <td>${emp.job}</td> <td>${emp.mgr}</td> <td>${emp.hiredate}</td> <td>${emp.sal}</td> <td>${emp.comm}</td> <td>${emp.deptno}</td> <td> <c:url var="update" value="/empServlet?flag=findName&empno=${emp.empno}"> <c:param name="empno" value="${emp.empno}"></c:param> </c:url> <%--<input type="hidden" name="flag" value="update">--%> <a href="${update}">修改</a> <%--<c:url var="delete" value="/empServlet?flag=delete&empno=${emp.empno}"> <c:param name="empno" value="${emp.empno}"></c:param> </c:url>--%> <%--隐藏域--%> <%-- <input type="hidden" name="flag" value="delete">--%> <a id="delete" href="delete.jsp">删除</a> </td> </tr> </c:forEach> </table> <div id="page"> <c:url var="first" value="/empServlet"> <c:param name="ename" value="${serachrName}"></c:param> <c:param name="pageIndex" value="1"></c:param> <c:param name="sal" value="${sal}"></c:param> </c:url> <a href="${first}">首页</a> <c:url value="/empServlet" var="forward"> <c:param name="pageInfo.pageNum" value="${pageInfo.pageNum-1}"></c:param> <c:param name="ename" value="${serachrName}"></c:param> <c:param name="sal" value="${sal}"></c:param> </c:url> <c:if test="${pageInfo.pageNum>1}"> <a href="${forward}">上一页</a> </c:if> <c:url value="/empServlet" var="next"> <c:param name="pageIndex" value="${pageInfo.pageNum+1}"></c:param> <c:param name="ename" value="${serachrName}"></c:param> <c:param name="sal" value="${sal}"></c:param> </c:url> <c:if test="${pageInfo.pageNum<pageInfo.pages}"> <a href="${next}">下一页</a> </c:if> <c:url var="end" value="/empServlet"> <%-- <c:param name="totalPage" value="${totalPage}"></c:param>--%> <c:param name="pageIndex" value="${pageInfo.pages}"></c:param> <c:param name="ename" value="${serachrName}"></c:param> <c:param name="sal" value="${sal}"></c:param> </c:url> <a href="${end}">末页</a> </div> </body> <%--<script> function del(empno) { var b=confirm('确定删除?') if(b){ location.href='/empServlet?flag=delete&eno='+empno } } </script>--%> </html> 因为使用的是maven创建web项目,以下是我导入的jar包
<!-- 单元测试--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.2</version> <scope>test</scope> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.17</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.5</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.20</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> <version>1.2.3</version> </dependency> <!--分页插件--> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>5.3.1</version> </dependency> <dependency> <groupId>org.testng</groupId> <artifactId>testng</artifactId> <version>7.7.1</version> <scope>test</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>taglibs</groupId> <artifactId>standard</artifactId> <version>1.1.2</version> </dependency>
增删改的方法和JavaBean我就不写了