在课上案例“Spring+JDBCTemplate实现员工列表显示”基础上,利用Spring+JDBC Template实现员工更新功能。
参考答案
步骤一:新建工程
复制课上名为“SpringJDBC_Day06_Part2”的工程;新建名为“SpringJDBC_06_exec”的web工程,工程结构如图-1所示。
图–1
图-1中,背景为深颜色标识的类和页面,是本案例中需要新增或修改的内容。
步骤二:EmpDAO接口
修改EmpDAO接口,添加如图-2所示背景色为深色的两个方法。
图 - 2
步骤三:修改JdbcEmpDAO类
修改JdbcEmpDAO类,实现findByNo方法和update方法,代码如图-3所示。
图– 3
步骤四:新建Test2类
新建Test2类,在该类中测试findByNo方法和update方法,代码如下所示:
package org.tarena.test; import java.sql.Date; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.tarena.dao.EmpDAO; import org.tarena.entity.Emp; public class Test2 { public static void main(String[] args) throws Exception{ String conf = "applicationContext.xml"; ApplicationContext ac = new ClassPathXmlApplicationContext(conf); EmpDAO empDao = ac.getBean("jdbcEmpDAO",EmpDAO.class); Emp emp = new Emp(); emp.setEmpno(1); emp.setEname("terry"); emp.setJob("sales"); emp.setMgr(3); emp.setHiredate(new Date(System.currentTimeMillis())); emp.setSal(800.00); emp.setComm(200.00); emp.setDeptno(20); Emp e = empDao.findByNo(emp.getEmpno()); System.out.println("----------------修改前的数据-------------"); System.out.println(e.getEmpno() +" "+e.getEname()+" "+e.getJob()+" "+e.getMgr() +" "+e.getHiredate()+" "+e.getSal()+" "+e.getComm()+" "+e.getDeptno()); //修改 empDao.update(emp); //再次获取数据 e = empDao.findByNo(emp.getEmpno()); System.out.println("----------------修改后的数据-------------"); System.out.println(e.getEmpno() +" "+e.getEname()+" "+e.getJob()+" "+e.getMgr() +" "+e.getHiredate()+" "+e.getSal()+" "+e.getComm()+" "+e.getDeptno()); } }
步骤五:运行Test2类
运行Test1类,控制台输入结果如下图-4所示。
图– 4
控制台输出如图-4所示的信息,说明getByNo方法和update方法测试成功。
步骤六:创建EmpListController类
创建类UpdateEmpController,在该类中toUpdate方法实现修改前数据的回填;update方法实现修改数据,代码如下所示:
package org.tarena.web; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.tarena.dao.EmpDAO; import org.tarena.entity.Emp; @Controller public class UpdateEmpController { private EmpDAO dao; @Autowired public void setDao(EmpDAO dao) { this.dao = dao; } @RequestMapping("/emp/toUpdate") public String toUpdate(@RequestParam("empno") String empno,Model model){ Emp e = dao.findByNo(Integer.parseInt(empno)); model.addAttribute("emp", e); return "updateEmp"; } @RequestMapping("/emp/update") public String update(Emp emp){ dao.update(emp); return "redirect:../emp/list.do"; } @ModelAttribute("deptMap") public Map<String, Object> getAllDept() { Map<String,Object> deptMap = new HashMap<String, Object>(); deptMap.put("10", "ACCOUNTING"); deptMap.put("20", "RESEARCH"); deptMap.put("30", "SALES"); deptMap.put("40", "OPERATIONS"); return deptMap; } }
步骤七:创建updateEmp.jsp文件
创建updateEmp.jsp,该文件的代码如下:
<%@page pageEncoding="utf-8" contentType="text/html;charset=utf-8" %> <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> <html> <title>表单标签-更新初始显示</title> <body> <form:form action="../emp/update.do" method="post" commandName="emp"> <form:hidden path="empno"/> 姓名:<form:input path="ename"/><br> 职位:<form:select path="job" > <form:option value="SALESMAN" label="SALESMAN" /> <form:option value="MANAGER" label="MANAGER" /> <form:option value="CLERK" label="CLERK" /> <form:option value="PRESIDENT" label="PRESIDENT" /> <form:option value="ANALYST" label="ANALYST" /> </form:select><br> 管理者:<form:input path="mgr"/><br> 入职时间:<form:input path="hiredate"/><br> 工资:<form:input path="sal"/><br> 奖金:<form:input path="comm"/><br> 所在部门:<form:select path="deptno" items="${deptMap}"/><br> <input type="submit" value="修改"> </form:form> </body> </html>
步骤八:修改emp_list.jsp文件
修改的内容如图-5所示。
图– 5
步骤九:运行
在浏览器输入地址:
http://localhost:8080/工程名/emp/list.do
显示页面如图-6所示。
图- 6
然后,点击第一行后面的“修改”(以修改第一行为例),进入如图-7所示的页面。
图– 7
修改如图-8所示的姓名和时间。
图– 8
点击“修改”按钮,返回到如图-9所示的页面。
图– 9
EmpDAO接口的完整代码如下所示:
package org.tarena.dao; import java.util.List; import org.tarena.entity.Emp; public interface EmpDAO { public List<Emp> findAll(); public Emp findByNo(int no); public void update(Emp emp); }
JdbcEmpDAO类的完整代码如下所示:
package org.tarena.dao; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Repository; import org.tarena.entity.Emp; import org.tarena.entity.EmpMapper; @Repository public class JdbcEmpDAO implements EmpDAO{ private JdbcTemplate template; @Autowired public void setTemplate(JdbcTemplate template){ this.template = template; } public List<Emp> findAll() { String sql = "select * from t_emp"; RowMapper<Emp> mapper = new EmpMapper(); List<Emp> list = template.query(sql, mapper); return list; } public Emp findByNo(int no) { String sql = "select * from t_emp where EMPNO=?"; Object[] params = {no}; RowMapper<Emp> mapper = new EmpMapper(); Emp emp =template.queryForObject(sql, params,mapper); return emp; } public void update(Emp emp) { String sql = "update t_emp " + "set ENAME=?,JOB=?,MGR=?," + "HIREDATE=?,SAL=?,COMM=?,DEPTNO=? " + "where EMPNO=?"; Object[] params = { emp.getEname(), emp.getJob(), emp.getMgr(), emp.getHiredate(), emp.getSal(), emp.getComm(), emp.getDeptno(), emp.getEmpno() }; template.update(sql,params); } }
Test2类的完整代码如下所示:
package org.tarena.test; import java.sql.Date; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.tarena.dao.EmpDAO; import org.tarena.entity.Emp; public class Test2 { public static void main(String[] args) throws Exception{ String conf = "applicationContext.xml"; ApplicationContext ac = new ClassPathXmlApplicationContext(conf); EmpDAO empDao = ac.getBean("jdbcEmpDAO",EmpDAO.class); Emp emp = new Emp(); emp.setEmpno(1); emp.setEname("terry"); emp.setJob("sales"); emp.setMgr(3); emp.setHiredate(new Date(System.currentTimeMillis())); emp.setSal(800.00); emp.setComm(200.00); emp.setDeptno(20); Emp e = empDao.findByNo(emp.getEmpno()); System.out.println("----------------修改前的数据-------------"); System.out.println(e.getEmpno() +" "+e.getEname()+" "+e.getJob()+" "+e.getMgr() +" "+e.getHiredate()+" "+e.getSal()+" "+e.getComm()+" "+e.getDeptno()); //修改 empDao.update(emp); //再次获取数据 e = empDao.findByNo(emp.getEmpno()); System.out.println("----------------修改后的数据-------------"); System.out.println(e.getEmpno() +" "+e.getEname()+" "+e.getJob()+" "+e.getMgr() +" "+e.getHiredate()+" "+e.getSal()+" "+e.getComm()+" "+e.getDeptno()); } }
UpdateEmpController类的完整代码如下所示:
package org.tarena.web; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.tarena.dao.EmpDAO; import org.tarena.entity.Emp; @Controller public class UpdateEmpController { private EmpDAO dao; @Autowired public void setDao(EmpDAO dao) { this.dao = dao; } @RequestMapping("/emp/toUpdate") public String toUpdate(@RequestParam("empno") String empno,Model model){ Emp e = dao.findByNo(Integer.parseInt(empno)); model.addAttribute("emp", e); return "updateEmp"; } @RequestMapping("/emp/update") public String update(Emp emp){ dao.update(emp); return "redirect:../emp/list.do"; } @ModelAttribute("deptMap") public Map<String, Object> getAllDept() { Map<String,Object> deptMap = new HashMap<String, Object>(); deptMap.put("10", "ACCOUNTING"); deptMap.put("20", "RESEARCH"); deptMap.put("30", "SALES"); deptMap.put("40", "OPERATIONS"); return deptMap; } }
emp_list.jsp页面的完整代码如下所示:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <html> <head> <title>员工列表示例</title> </head> <body> <table border="1"> <tr> <td>编号</td> <td>姓名</td> <td>工资</td> <td>入职时间</td> <td>操作</td> </tr> <c:forEach items="${emps}" var="emp"> <tr> <td>${emp.empno }</td> <td>${emp.ename }</td> <td>${emp.sal }</td> <td>${emp.hiredate }</td> <td><a href="../emp/toUpdate.do?empno=${emp.empno }">修改</a></td> </tr> </c:forEach> </table> </body> </html>
updateEmp.jsp页面的完整代码如下所示:
<%@page pageEncoding="utf-8" contentType="text/html;charset=utf-8" %> <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> <html> <title>表单标签-更新初始显示</title> <body> <form:form action="../emp/update.do" method="post" commandName="emp"> <form:hidden path="empno"/> 姓名:<form:input path="ename"/><br> 职位:<form:select path="job" > <form:option value="SALESMAN" label="SALESMAN" /> <form:option value="MANAGER" label="MANAGER" /> <form:option value="CLERK" label="CLERK" /> <form:option value="PRESIDENT" label="PRESIDENT" /> <form:option value="ANALYST" label="ANALYST" /> </form:select><br> 管理者:<form:input path="mgr"/><br> 入职时间:<form:input path="hiredate"/><br> 工资:<form:input path="sal"/><br> 奖金:<form:input path="comm"/><br> 所在部门:<form:select path="deptno" items="${deptMap}"/><br> <input type="submit" value="修改"> </form:form> </body> </html>