本博客的内容全部来自于传智播客,特在此说明。
业务要求如下:在jsp页面(jFactoryCreate.jsp)上输入数据时,转到后台,并输入到数据库。
jFactoryCreate.jsp页面:
数据库的字段设计:
项目结构:
运行过程:在jFactortList页面上,点击新建按钮,根据action请求,然后进入到jFactoryCreate.jsp页面,输入要新增加的数据,然后在根据action请求来到Controller控制器类
的FactoryController.java代码。根据前面的action请求执行里面的 public String insertfactory(Factory factory )方法,在执行 public String insertfactory(Factory factory )里面Service方法,再进入到Service里面的Dao层,再执行Mybatis的配置文件的方法。
jFactoryList.jsp代码:
<%@ page language="java" pageEncoding="UTF-8"%> <hr> <font color="blue"><b>引入CSS、JS区域</b></font> <hr> <%@ include file="../../baselist.jsp"%> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title></title> </head> <body> <form name="icform" method="post"> <div id="menubar"> <div id="middleMenubar"> <div id="innerMenubar"> <div id="navMenubar"> <ul> <hr> <font color="blue"><b>按钮区域</b></font> <hr> <li id="view"><a href="#" onclick="formSubmit('toview.action','_self');this.blur();">查看</a></li> <li id="new"><a href="#" onclick="formSubmit('factorycreate.action','_self');this.blur();">新增</a></li> <li id="update"><a href="#" onclick="formSubmit('jfactoryupdate.action','_self');this.blur();">修改</a></li> <li id="delete"><a href="#" onclick="formSubmit('deleteById.action','_self');this.blur();">删除</a></li> <li id="delete"><a href="#" onclick="formSubmit('delete.action','_self');this.blur();">批量删除</a></li> </ul> </div> </div> </div> </div> <!-- 页面主体部分(列表等) --> <div class="textbox" id="centerTextbox"> <div class="textbox-header"> <div class="textbox-inner-header"> <div class="textbox-title"> <hr> <font color="blue"><b>标题</b></font> <hr> 生产厂家列表 </div> </div> </div> <div> <hr> <font color="blue"><b>列表区域</b></font> <hr> <div class="eXtremeTable" > <table id="ec_table" class="tableRegion" width="98%" > <thead> <tr> <td class="tableHeader"><input type="checkbox" name="selid" onclick="checkAll('id',this)"></td> <td class="tableHeader">序号</td> <td class="tableHeader">厂家全称</td> <td class="tableHeader">缩写</td> <td class="tableHeader">联系人</td> <td class="tableHeader">电话</td> <td class="tableHeader">手机</td> <td class="tableHeader">传真</td> <td class="tableHeader">验货员</td> </tr> </thead> <tbody class="tableBody" > <!--var="o"的意思是给datalist取个别名,之后用起来就简单了--> <c:forEach items="${datalist}" var="o" varStatus="status"> <tr class="odd" onmouseover="this.className='highlight'" onmouseout="this.className='odd'" > <!-- 做了一个选择框 --> <td><input type="checkbox" name="id" value="${o.id}"/></td> <td>${status.index+1}</td> <td><a href="toview.action?id=${o.id}">${o.fullName}</a></td> <td>${o.factoryName}</td> <td>${o.contacts}</td> <td>${o.phone }</td> <td>${o.mobile }</td> <td>${o.fax }</td> <td>${o.inspector }</td> </tr> </c:forEach> </tbody> </table> </div> </div> </form> </body> </html>
点击新增按钮后根据'factorycreate.action'请求来到FactoryControll.java。
package cn.itcast.jk.controller.basicinfo.factory; import java.util.List; import javax.annotation.Resource; 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 cn.itcast.jk.controller.BaseController; import cn.itcast.jk.domain.Factory; import cn.itcast.jk.service.FactoryService; @Controller public class FactoryController extends BaseController { @Resource FactoryService factoryService; //列表 @RequestMapping("/basicinfo/factory/list.action") public String list(Model model) { List<Factory> datalist=factoryService.find(null); model.addAttribute("datalist", datalist);//将我的数据传递到页面; return "/basicinfo/factory/jFactoryList.jsp"; } //跳转到新增的页面 @RequestMapping("/basicinfo/factory/factorycreate.action") public String factorycreate(Factory factory ) { return "/basicinfo/factory/jFactoryCreate.jsp"; } //保存新增加的数据 @RequestMapping("/basicinfo/factory/insertfactory.action") public String insertfactory(Factory factory ) { factoryService.insert(factory); return "redirect:/basicinfo/factory/list.action"; } }
跳转到jFactoryCreate.jsp页面:
<%@ page language="java" pageEncoding="UTF-8"%> <%@ include file="../../base.jsp"%> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title></title> </head> <body> <form method="post"> <div id="menubar"> <div id="middleMenubar"> <div id="innerMenubar"> <div id="navMenubar"> <ul> <li id="save"><a href="#" onclick="formSubmit('insertfactory.action','_self');">确定</a></li> <li id="back"><a href="list.action">返回</a></li> </ul> </div> </div> </div> </div> <div class="textbox" id="centerTextbox"> <div class="textbox-header"> <div class="textbox-inner-header"> <div class="textbox-title">新增厂家信息</div> </div> </div> <div> <div> <table class="commonTable" cellspacing="1"> <tr> <td class="columnTitle_mustbe">厂家名称:</td> <td class="tableContent"><input type="text" name="fullName" /></td> <td class="columnTitle_mustbe">厂家简称</td> <td class="tableContent"><input type="text" name="factoryName" /></td> </tr> <tr> <td class="columnTitle_mustbe">联系人:</td> <td class="tableContent"><input type="text" name="contacts" /></td> <td class="columnTitle_mustbe">电话</td> <td class="tableContent"><input type="text" name="phone" /></td> </tr> <tr> <td class="columnTitle_mustbe">手机</td> <td class="tableContent"><input type="text" name="mobile" /></td> <td class="columnTitle_mustbe">传真</td> <td class="tableContent"><input type="text" name="fax" /></td> </tr> <tr> <td class="columnTitle_mustbe">验货员</td> <td class="tableContent"><input type="text" name="inspector" /></td> <td class="columnTitle_mustbe">排序号</td> <td class="tableContent"><input type="text" name="orderNo" /></td> </tr> <tr> <td class="columnTitle_mustbe">备注</td> <td class="tableContent"><textarea name="cnote" style="height:120px;" ></textarea></td> </tr> </table> </div> </div> </form> </body> </html>
在jFactoryCreate.jsp页面上输入好信息后按确定发出'insertfactory.action'请求,再来到FactoryControll.java。执行里面的public String insertfactory(Factory factory )方法,
也就是执行FactoryServiceImpl.java里面的insert方法:
package cn.itcast.jk.service.impl; import java.io.Serializable; import java.util.List; import java.util.Map; import java.util.UUID; import javax.annotation.Resource; import org.springframework.stereotype.Service; import cn.itcast.jk.dao.FactoryDao; import cn.itcast.jk.domain.Factory; import cn.itcast.jk.pagination.Page; import cn.itcast.jk.service.FactoryService; @Service public class FactoryServiceImpl implements FactoryService{ @Resource FactoryDao factoryDao; @Override public List<Factory> findPage(Page page) { return null; } @Override public List<Factory> find(Map paraMap) { return factoryDao.find(paraMap); } @Override public Factory get(Serializable id) { return factoryDao.get(id); } @Override public void insert(Factory factory) {
//我们在jsp页面输入factory数据时不可能输入主键的啊,所以主键的值我们要自己单独输入,我们用UUID作为主键。 factory.setId(UUID.randomUUID().toString()); factoryDao.insert(factory); } @Override public void update(Factory factory) { factoryDao.update(factory); } //删除一条记录 @Override public void deleteById(Serializable id) { factoryDao.deleteById(id); } //删除多条记录 @Override public void delete(Serializable[] ids) { factoryDao.delete(ids); } }
我们按照顺序再来看 factoryDao.insert(factory);也就是BaseDaoImpl.java里面的insert方法。代码如下:
BaseDaoImpl.java代码:
package cn.itcast.jk.dao.impl; import java.io.Serializable; import java.util.List; import java.util.Map; import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.support.SqlSessionDaoSupport; import org.springframework.beans.factory.annotation.Autowired; import cn.itcast.jk.dao.BaseDao; import cn.itcast.jk.pagination.Page; public abstract class BaseDaoImpl<T> extends SqlSessionDaoSupport implements BaseDao<T>{ @Autowired //mybatis-spring 1.0无需此方法;mybatis-spring1.2必须注入。 public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory){ super.setSqlSessionFactory(sqlSessionFactory); } private String ns; //命名空间 public String getNs() { return ns; } public void setNs(String ns) { this.ns = ns; } public List<T> findPage(Page page){ List<T> oList = this.getSqlSession().selectList(ns + ".findPage", page); return oList; } public List<T> find(Map map) { List<T> oList = this.getSqlSession().selectList(ns + ".find", map); return oList; } public T get(Serializable id) { return this.getSqlSession().selectOne(ns + ".get", id); } public void insert(T entity) { this.getSqlSession().insert(ns + ".insert", entity); } public void update(T entity) { this.getSqlSession().update(ns + ".update", entity); } public void deleteById(Serializable id) { this.getSqlSession().delete(ns + ".deleteById", id); } public void delete(Serializable[] ids) { this.getSqlSession().delete(ns + ".delete", ids); } }
最后再来看FactoryMapper.xml代码,执行里面的<insert id="insert" parameterType="cn.itcast.jk.domain.Factory">:
<?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.itcast.jk.mapper"> <!-- factory_c表的映射 --> <resultMap type="cn.itcast.jk.domain.Factory" id="factoryRM" > <id property="id" column="FACTORY_ID"/> <result property="fullName" column="FULL_NAME"/> <result property="factoryName" column="FACTORY_NAME"/> <result property="contacts" column="CONTACTS"/> <result property="phone" column="PHONE"/> <result property="mobile" column="MOBILE"/> <result property="fax" column="FAX"/> <result property="cnote" column="CNOTE"/> <result property="inspector" column="INSPECTOR"/> <result property="orderNo" column="ORDER_NO"/> <result property="createBy" column="CREATE_BY"/> <result property="createDept" column="CREATE_DEPT"/> <result property="createTime" column="CREATE_TIME"/> </resultMap> <select id="find" parameterType="map" resultMap="factoryRM" > select * from factory_c where 1=1 </select> <!-- 当数据库是Oracle时,如果插入的数据是空时,必须是要指定默认的参数。所以这里的设置要这么写:jdbcType=VARCHAR。 --> <insert id="insert" parameterType="cn.itcast.jk.domain.Factory"> insert into factory_c(FACTORY_ID,FULL_NAME,FACTORY_NAME,CONTACTS,PHONE,MOBILE,FAX,CNOTE,INSPECTOR,ORDER_NO,CREATE_BY,CREATE_DEPT,CREATE_TIME) values( #{id,jdbcType=VARCHAR}, #{fullName,jdbcType=VARCHAR}, #{factoryName,jdbcType=VARCHAR}, #{contacts,jdbcType=VARCHAR}, #{phone,jdbcType=VARCHAR}, #{mobile,jdbcType=VARCHAR}, #{fax,jdbcType=VARCHAR}, #{cnote,jdbcType=VARCHAR}, #{inspector,jdbcType=VARCHAR}, #{orderNo,jdbcType=INTEGER}, #{createBy,jdbcType=VARCHAR}, #{createDept,jdbcType=VARCHAR}, #{createTime,jdbcType=TIMESTAMP} ) </insert> <!-- 修改 动态的sql语句--> <update id="update" parameterType="cn.itcast.jk.domain.Factory"> update factory_c <set> <!-- 如果 fullName不为空,就修改。--> <if test="fullName!=null">FULL_NAME=#{fullName,jdbcType=VARCHAR},</if> <if test="factoryName!=null">FACTORY_NAME=#{factoryName,jdbcType=VARCHAR},</if> <if test="contacts!=null">CONTACTS=#{contacts,jdbcType=VARCHAR},</if> <if test="phone!=null">PHONE=#{phone,jdbcType=VARCHAR},</if> <if test="mobile!=null">MOBILE=#{mobile,jdbcType=VARCHAR},</if> <if test="fax!=null">FAX=#{fax,jdbcType=VARCHAR},</if> <if test="cnote!=null">CNOTE=#{cnote,jdbcType=VARCHAR},</if> <if test="inspector!=null">INSPECTOR=#{inspector,jdbcType=VARCHAR},</if> <if test="orderNo!=null">ORDER_NO=#{orderNo,jdbcType=INTEGER},</if> <if test="createBy!=null">CREATE_BY=#{createBy,jdbcType=VARCHAR},</if> <if test="createDept!=null">CREATE_DEPT=#{createDept,jdbcType=VARCHAR},</if> <if test="createTime!=null">CREATE_TIME=#{createTime,jdbcType=TIMESTAMP},</if> </set> where FACTORY_ID=#{id} </update> <!-- 查询一个数据 --> <select id="get" parameterType="string" resultMap="factoryRM"> <!-- 注意我这里写了一个factory_id=#{pid},我这么写主要是为了说明这里要传入的值并不是 factory这个类里面的属性,可以是随意的,只要是String就好。 --> select * from factory_c where factory_id=#{pid} </select> <!-- 删除一条的 --> <delete id="deleteById" parameterType="string"> delete from factory_c where FACTORY_ID=#{pid} </delete> <!-- 删除多条的记录 --> <delete id="delete" parameterType="string"> delete from factory_c where FACTORY_ID in <foreach collection="array" item="id" open="(" close=")" separator=","> #{id} </foreach> </delete> </mapper>
操作完成。
--------------------------------------------------------------------------------------------------------------------------------------------------------------
注意:
当jsp页面上有些字段内容为空,因为数据库那些字段允许为空,所以以为这样做不会有错,其实Mysql开发时是可以的,但是用oracle时不行。
在用Mybatis时,在写Mybatis的配置文件时要这么写:
<insert id="insert" parameterType="cn.itcast.jk.domain.Factory"> <!-- 当数据库是Oracle时,如果插入的数据是空时,必须是要指定默认的参数。所以这里的设置要这么写:jdbcType=VARCHAR。
Mysql数据库开发就不用指定jdbcType=VARCHAR这么写。 --> insert into factory_c(FACTORY_ID,FULL_NAME,FACTORY_NAME,CONTACTS,PHONE,MOBILE,FAX,CNOTE,INSPECTOR,ORDER_NO,CREATE_BY,CREATE_DEPT,CREATE_TIME) values( #{id,jdbcType=VARCHAR}, #{fullName,jdbcType=VARCHAR}, #{factoryName,jdbcType=VARCHAR}, #{contacts,jdbcType=VARCHAR}, #{phone,jdbcType=VARCHAR}, #{mobile,jdbcType=VARCHAR}, #{fax,jdbcType=VARCHAR}, #{cnote,jdbcType=VARCHAR}, #{inspector,jdbcType=VARCHAR}, #{orderNo,jdbcType=INTEGER}, #{createBy,jdbcType=VARCHAR}, #{createDept,jdbcType=VARCHAR}, #{createTime,jdbcType=TIMESTAMP} ) </insert>
怕以后用oracle开发时,碰到这个问题,所以写这篇博客。