008 使用MyBatis,easyUI實現CRUD操作樣例-CUD(CRUD完畢)
008 使用MyBatis,easyUI實現CRUD操作樣例-CUD
接著007的專案操作。
資料庫的主鍵改為自增,主鍵的相關處理這裡不是重點。
新增資訊
HTTP POST 請求/users 帶著一個user物件JSON格式建立一個新的user
- 顯示新增頁面Get請求 Uri: user
- 提交新增資訊POST請求 Uri: user
body裡面新增addUser對話方塊
...
<!-- create user dialog -->
<div id="dlg" class="easyui-dialog"
data-options ="iconCls:'icon-save',resizable:true,modal:true"
style="width: 400px; height: 280px; padding: 10px 20px" closed="true"
buttons="#dlg-buttons">
<div class="ftitle">使用者資訊</div>
<form id="fm" method="post">
<div class="fitem">
<label for="name">使用者名稱:</label> <input name="name"
class="easyui-validatebox" type="text" data-options="required:true">
</div>
<div class="fitem">
<label for="age">年 齡:</label> <input name="age"
class ="easyui-numberbox" type="text"
data-options="required:true,validType:'number'">
</div>
<div class="fitem">
<label for="gender">性 別:</label> <input id="state1" name="gender"
value="男" type="radio" checked="true" />男 <input id="state2"
name="gender" value="女" type="radio" />女
</div>
<div class="fitem">
<label for="email">Email:</label> <input name="email"
class="easyui-validatebox" type="text"
data-options="required:true,validType:'email'">
</div>
<div class="fitem">
<label for="teacherId">教 師:</label> <input id="cc"
class="easyui-combobox" name="teacherId"
data-options="valueField:'id',textField:'name',panelHeight:80,editable:false,method:'get',url:'${pageContext.request.contextPath}/getTeacherComboData'">
</div>
</form>
</div>
<div id="dlg-buttons">
<a href="#" class="easyui-linkbutton" data-options="iconCls:'icon-ok'"
onclick="save()">Save</a> <a href="#" class="easyui-linkbutton"
data-options="iconCls:'icon-cancel'"
onclick="javascript:$('#dlg').dialog('close')">Cancel</a>
</div>
</body>
然後新增ITeacherService介面,給Controller使用。
public Teacher getTeacherById(long id);
public List<Teacher> getTeachers();
修改teacherMapper新增Dao操作
/**
* Select all teachers
* @return
*/
List<Teacher> selectTeachers();
修改TeacherMapper.xml增加getTeachers對映
<select id="selectTeachers" resultMap="BaseResultMap">
select * from teacher
</select>
新增實現類ITeacherServiceImpl
@Service("teacherService")
@Transactional
public class ITeacherServiceImpl implements ITeacherService
{
@Autowired
TeacherMapper teacherMapper;
@Override
public List<Teacher> getTeachers()
{
return teacherMapper.selectTeachers();
}
@Override
public Teacher getTeacherById(long id)
{
return teacherMapper.selectByPrimaryKey(id);
}
}
新增TeacherController實現easyUI需要的資料介面
@Controller
public class TeacherController
{
private static final Logger logger = LogManager.getLogger(TeacherController.class.getName());
@Autowired
ITeacherService teacherService;
@ResponseBody
@RequestMapping(value = "/getTeacherComboData", method = RequestMethod.GET)
public List<Teacher> teachers(HttpServletRequest request, HttpServletResponse response)
{
List<Teacher> teachers = teacherService.getTeachers();
logger.info("getUsers api jsonObj:" + JSON.toJSONString(teachers));
return teachers;
}
}
/src/main/webapp/commons/js目錄下新建commons.js獲取專案路徑,網上找的程式碼,註釋資訊保留了。
/*!
* [email protected] - v0.1 (2015-08-29 18:00:00 +0800)
* Copyright 2015
*/
var ctx=getBasePath();
function getBasePath(){
var obj=window.location;
var contextPath=obj.pathname.split("/")[1];
var basePath=obj.protocol+"//"+obj.host+"/"+contextPath;
return basePath;
}
// 格式化日期
Date.prototype.Format = function (fmt) {
var o = {
"y+": this.getFullYear(),
"M+": this.getMonth() + 1, // 月份
"d+": this.getDate(), // 日
"h+": this.getHours(), // 小時
"m+": this.getMinutes(), // 分
"s+": this.getSeconds(), // 秒
"q+": Math.floor((this.getMonth() + 3) / 3), // 季度
"S+": this.getMilliseconds() // 毫秒
};
for (var k in o) {
if (new RegExp("(" + k + ")").test(fmt)){
if(k == "y+"){
fmt = fmt.replace(RegExp.$1, ("" + o[k]).substr(4 - RegExp.$1.length));
}
else if(k=="S+"){
var lens = RegExp.$1.length;
lens = lens==1?3:lens;
fmt = fmt.replace(RegExp.$1, ("00" + o[k]).substr(("" + o[k]).length - 1,lens));
}
else{
fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
}
}
}
return fmt;
}
新建目錄/src/main/webapp/commons/js/user
在user目錄下新建userOper.js指令碼處理增加,刪除,修改操作
/*!
* [email protected] - v0.1 (2015-08-29 18:00:00 +0800)
* Copyright 2015
*/
$(function() {
});
function insert() {
$('#dlg').dialog('open').dialog('setTitle', '新建使用者');
$('#fm').form('clear');
url = ctx + '/users';
type = insert;
}
function edit() {
var row = $('#dg').datagrid('getSelected');
if (row) {
$('#dlg').dialog('open').dialog('setTitle', '編輯使用者資訊');
$('#fm').form('load', row);
//setCheckedValue(document.forms['fm'].elements['gender'], row['gender']);
url = 'users/' + row.id;
type = edit;
}
}
function save() {
$('#fm').form('submit', {
url : url,
type:type,
onSubmit : function(param) {
if (type == edit) {
//use put
param._method ='PUT';
}
param.createTime = new Date().Format("yyyy-MM-dd hh:mm:ss");
param.loginTime = param.createTime;
var ret = $(this).form('validate');
return ret;
},
success : function(result) {
var result = eval('(' + result + ')');
if (result.errorMsg) {
$.messager.show({
title : 'Error',
msg : result.errorMsg
});
} else {
$('#dlg').dialog('close'); // close the dialog
$('#dg').datagrid('reload'); // reload the user data
}
}
});
}
function del() {
var row = $('#dg').datagrid('getSelected');
if (row) {
$.messager.confirm('確認', '請確認刪除已選擇使用者?', function(r) {
if (r) {
$.post('users/' + row.id, {
_method : 'DELETE'
}, function(result) {
if (result.status != null) {
$('#dg').datagrid('reload'); // reload the user data
} else {
$.messager.show({ // show error message
title : 'Error',
msg : result.errorMsg
});
}
}, 'json');
}
});
}
}
新建目錄/src/main/webapp/commons/css,下面新建user.css用於格式化新建使用者對話方塊的各個元素
<style type="text/css">
#fm {
margin: 0;
padding: 10px 30px;
}
.ftitle {
font-size: 14px;
font-weight: bold;
color: #666;
padding: 5px 0;
margin-bottom: 10px;
border-bottom: 1px solid #ccc;
}
.fitem {
margin-bottom: 5px;
}
.fitem label {
display: inline-block;
width: 80px;
}
</style>
引入自定義的指令碼和css樣式
...
<!-- 自定義的js指令碼 -->
<script type="text/javascript" src="commons/js/commons.js"></script>
<script type="text/javascript" src="commons/js/user/userOper.js"></script>
<link rel="stylesheet" href="commons/css/user.css">
</head>
IUserService和實現類增加插入使用者的介面和實現程式碼
public int insertUser(User usr);
@Override
public int insertUser(User usr)
{
return userMapper.insert(usr);
}
UserController增加POST響應程式碼處理增加使用者操作,這裡使用POJO物件繫結請求引數值,spring會按照引數名和屬性名自動匹配填充。
@Autowired
ITeacherService teacherService;
@RequestMapping(value = "/users", method = RequestMethod.POST)
@ResponseBody
public Object addUsersProc(User user)
{
// 處理新id生成
// 處理teacher類物件
user.setTeacher(teacherService.getTeacherById(user.getTeacherId()));
int iRet = userService.insertUser(user);
long newId = user.getId();
Map<String, Object> map = new HashMap<String, Object>();
if (iRet == 0)
{
logger.info("addUsersProc: " + JSON.toJSON("新建失敗:" + JSON.toJSONStringWithDateFormat(user, "yyyy-MM-dd HH:mm:ss")));
map.put("status", "新建失敗");
map.put("retCode", -1);
} else
{
logger.info("addUsersProc: " + JSON.toJSON("新建使用者:" + JSON.toJSONStringWithDateFormat(user, "yyyy-MM-dd HH:mm:ss")));
map.put("status", "新建成功");
map.put("retCode", 0);
}
return map;
}
UserMapper.xml裡面insert要新增一些配置,才會返回自增的ID,使用實體類的xx.GetId()來獲取。
<insert id="insert" parameterType="com.study.model.User" useGeneratedKeys="true" keyProperty="id">
...
條件表單是字串型別,實體類裡面的日期是Date型別,涉及到了型別轉換的處理。否則會遇到spring mvc form提交資料報400錯誤。
提交form表單報這個錯誤,有可能是你的controller接收資料型別與前臺傳遞型別不符。例如前臺傳遞String 後臺用Date接受,就會報這個錯誤。
新建一個包com.study.converters
新建一個類DateTimeConverter實現spring的springframework.core.convert介面
@Component
public class DateTimeConverter implements Converter<String, Date>
{
@Override
public Date convert(String source)
{
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = null;
try
{
date = df.parse(source);
} catch (ParseException e)
{
e.printStackTrace();
}
return date;
}
}
配置springmvc.xml使converter生效
<!-- 配置自動掃描的包 -->
<context:component-scan
base-package="com.study.controller,com.study.service,com.study.converters"></context:component-scan>
...
<!-- 對於mvc沒有對映過的請求,交給容器預設handler來處理,例如:js,css等靜態資源 -->
<mvc:default-servlet-handler />
<mvc:annotation-driven conversion-service="conversionService">
...
</mvc:annotation-driven>
<!-- 配置轉換服務 <mvc:annotation-driven conversion-service="conversionService"> -->
<bean id="conversionService"
class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<!-- 自定義的轉換類,首字母小寫 -->
<ref bean="dateTimeConverter" />
</set>
</property>
</bean>
還有關於前臺傳資料到後臺中文的亂碼問題需要處理一下,在web.xml檔案中新增配置,filter是有順序的,這個最好放在最前面
<!-- 解決中文亂碼問題,將引數編碼為utf-8 -->
<filter>
<filter-name>encodingFilter</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>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
現在執行新增使用者,應該能看到記錄數有所增加。
刪除資訊
HTTP DELETE 請求/users/1 刪除id=1的user
新增UserService介面和實現
public int deleteById(String id);
@Override
public int deleteById(String id)
{
return userMapper.deleteByPrimaryKey(Long.parseLong(id));
}
UserController裡面新增響應程式碼
@RequestMapping(value = "/users/{id}", method = RequestMethod.DELETE)
@ResponseBody
public Object deleteUserProc(@PathVariable("id") String id)
{
int iRet = userService.deleteById(id);
Map<String, Object> map = new HashMap<String, Object>();
if (iRet == 0)
{
logger.error("deleteUserProc: 刪除失敗");
map.put("status", "刪除失敗");
map.put("retCode", -1);
} else
{
logger.info("deleteUserProc: 刪除成功");
map.put("status", "刪除成功");
map.put("retCode", 0);
}
return map;
}
因為HiddenHttpMethodFilter的引數是
public static final String DEFAULT_METHOD_PARAM = “_method”;
所以說要把post請求轉換成其他請求,提交的引數名就必須指定_method
而引數值必須是要轉換的請求形式,這裡是DELETE
修改資訊
/users/1 PUT 更新資源 id=1
修改service增加更新介面
public int updateById(User user);
@Override
public int updateById(User user)
{
return userMapper.updateByPrimaryKey(user);
}
UserController裡面增加響應處理
@RequestMapping(value = "/users/{id}", method = RequestMethod.PUT)
@ResponseBody
public Object updateUserProc(@PathVariable("id") long id,
User user)
{
int iRet = userService.updateById(user);
Map<String, Object> map = new HashMap<String, Object>();
if (iRet == 0)
{
logger.error("updateUserProc: 更新失敗");
map.put("status", "更新失敗");
map.put("retCode", -1);
} else
{
logger.info("updateUserProc: 更新成功");
map.put("status", "更新成功");
map.put("retCode", 0);
}
return map;
}
現在可以操作了。RESTFul風格的CRUD功能基本上就實現完畢了。
相關推薦
008 使用MyBatis,easyUI實現CRUD操作樣例-CUD(CRUD完畢)
008 使用MyBatis,easyUI實現CRUD操作樣例-CUD 接著007的專案操作。 資料庫的主鍵改為自增,主鍵的相關處理這裡不是重點。 新增資訊 HTTP POST 請求/users 帶著一個user物件JSON格式建立一個新的user
JavaWeb從新手到入門(五)Spring Mybatis EasyUI實現商品列表
參考:《傳智播客-淘淘商城》 一、商品列表功能 商品列表功能是後端維護購物網站的商品的功能,提供了顯示、新增、編輯、刪除、下架和上架功能,顯示如下: 二、顯示功能的實現 開啟查詢商品後,後端首先按照分頁刷新出商品的資訊,因此顯示功能是第一步。 2.1 前端程式碼實現 前端
二值影象腐蝕與膨脹操作樣例
申明: 僅個人小記 前言: 我之前對腐蝕與膨脹的概念理解存在錯誤。我原來的概念解決不了結構的原點設定在結構外部的情況。故在這裡記一下。 小注: 剛開始操作的時候是同時有三張圖,分別為原影象,結構元素影象,輸出結果空白影象 注意: 原影象只是提供位置資訊,不
[純乾貨]Python3 MySQL 資料庫搭建和操作樣例程式碼
什麼是 PyMySQL? PyMySQL 是在 Python3.x 版本中用於連線 MySQL 伺服器的一個庫,Python2中則使用mysqldb。 PyMySQL 遵循 Python 資料庫 API v2.0 規範,幷包含了 pure-Python MySQL 客戶端庫。 PyMyS
Oracle正則表示式操作樣例
資料處理過程中,對於質量不高的輸入資料,經常要做一些清洗操作。如果不懂正則表示式,那是非常痛苦的事情。 正則表示式還是比較繁雜的,很容易被它的語法繞暈,想要精通更不容易,一般都是用到了去查,去試。 這裡有一篇開發人員整理的常用清單,可以參考一下: 最全的
SpringCloud或SpringBoot+Mybatis-Plus利用AOP+mybatis外掛實現資料操作記錄及更新對比
引文 本文主要介紹如何使用Spring AOP + mybatis外掛實現攔截資料庫操作並根據不同需求進行資料對比分析,主要適用於系統中需要對資料操作進行記錄、在更新資料時準確記錄更新欄位 核心:AOP、mybatis外掛(攔截器)、mybatis-Plus實體規範、資料對比 1、相關技術簡介 mybat
【Mybatis】(三)執行CRUD操作——基於XML實現
在【Mybatis】(一)第一個mybatis例項中,已經初步搭建了 MyBatis 框架,實現了查詢所有記錄的功能,並用 JUnit 進行了單元測試 接下來我們將在此基礎上使用基於XML的方式對錶進行CRUD操作 1、定義EmployeeMapper.xm
MyBatis的學習(一)——MyBatis介紹及實現CRUD操作
一、MyBatis介紹 MyBatis 本是apache的一個開源專案iBatis, 2010年這個專案由apache software foundation 遷移到了google code,並且改名為MyBatis 。2013年11月遷移到Github。 IBATIS一詞來源於“inter
【原】無腦操作:IDEA + maven + SpringBoot + JPA + EasyUI實現CRUD及分頁
1 package cn.temptation.web; 2 3 import cn.temptation.dao.PersonDao; 4 import cn.temptation.model.Person; 5 import cn.temptation.util.Type
【MyBatis】MyBatis實現CRUD操作
\n \t 事務 time nihao name conf bye class ora 1、實現基本CRUD功能 使用MyBatis對數據完整的操作,也就是CRUD功能的實現。根據之前的內容,要想實現CRUD,只需要進行映射文件的配置。 範例:修改EmpMapper.xml
Mybatis基於代理Dao實現CRUD操作 及 Mybatis的參數深入
utf XML 方法 creat 它的 執行方法 字符串 pro ssi Mybatis基於代理Dao實現CRUD操作 使用要求: 1、持久層接口和持久層接口的映射配置必須在相同的包下 2、持久層映射配置中mapper標簽的namespace屬性取值必須是持久層接口的
使用Struts2和jQuery EasyUI實現簡單CRUD系統(五)——jsp,json,EasyUI的結合
元素 word cli resultset sheet 傳輸 charset {} tco 這部分比較復雜,之前看過自己的同學開發一個選課系統的時候用到了JSON,可是一直不知道有什麽用。寫東西也沒用到。所以沒去學他。然後如今以這樣的懷著好奇心,這是做什麽用的,這是怎麽用
Java線程演示樣例 - 繼承Thread類和實現Runnable接口
無法 ads rup args dex rom 一個 nts future 進程(Process)和線程(Thread)是程序執行的兩個基本單元。Java並發編程很多其它的是和線程相關。 進程 進程是一個獨立的執行單元,可將其視為一個程序或應用。然而,一
報表樣例——用BIRT實現不規則月份統計
取出 evel 接口 php 簡單 term 當前 post http 來源: http://developer.actuate.com/community/forum/index.php?/topic/36323-months-and-quar
圖標插件--jqplot實現柱狀圖及餅圖,表盤圖演示樣例
itl nbsp left 柱狀圖 draw ted ner ann name 柱狀圖 在jqPlot圖表插件使用說明(一)中,我們已經能夠通過jqPlot繪制出比較簡單的線形圖。通過查看源碼。我們也能夠看出,線形圖是jqPlot默認的圖表類型:
實現連接池技術的樣例
啟動 vax oca 找到 max 安裝文件 通過 pass contex 1. 在tomcat的安裝文件夾下conf文件夾下的context.xml文件加入例如以下代碼: <Resource name="jdbc/course" aut
1個TensorFlow樣例,終於明白如何實現前向傳播過程?
tensorflow神經網絡的結構,就是不同神經元間的連接結構–圖示了一個三層全連接神經網絡。神經元結構的輸出,是所有輸入的加權、加上偏置項,再經過一個激活(傳遞)函數得到。全連接神經網絡全連接神經網絡,就是相鄰兩層之間,任意兩個節點之間都有連接。–這也是其與後面介紹的卷積層、LSTM結構的區分。–除了輸入層
Cmake實現樣例
library process 添加 nts 文件 工程目錄 void name net 多目錄工程的CmakeLists.txt編寫(自動添加多目錄下的文件) http://www.cnblogs.com/chengxuyuancc/p/5347646.html 實
MyBatis 學習總結 02 對表執行增刪改查(CRUD)操作 OLD
去除 dev ins tlist 只需要 獲取 exception ref ssi 可以對上一節中使用mybatis打開一次session的業務邏輯進行封裝,封裝的成工具類命名為: MyBatisUtil package com.mybatis.util;
mybatis 兩種CRUD操作操作
upload alt 進階 字段名 str batis 簡單 mybatis myba 最簡單的查詢 進階1 封裝util的查詢 進階2 添加一個mapper接口(同時也要有util) 進階3 添加properties文件 進階4 給實體類路