一、CRUD简介
(1)什么是CRUD
CRUD:Create( 创 建 ) Retrieve(查询) Update(更新) Delete(删除)
(2)使用了什么技术
ssm:SpringMVC+Spring+MyBatis
(3)版本
V1 : ssm
V2 : ssm+Ajax
V3 : ssm+Ajax+bootstrap
二、 数据库准备
create database crud;
use crud;
set foreign_key_checks=0;
create table `department` (
`did` int(11) not null auto_increment,
`dname` varchar(50) default null,
primary key (`did`)
) engine=innodb auto_increment=13 default charset=utf8;
-- ----------------------------
-- records of department
-- ----------------------------
insert into `department` values ('1', 'java开发部');
insert into `department` values ('2', '测试部门');
insert into `department` values ('3', '需求部门');
insert into `department` values ('4', '前端部门');
insert into `department` values ('5', '宣传');
insert into `department` values ('6', '部署');
insert into `department` values ('7', '维护');
insert into `department` values ('8', '研发');
create table `employee` (
`eid` int(11) not null auto_increment,
`ename` varchar(30) default null,
`gender` varchar(4) default null,
`did` int(11) default null,
primary key (`eid`),
key `employee_did` (`did`),
constraint `employee_did` foreign key (`did`) references `department` (`did`)
) engine=innodb auto_increment=8 default charset=utf8;
insert into `employee` values ('1', '张三', '男', '1');
insert into `employee` values ('2', '李四', '男', '1');
insert into `employee` values ('3', '王五', '男', '1');
insert into `employee` values ('4', '赵六', '女', '1');
insert into `employee` values ('5', '我是测试', '女', '2');
insert into `employee` values ('6', '我进行需求跟踪', '女', '3');
insert into `employee` values ('7', '我开发前端', '女', '4');
三、完成功能
1.后台代码
1.1创建测试类TestDepartmentService
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class TestDepartmentService {
private static final Logger l = LoggerFactory.getLogger(TestDepartmentService.class);
@Autowired
IDepartmentService service;
@Test
public void test01() {
List<Department> list = service.findAllDepartments();
l.info("获取部门列表: list=" + list);
}
}
1.2 service层接口和实现类
1.2.1 IDepartmentService
public interface IDepartmentService {
//查询所有的部门数据 显示成列表
List<Department> findAllDepartments();``
//添加一个新的部门
void saveDepartment(Department dept);
//删除指定id的部门数据
void deleteDepartmentById(int did);
//根据指定id修改部门名称
void updateDepartmentById(Department dept);
//查找指定id的部门数据
Department findDepartmentById(int did);
}
1.2.2 DempartmentServiceImpl
@Service
public class DempartmentServiceImpl implements IDepartmentService {
@Autowired
private IDepartmentDao dao;
@Override
public List<Department> findAllDepartments() {
List<Department> list = dao.findAll();
return list;
}
@Override
public void saveDepartment(Department dept) {
dao.save(dept);
}
@Override
public void deleteDepartmentById(int id) {
dao.deleteById(id);
}
@Override
public void updateDepartmentById(Department dept) {
dao.update(dept);
}
@Override
public Department findDepartmentById(int did) {
return dao.findById(did);
}
}
1.3 dao接口和映射文件
1.3.1 IDepartmentDao
@Repository
public interface IDepartmentDao {
//select * from department order by did asc;
List<Department> findAll();
//insert into department values(null,'UI');
void save(Department dept);
//delete from department where did = 5;
void deleteById(int id);
//update department set dname = ? where did = 1;
void update(Department dept);
//select * from department where did = 1;
Department findById(int did);
}
1.3.2 IDepartmentDao .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.xgf.dao.IDepartmentDao">
<select id="findAll" resultType="department">
select * from department order by did asc;
</select>
<insert id="save" parameterType="department">
insert into department values(null,#{dname});
</insert>
<delete id="deleteById" parameterType="int">
delete from department where did =#{id};
</delete>
<update id="update" parameterType="department">
update department set dname = #{dname} where did = #{did};
</update>
<select id="findById" parameterType="int" resultType="department">
select * from department where did = #{did};
</select>
</mapper>
1.4 测试能否查询到所有的部门
1.5 DepartmentController
@Controller
@RequestMapping("/dept")
public class DepartmentController {
//slf4j
private static final Logger l = LoggerFactory.getLogger(DepartmentController.class);
@Autowired
private IDepartmentService iDepartmentService;
//查询所有部门并跳转页面显示
@RequestMapping(path = "/deptlist",method = RequestMethod.GET)
public String list(Model model){
List<Department> depts = iDepartmentService.findAllDepartments();
l.info("部门deptlist列表: depts="+depts);
//数据添加到页面
model.addAttribute("depts",depts);
return "list_depts";
}
//一般修改都有回显界面(增加、删除、更新),查询不需要回显页面,就是新出一个页面供你更改数据
//回显就是两个方法,先查询显示,再修改(两个sql)
//跳转新增保存部门的回显页面
@RequestMapping(path="/saveDeptUI",method = RequestMethod.GET)
public String saveDeptUI(){
l.info("跳转saveDeptUI回显页面,进行数据修改 ");
return "saveDeptUI";
}
//新增保存部门
@RequestMapping(path ="/saveDept",method = {RequestMethod.POST})
public String save(Department dept,Model model){
if (dept.getDname() != null && !"".equals(dept.getDname())) {
iDepartmentService.saveDepartment(dept);
l.info("saveDept 保存信息: dept="+dept);
return "redirect:/dept/deptlist";
}else{
model.addAttribute("error_msg","部门名称不能为空");
return "forward:/error_saveDept.jsp"; //错误,部门为空不能增加跳转错误界面
}
}
//删除部门
@RequestMapping(path = "/deleteDept",method = RequestMethod.GET)
public String delete(Integer did){
l.info("deleteDept 删除部门 did = "+did);
iDepartmentService.deleteDepartmentById(did);
return "redirect:/dept/deptlist"; //删除之后再查询所有显示
}
//更新
// 跳转更新回显页面 updateUI?did=23
@RequestMapping(path = "/updateDeptUI",method = RequestMethod.GET)
public String updateUI(Integer did,Model model){
l.info("updateDeptUI 更新部门的 did = "+did);
Department department = iDepartmentService.findDepartmentById(did);
model.addAttribute("dept",department);
return "update_deptUI";
}
//进行更新操作
@RequestMapping(path="/updateDept",method = RequestMethod.POST)
public String update(Department dept){
//打印
l.info("updateDept 更新信息: dept="+dept);
//调用service
iDepartmentService.updateDepartmentById(dept);
//跳到查询页面
return "redirect:/dept/deptlist";
}
}
2.前台页面
2.1 显示全部部门 list_depts.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>部门crud</title>
</head>
<body>
<a href="${pageContext.request.contextPath}/dept/saveDeptUI">新增部门</a>
<br/>
<table border="1px" width="100%">
<tr>
<td>序号</td>
<td>部门编号</td>
<td>部门名称</td>
<td>操作</td>
</tr>
<c:forEach items="${depts}" var="dept" varStatus="vs">
<tr>
<td>${vs.index+1}</td>
<td>${dept.did}</td>
<td>${dept.dname}</td>
<%-- 携带id过去进行删除和更新 --%>
<td><a href="${pageContext.request.contextPath}/dept/deleteDept?did=${dept.did}">删除</a> | <a href="${pageContext.request.contextPath}/dept/updateDeptUI?did=${dept.did}">修改</a></td>
</tr>
</c:forEach>
</table>
</body>
</html>
2.2新增回显页面saveDeptUI
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<title>添加部门</title>
</head>
<body>
<form method="post" action="${pageContext.request.contextPath}/dept/saveDept">
<input type="text" name="dname" placeholder="请输入您要新增的部门名称"/><br/>
<input type="submit" value="保存"/>    
<input type="reset" value="重置"/><br/>
</form>
<a href="${pageContext.request.contextPath}/dept/deptlist">返回部门列表页面</a>
</body>
</html>
2.3更新回显页面update_deptUI
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<title>修改部门</title>
</head>
<body>
<%-- form表单,不会将标记为disabled="disabled"作为参数提交到后台
通过添加一个type="hidden"的input标签来传递id数据 --%>
<form method="post" action="${pageContext.request.contextPath}/dept/updateDept">
<input type="hidden" name="did" value="${dept.did}" >
<input type="text" value="${dept.did}" disabled="disabled"/><br/>
<input type="text" name="dname" value="${dept.dname}"/><br/>
<input type="submit" value="保存修改"/><br/>
</form>
<a href="${pageContext.request.contextPath}/dept/deptlist">返回部门列表页面</a>
</body>
</html>
2.4更新错误页面(error_saveDept.jsp)不能保存空字符串
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<title>错误页面</title>
</head>
<body>
<font color="red">${error_msg}</font>
<br/><br/>
<a href="${pageContext.request.contextPath}/dept/saveDeptUI">返回新增</a><br/>
<a href="${pageContext.request.contextPath}/dept/deptlist">返回部门列表页面</a>
</body>
</html>
2.5实现效果