CRUD
Departmentmapper.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="cn.wolfcode.two.department.mapper.DepartmentMapper" >
<resultMap id="basicMap"
type="cn.wolfcode.two.department.entity.Department">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="city" column="city"/>
</resultMap>
<sql id="column-0">
id,name,city
</sql>
<sql id="column-1">
name,city
</sql>
<sql id="column-2">
name
</sql>
<sql id="value-1">
#{name},#{city}
</sql>
<sql id="value-2">
#{name}
</sql>
<insert id="insert" parameterType="cn.wolfcode.two.department.entity.Department">
insert into department(
<include refid="column-1"></include>
) values(
<include refid="value-1"></include>
)
</insert>
<update id="update" parameterType="cn.wolfcode.two.department.entity.Department">
update department
<set>
<if test="name!=null and name!=''">
name=#{name},
</if>
<if test="city!=null and city!=''">
city=#{city},
</if>
</set>
where id=#{id}
</update>
<select id="SelectById" parameterType="java.lang.Long" resultMap="basicMap">
select
<include refid="column-0"></include>
from department
where id=#{id}
</select>
<select id="select" parameterType="java.util.Map" resultMap="basicMap">
select
<include refid="column-0"></include>
from department
<where>
<if test="qo.keyword!=null and qo.keyword!=''">
<![CDATA[ and name like concat('%',#{qo.keyword},'%') ]]>
</if>
<if test="qo.idFrom!=null">
<![CDATA[ and id >= #{qo.idFrom} ]]>
</if>
<if test="qo.idTo!=null">
<![CDATA[ and id <= #{qo.idTo} ]]>
</if>
</where>
limit #{pageNum},#{pageSize}
</select>
<select id="count" parameterType="cn.wolfcode.two.department.qo.DepartmentQo" resultType="java.lang.Integer">
select count(1) from department
<where>
<if test="keyword!=null and keyword!=''">
<![CDATA[ and name like concat('%',#{keyword},'%') ]]>
</if>
<if test="idFrom!=null">
<![CDATA[ and id >= #{idFrom} ]]>
</if>
<if test="idTo!=null">
<![CDATA[ and id <= #{idTo} ]]>
</if>
</where>
</select>
<delete id="delete" parameterType="Long[]">
delete from department
<foreach collection="ids" item="id" open="where id in (" close=")" separator=",">
#{id}
</foreach>
</delete>
</mapper>
DepartmentMapper.java
package cn.wolfcode.two.department.mapper;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Param;
import cn.wolfcode.two.department.entity.Department;
import cn.wolfcode.two.department.qo.DepartmentQo;
public interface DepartmentMapper {
public int insert(Department department);
public int update(Department department);
public int delete(@Param("ids") Long[] ids);
public List<Department> select(Map<String,Object> paramsMap);
public Department SelectById(@Param("id") Long id);
//根据查询条件,查出一共有多少条数据
public Integer count(DepartmentQo qo);
}
IDepartmentService.java
package cn.wolfcode.two.department.service;
import cn.wolfcode.two.department.entity.Department;
import cn.wolfcode.two.department.qo.DepartmentQo;
import cn.wolfcode.two.utils.PageBean;
public interface IDepartmentService {
public void save(Department dept) ;
public void update(Department dept) ;
public void deleteOne(Long id);
public void deleteMany(Long[] ids);
public Department selectOne(Long id);
public PageBean<Department> selectList(DepartmentQo qo,Integer pageNum,Integer pageSize);
}
DepartmentServiceImpl.java
package cn.wolfcode.two.department.service.impl;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.session.SqlSession;
import cn.wolfcode.two.department.entity.Department;
import cn.wolfcode.two.department.mapper.DepartmentMapper;
import cn.wolfcode.two.department.qo.DepartmentQo;
import cn.wolfcode.two.department.service.IDepartmentService;
import cn.wolfcode.two.utils.DeptException;
import cn.wolfcode.two.utils.MessageBean;
import cn.wolfcode.two.utils.MybatisSupport;
import cn.wolfcode.two.utils.PageBean;
public class DepartmentServiceImpl implements IDepartmentService {
private DepartmentMapper departmentMapper ;
private SqlSession session;
public DepartmentServiceImpl() {
try {
session = MybatisSupport.connMybatis();
departmentMapper = session.getMapper(DepartmentMapper.class);
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
protected void finalize() throws Throwable {
MybatisSupport.close(session);
super.finalize();
}
@Override
public void save(Department dept) {
int m = departmentMapper.insert(dept);
session.commit();
if(m<1) {
throw new DeptException(MessageBean.DEPT_FALL_SELF_TYPE+"");
}
}
@Override
public void update(Department dept) {
int m = departmentMapper.update(dept);
session.commit();
if(m<1) {
throw new RuntimeException("更新失败!");
}
}
@Override
public void deleteOne(Long id) {
int m = departmentMapper.delete(new Long[] {id});
session.commit();
if(m<1) {
throw new RuntimeException("删除失败!");
}
}
@Override
public void deleteMany(Long[] ids) {
int m = departmentMapper.delete(ids);
session.commit();
if(m<1) {
throw new RuntimeException("批量删除失败!");
}
}
@Override
public Department selectOne(Long id) {
Department department = departmentMapper.SelectById(id);
return department;
}
@Override
public PageBean<Department> selectList(DepartmentQo qo, Integer pageNum, Integer pageSize) {
//构建一个分页bean ,制定当前页和每页显示多少条, 这两个数据是参数传递过来的,pageSize准确,pageNum不一定准确
PageBean<Department> ret=new PageBean<Department>(pageNum,pageSize);
//获取qo条件下的总行数
Integer rows = departmentMapper.count(qo);
ret.setRows(rows); //分页的四个属性是准确的
Map<String, Object> paramsMap=new HashMap<>();
paramsMap.put("qo", qo);
Integer startIndex=(ret.getPageNum()-1)*ret.getPageSize();
paramsMap.put("pageNum",startIndex);
paramsMap.put("pageSize", ret.getPageSize());
List<Department> allList = departmentMapper.select(paramsMap);
//把集合赋值到ret对象中
ret.setList(allList);
return ret;
}
}
DepartmentQo.java
package cn.wolfcode.two.department.qo;
import java.io.Serializable;
import lombok.Data;
@Data
public class DepartmentQo implements Serializable{
private String keyword;
private Long idFrom;
private Long idTo;
}
DepartmentSaveOrUpdateServlet.java
package cn.wolfcode.two.department.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.wolfcode.two.department.entity.Department;
import cn.wolfcode.two.department.service.IDepartmentService;
import cn.wolfcode.two.department.service.impl.DepartmentServiceImpl;
import cn.wolfcode.two.utils.DeptException;
import cn.wolfcode.two.utils.MessageBean;
public class DepartmentSaveOrUpdateServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected IDepartmentService departService = new DepartmentServiceImpl();
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
//response.setCharacterEncoding("UTF-8");
String id = request.getParameter("id");
String name = request.getParameter("name");
String city = request.getParameter("city");
Integer msg=0;
if(id!=null && !"".equals(id)) {
Department dept = new Department(Long.parseLong(id), name, city);
msg = MessageBean.DEPT_SUCCESS_MODIFY_TYPE;
try {
departService.save(dept);
} catch (DeptException e) {
msg =Integer.parseInt(e.getMessage()) ;
} catch (Exception e) {
msg=MessageBean.DEPT_FALL_SYSTEM_TYPE;
}
}else {
Department dept = new Department(null,name,city);
msg = MessageBean.DEPT_SUCCESS_TYPE;
try {
departService.save(dept);
} catch (DeptException e) {
msg =Integer.parseInt(e.getMessage()) ;
} catch (Exception e) {
msg=MessageBean.DEPT_FALL_SYSTEM_TYPE;
}
}
response.sendRedirect("/2-05-Department/toDepartmentListServlet?msg="+msg);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
DeptDeleteServlet.java
package cn.wolfcode.two.department.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.wolfcode.two.department.service.IDepartmentService;
import cn.wolfcode.two.department.service.impl.DepartmentServiceImpl;
import cn.wolfcode.two.utils.DeptException;
import cn.wolfcode.two.utils.MessageBean;
public class DeptDeleteServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected IDepartmentService departService = new DepartmentServiceImpl();
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取数据
String[] ids = request.getParameterValues("id");
//构建service参数
Long[] idsLong = new Long[ids.length];
for (int i = 0; i < idsLong.length; i++) {
idsLong[i] = Long.parseLong(ids[i]);
}
Integer msg = MessageBean.DEPT_SUCCESS_DELETE_TYPE;
try {
departService.deleteMany(idsLong);
} catch (DeptException e) {
msg =Integer.parseInt(e.getMessage()) ;
} catch (Exception e) {
msg=MessageBean.DEPT_FALL_SYSTEM_TYPE;
}
response.sendRedirect("/2-05-Department/toDepartmentListServlet?msg="+msg);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
ToDepartmentListServlet.java
package cn.wolfcode.two.department.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.wolfcode.two.department.entity.Department;
import cn.wolfcode.two.department.qo.DepartmentQo;
import cn.wolfcode.two.department.service.IDepartmentService;
import cn.wolfcode.two.department.service.impl.DepartmentServiceImpl;
import cn.wolfcode.two.utils.MessageBean;
import cn.wolfcode.two.utils.PageBean;
public class ToDepartmentListServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
// 接口是一个标识. 是一个协议. 接口可以区分不同的使用级别 V8
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//功能1 第一次进入
String method = request.getMethod();
if(method.equalsIgnoreCase("get")) {
first(request,response);
}else {//功能2 查询进入
form(request,response);
}
}
protected void first(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
IDepartmentService departService=new DepartmentServiceImpl();
if(request.getParameter("msg")!=null) {
String msg = request.getParameter("msg");
request.setAttribute("msg", new MessageBean().get(Integer.parseInt(msg)));
}
request.setCharacterEncoding("UTF-8");
String msg = request.getParameter("msg");
DepartmentQo qo=new DepartmentQo();
PageBean<Department> list = departService.selectList(qo, 1, 3);
//第一页数据
System.out.println(list);
request.setAttribute("pageInfo", list);
request.setAttribute("qo", qo);
//request.setAttribute("msg", new MessageBean().get(Integer.parseInt(msg)));
request.getRequestDispatcher("/WEB-INF/viiew/department/list.jsp").forward(request, response);
}
protected void form(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
IDepartmentService departService=new DepartmentServiceImpl();
request.setCharacterEncoding("UTF-8");
String keyword = request.getParameter("keyword");
String idFrom = request.getParameter("idFrom");
String idTo = request.getParameter("idTo");
String pageNum = request.getParameter("pageNum");
String pageSize = request.getParameter("pageSize");
DepartmentQo qo=new DepartmentQo();
qo.setKeyword(keyword);
try {
qo.setIdFrom(Long.parseLong(idFrom));
} catch (Exception e) {
qo.setIdFrom(null);
}
try {
qo.setIdTo(Long.parseLong(idTo));
} catch (Exception e) {
qo.setIdTo(null);
}
PageBean<Department> list = departService.selectList(qo,Integer.parseInt(pageNum),Integer.parseInt(pageSize));
//第一页数据
request.setAttribute("pageInfo", list);
request.setAttribute("qo", qo);//目标为了数据的回写
request.getRequestDispatcher("/WEB-INF/viiew/department/list.jsp").forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
ToDeptInput.java
package cn.wolfcode.two.department.servlet;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.wolfcode.two.department.entity.Department;
import cn.wolfcode.two.department.service.IDepartmentService;
import cn.wolfcode.two.department.service.impl.DepartmentServiceImpl;
public class ToDeptInput extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String id = request.getParameter("id");
String title = "增加";
if(id!=null) {
IDepartmentService departService = new DepartmentServiceImpl();
Department department = departService.selectOne(Long.parseLong(id));
title = "编辑";
request.setAttribute("department", department);
}
//与entity对象的区别不大
Map<String,String> citys = new HashMap<>();
citys.put("sy", "沈阳");
citys.put("as", "鞍山");
citys.put("ly", "辽阳");
citys.put("dl", "大连");
request.setAttribute("citys", citys);
request.setAttribute("title", title);
request.getRequestDispatcher("/WEB-INF/viiew/department/input.jsp").forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
mybatis.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>
<properties resource="conf/db.properties"></properties>
<typeAliases >
<package name="cn.wolfcode.two.department.entity"/>
</typeAliases>
<environments default="mysql5">
<environment id="mysql5">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="cn.wolfcode.two.utils.DruidDataSourceFactory">
<property name="driverClass" value="${mysql.driverName}"/>
<property name="url" value="${mysql.url}"/>
<property name="username" value="${mysql.username}"/>
<property name="password" value="${mysql.password}"/>
</dataSource>
</environment>
</environments>
<!-- mapper 表级 -->
<mappers >
<!-- <mapper class="cn.wolfcode.two.utils.DruidDataSourceFactory"/> -->
<!-- <mapper resource="cn/wolfcode/mapper/AccountMapper.xml"/> -->
<package name="cn.wolfcode.two.department.mapper"/>
</mappers>
</configuration>
list.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>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
function go(type){
let pageNum= document.getElementById("pageNum").value;
switch(type){
case -1:
pageNum=parseInt(pageNum)-1;
document.getElementById("pageNum").value=pageNum;
break;
case -2:
pageNum=parseInt(pageNum)+1;
document.getElementById("pageNum").value=pageNum;
break;
case 1:
document.getElementById("pageNum").value=1;
break;
case 999:
document.getElementById("pageNum").value=999;
break;
}
//js 控制表单提交
document.getElementById("searchForm").submit();
}
function deleteOne(id) {
if(window.confirm("确定要删除吗?")){
let context="<input type='hidden' name='id' value='"+id+"'>";
//同上,es6新特性,let es6新特性
//context = `<input type='hidden' name='id' value='${id}'>`;
//let(有范围的变量) var(全局,没有范围,方法除外)
document.getElementById("editForm").innerHTML=context;//把context放入到rorm标签之间
document.getElementById("editForm").submit();//提交表单
}
}
function deleteMany() {
//验证多选框是否选一个
document.getElementById("delete_bath_error").style.display="none";
//num选中元素的个数
let num = 0;
//获取所有name = id的元素数组
let ids = document.getElementsByName("id");
//遍历数组,id指的是name=id的元素,是input的对象
for (let id of ids) {
//多选框中的属性checked 如果是true是选中的 false是没选中
if(id.checked==true){
num++;
}
}
if(num<1){//判断是否有选中的元素
document.getElementById("delete_bath_error").style.display="";
return;
}
if(window.confirm("确定要删除吗?")){
document.getElementById("editForm").submit();//提交表单
}
}
function checkAllFunc() {
let b=document.getElementById("checkall").checked;
let ids=document.getElementsByName("id");
for (let id of ids){
id.checked=b;
}
}
function checkItem() {
//获取所有name=id的元素
let ids=document.getElementsByName("id");
let totalNum=ids.length;//元素的总数
let checkedNum=0;//选中元素的个数
//遍历所有的元素
for (let id of ids){
if(id.checked==true){//如果id被选中
checkedNum++;//选中个数加一
}
}
if(totalNum==checkedNum){//都选中状态
document.getElementById("checkall").checked=true;
}else {//有没选中的状态
document.getElementById("checkall").checked=false;
}
}
</script>
</head>
<body>
<c:if test="${!empty requestScope.msg }">
<script type="text/javascript">alert('${requestScope.msg}');</script>
</c:if>
<h1>部门列表管理</h1>
<div>
<form action="/2-05-Department/toDepartmentListServlet" id="searchForm" method="post" >
关键字: <input type="text" name="keyword" placeholder="请输入用户名" value="${requestScope.qo.keyword}">
编号:从 <input type="text" name="idFrom" value="${requestScope.qo.idFrom}">
至 <input type="text" name="idTo" value="${requestScope.qo.idTo}">
<button type="submit">查询</button>
<button type="button" onclick="window.location.href='/2-05-Department/toDeptInput';">添加</button>
<button type="button" onclick="deleteMany()">批量删除</button>
<input type="hidden" name="pageNum" id="pageNum" value="${requestScope.pageInfo.pageNum}">
</form>
</div>
<hr>
<form action="/2-05-Department/deptServlet" id="editForm" method="post"></form>
<div align="center" style="margin-top: 50px">
<table border="1" width="70%">
<caption style="font-size: 30px;font-weight: bold;">部门一览信息表</caption>
<thead>
<tr>
<th><input type="checkbox" id="checkall" onclick="checkAllFunc()"></th>
<th>序号</th>
<th>部门编号</th>
<th>部门名称</th>
<th>城市</th>
<th>操作</th>
</tr>
</thead>
<tbody id="deptBody">
<c:forEach items="${requestScope.pageInfo.list}" var="dept" varStatus="i">
<tr align="center">
<td> <input type="checkbox" form="editForm" onclick="checkItem()" name="id" value="${dept.id}"></td>
<td>${i.count}</td>
<td>${dept.id}</td>
<td>${dept.name}</td>
<td>${dept.city}</td>
<td><a href="javascript:void(0)" onclick="window.location.href='/2-05-Department/toDeptInput?id=${dept.id}';">编辑</a>
<a href="javascript:void(0)" onclick="deleteOne(${dept.id});">删除</a></td>
</tr>
</c:forEach>
</tbody>
</table>
<br><span id="delete_bath_error" style="display: none;color:red;font-size:8px">批量删除至少选一个元素</span>
</div>
<div align="center" style="margin-top: 50px">
<c:if test="${requestScope.pageInfo.pageNum==1}">
首页
</c:if>
<c:if test="${requestScope.pageInfo.pageNum!=1}">
<a href="javascript:void(0)" onclick="go(1)">首页</a>
</c:if>
<a href="javascript:void(0)" onclick="go(-1)">上一页</a>
<a href="javascript:void(0)" onclick="go(-2)">下一页</a>
<c:if test="${requestScope.pageInfo.pageNum==requestScope.pageInfo.pages}">
末页
</c:if>
<c:if test="${requestScope.pageInfo.pageNum!=requestScope.pageInfo.pages}">
<a href="javascript:void(0)" onclick="go(999)">末页</a>
</c:if>
每页<select name="pageSize" id="pageSize" form="searchForm" onchange="go(-3)">
<option value="3">3</option>
<option value="5">5</option>
<option value="10">10</option>
</select>
<script type="text/javascript">
//通过js给select元素设定默认值
document.getElementById("pageSize").value='${requestScope.pageInfo.pageSize}';
</script>
${requestScope.pageInfo.pageNum}/${requestScope.pageInfo.pages}
</div>
</body>
</html>
input.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>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
function editSubmit() {
//错误消息复位
document.getElementById("name_error").style.display="none";
document.getElementById("city_error").style.display="none";
//获取表单信息
let name = document.getElementById("name").value;
let city = document.getElementById("city").value;
//开始验证
let b = true;
if(/^\s*$/.test(name)){
b=false;
document.getElementById("name_error").style.display="";
}
if(city==""){
b=false;
document.getElementById("city_error").style.display="";
}
//b决定是否提交问题
return b;
}
</script>
</head>
<body>
<h1>部门${requestScope.title}</h1>
<div align="center">
<form action="/2-05-Department/departmentSaveOrUpdateServlet" id="editForm" method="post" onsubmit="return editSubmit();">
<input type="hidden" name="id" id="id">
<div style="margin-top: 50px"> 部门名称<input type="text" name="name" id="name"><br>
<span id="name_error" style="display:none;color:red">部门名称不能为空</span> </div>
<div style="margin-top: 50px"> 所在城市<select name="city" id="city">
<option value="">请选择:</option>
<c:forEach items="${requestScope.citys}" var="city">
<option value="${city.value}">${city.value}</option>
</c:forEach>
</select>
<span id="city_error" style="display: none;color: red">城市必须选择</span>
</div>
<div style="margin-top: 50px"> <button type="submit">${requestScope.title}</button> <button type="reset">重置</button></div>
</form>
</div>
</body>
</html>