1. 程式人生 > >008 使用MyBatis,easyUI實現CRUD操作樣例-CUD(CRUD完畢)

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

MyBatisMyBatis實現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 給實體類路