spring + springmvc + mybatis 练习
点击ID跳转至修改页面

第1步:写实体类
封装不要忘了加喔!
第2步:写出DAO 层接口
员工类型接口
员工接口
由于本项目的持久层采用mybatis框架,那么接下来我们要写出DAO层相应的mapper文件
2.1先写出StaffType(员工类型类的mapper文件)
<?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.staffmanager.dao.IStaffTypeDao"> <select id="findStaffTypeByTypeId" resultType="StaffType" parameterType="StaffType"> select * from Stafftype where id=#{id} </select> <select id="findAllStaffType" resultType="StaffType"> select * from stafftype </select> </mapper>
2.2再写出Staff(员工类的mapper文件)
<?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.staffmanager.dao.IStaffDao"> <resultMap type="Staff" id="StaffMap"> <!-- <result property="id" javaType="int" column="id" /> <result property="name" javaType="java.lang.String" column="name" /> <result property="age" javaType="int" column="age" /> <result property="entryDate" javaType="java.util.Date" column="entryDate" /> <result property="staffDesc" javaType="java.lang.String" column="staffDesc" /> --> <association property="staffType" javaType="StaffType" column="typeId" select="com.staffmanager.dao.IStaffTypeDao.findStaffTypeByTypeId"> </association> </resultMap> <select id="findAllStaff" resultMap="StaffMap"> select * from staff </select> <update id="updateStaff" parameterType="Staff"> update staff set name=#{name},typeId=#{typeId},age=#{age},entryDate=#{entryDate},staffDesc=#{staffDesc} where id=#{id} </update> <select id="findStaffById" resultType="Staff" parameterType="Staff"> select * from staff where id=#{id} </select> </mapper>
第3步:编写DAO层staffType接口的实现类
package com.staffmanager.dao.impl; import java.util.List; import javax.annotation.Resource; import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.support.SqlSessionDaoSupport; import org.springframework.stereotype.Repository; import com.staffmanager.dao.IStaffTypeDao; import com.staffmanager.entity.StaffType; @Repository("staffTypeDao") public class StaffTypeDaoImpl extends SqlSessionDaoSupport implements IStaffTypeDao { //注入工厂 @Resource(name = "sqlSessionFactory") public void set(SqlSessionFactory sqlSessionFactory) { super.setSqlSessionFactory(sqlSessionFactory); } public StaffType findStaffTypeByTypeId(StaffType staffType) { return getSqlSession().selectOne( "com.staffmanager.dao.IStaffTypeDao.findStaffTypeByTypeId", staffType); } public List<StaffType> findAllStaffType() { return getSqlSession().selectList( "com.staffmanager.dao.IStaffTypeDao.findAllStaffType"); } }
3.2编写staff接口实现类
package com.staffmanager.dao.impl; import java.util.List; import javax.annotation.Resource; import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.support.SqlSessionDaoSupport; import org.springframework.stereotype.Repository; import com.staffmanager.dao.IStaffDao; import com.staffmanager.entity.Staff; @Repository("staffDao") public class StaffDaoImpl extends SqlSessionDaoSupport implements IStaffDao { //注入工厂 @Resource(name = "sqlSessionFactory") public void set(SqlSessionFactory sqlSessionFactory) { super.setSqlSessionFactory(sqlSessionFactory); } //查询所有 public List<Staff> findAllStaff() { return getSqlSession().selectList("com.staffmanager.dao.IStaffDao.findAllStaff"); } //更新 public int updateStaff(Staff staff) { return getSqlSession().update("com.staffmanager.dao.IStaffDao.updateStaff", staff); } //根据ID查找 public Staff findStaffById(Staff staff) { return getSqlSession().selectOne("com.staffmanager.dao.IStaffDao.findStaffById", staff); } }
第4步:在applicationContext.xml中配置数据源
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd "> <context:component-scan base-package="com.staffmanager"></context:component-scan> <!--数据源--> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"> </property> <property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:orcl"> </property> <property name="username" value="scott"></property> <property name="password" value="orcl"></property> </bean> <!--sql会话工厂 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource"> <ref bean="dataSource" /> </property> <!--指定类型别名包路径 --> <property name="typeAliasesPackage" value="com.staffmanager.entity"></property> <!--映射文件 --> <property name="mapperLocations"> <list> <value>classpath:com/staffmanager/dao/IStaffDaoMapper.xml</value> <value>classpath:com/staffmanager/dao/IStaffTypeDaoMapper.xml </value> </list> </property> </bean> </beans>
第5步:在这里我们要考虑一个问题,当我们点击修改页面的时候,在该页面的相关栏目里应该有相应的初始化数据也就是我们在修改之前的数据要显示出来。那么这时候我们在写业务层之前就要把该实例的类写出来,在业务层将该类的对象作为一个属性。
第6步:DAO层为数据访问层,BIZ层被称之为业务访问层
BIZ实现类
package com.staffmanager.biz.impl; import java.util.List; import javax.annotation.Resource; import org.springframework.stereotype.Service; import com.staffmanager.bean.InitUpdateBean; import com.staffmanager.biz.IStaffManagerBiz; import com.staffmanager.dao.IStaffDao; import com.staffmanager.dao.IStaffTypeDao; import com.staffmanager.entity.Staff; import com.staffmanager.entity.StaffType; @Service("staffManagerBiz") public class StaffManagerBizImpl implements IStaffManagerBiz { @Resource(name = "staffDao") private IStaffDao staffDao; @Resource(name = "staffTypeDao") private IStaffTypeDao staffTypeDao; public List<Staff> findAllStaff() { return staffDao.findAllStaff(); } public InitUpdateBean initUpdateById(Staff staff) { Staff staffTemp = staffDao.findStaffById(staff); List<StaffType> staffTypeItems = staffTypeDao.findAllStaffType(); InitUpdateBean initUpdateBean = new InitUpdateBean(); initUpdateBean.setStaff(staffTemp); initUpdateBean.setStaffTypeItems(staffTypeItems); return initUpdateBean; } public boolean updateStaff(Staff staff) { int count = staffDao.updateStaff(staff); if (count == 1) { return true; } return false; } }
第7部:我们在这里开始写程序的控制层,控制层好比就是我们的大脑,大脑控制着我们的肢体。
package com.staffmanager.controller; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import com.staffmanager.bean.InitUpdateBean; import com.staffmanager.biz.IStaffManagerBiz; import com.staffmanager.entity.Staff; @Controller("StaffManagerController") @Scope("prototype") @RequestMapping("/") public class StaffManagerController { //注入控制层的下一层业务层对象作为该类的属性 @Resource(name="staffManagerBiz") private IStaffManagerBiz staffManagerBiz; //查询所有信息放置list集合staffItems对象中 @RequestMapping("findAllStaff") public String findAllStaff(HttpServletRequest request){ List<Staff> staffItems=staffManagerBiz.findAllStaff(); request.setAttribute("staffItems", staffItems); return "list.jsp"; } //初始化方法需要两个参数分别为员工对象和http请求对象 @RequestMapping("initUpdate") public String initUpdate(Staff staff,HttpServletRequest request){ InitUpdateBean initUpdateBean =staffManagerBiz.initUpdateById(staff); request.setAttribute("initUpdateBean", initUpdateBean); return "update.jsp"; } @RequestMapping("updateStaff") public String updateStaff(Staff staff,String entryDateTemp){ //把String类型的日期转换为日期类型 //1,创建simpleDateFormat对象 SimpleDateFormat simpleDateFormat =new SimpleDateFormat("yyyy-MM-dd"); try { //2,通过该对象的parse方法吧字符串型日期转换为Date类型 Date date=simpleDateFormat.parse(entryDateTemp); staff.setEntryDate(date); } catch (Exception e) { // TODO: handle exception } boolean bool =staffManagerBiz.updateStaff(staff); if (bool) { return "success.jsp"; } return "fail.jsp"; } }
第8步:控制层写完了,经过这么一层又一层的连接调用终于可以把数据库里面的数据按照需求放到显示层了。想想就激动啊!!
8.1显示所有
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!-- c标签 --> <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <!-- 格式 --> <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%> <% String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'list.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- 导入jquery插件 --> <script type="text/javascript" src="js/jquery-1.8.3.js"></script> <script type="text/javascript"> $(function() { $("tr:odd").css("background-color", "pink"); }); </script> </head> <body> <table border="1" align="center" width="60%"> <tr> <td align="center" colspan="6"> 员工信息管理 </td> </tr> <tr> <td> 编号 </td> <td> 名称 </td> <td> 类型 </td> <td> 年龄 </td> <td> 入职时间 </td> <td> 员工描述 </td> </tr> <c:forEach var="staff" items="${staffItems}"> <tr> <td> <a href="initUpdate.do?id=${staff.id } ">${staff.id }</a> </td> <td> ${staff.name } </td> <td> ${staff.staffType.name } </td> <td> ${staff.age } </td> <td> <fmt:formatDate value="${staff.entryDate }" pattern="yyyy-MM-dd" /> </td> <td> ${staff.staffDesc } </td> </tr> </c:forEach> </table> </body> </html>
8.2更新页面
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%> <% String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'update.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> </head> <body> <form action="updateStaff.do" method="post"> <table> <tr> <td colspan="2"> 员工详细信息 </td> </tr> <tr> <td> 编号: </td> <td> <input type="text" name="id" value="${initUpdateBean.staff.id }" /> </td> </tr> <tr> <td> 名称: </td> <td> <input type="text" name="name" value="${initUpdateBean.staff.name }" /> </td> </tr> <tr> <td> 类型 </td> <td> <select name="typeId"> <c:forEach var="staffType" items="${initUpdateBean.staffTypeItems}"> <c:choose> <c:when test="${staffType.id==initUpdateBean.staff.typeId}"> <option value="${staffType.id }" selected="selected"> ${staffType.name } </option> </c:when> <c:otherwise> <option value="${staffType.id }"> ${staffType.name } </option> </c:otherwise> </c:choose> </c:forEach> </select> </td> </tr> <tr> <td> 年龄: </td> <td> <input type="text" name="age" value="${initUpdateBean.staff.age }" /> </td> </tr> <tr> <td> 入职时间: </td> <td> <input type="text" name="entryDateTemp" value="<fmt:formatDate value="${ initUpdateBean.staff.entryDate}" pattern="yyyy-MM-dd"/>" /> </td> </tr> <tr> <td> 描述 </td> <td> <textarea name="staffDesc" rows="8">${initUpdateBean.staff.staffDesc }</textarea> </td> </tr> </table> <input type="submit" value="提交" /> </form> </body> </html>
8.3,成功与失败页面
index页面重定向
在WEB.xml中别忘了配置相关的过滤器喔!
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <servlet> <servlet-name>DispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>DispatcherServlet</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> <filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>*.do</url-pattern> </filter-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
game over
浙公网安备 33010602011771号