1 利用Spring+JDBC Template实现员工更新功能(基于T_EMP表)

在课上案例“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>