在springmvc+spring+mybatis里整合ztree实现增删改查,上一篇已经写了demo,以下就仅仅贴出各层实现功能的代码:

Jsp页面实现功能的js代码例如以下:

<script>
//用于捕获分类编辑button的 click 事件,而且依据返回值确定是否同意进入名称编辑状态
function beforeEditName(treeId, treeNode) {
var zTree = $.fn.zTree.getZTreeObj("treeDemo");
zTree.selectNode(treeNode);
return true;
}
//移除分类前运行
function beforeRemove(treeId, treeNode) {
var zTree = $.fn.zTree.getZTreeObj("treeDemo");
zTree.selectNode(treeNode);
var confirmFlag = confirm("确认删除分类[ " + treeNode.name + " ]吗?" )
var confirmVal = false;
if(confirmFlag){
var data = {id:treeNode.id};
$.ajax({
async: false,
type: "post",
data:data,
url: "<%=request.getContextPath() %>/library/deleteLibrary/ ",
success: function(json){
if(json == "success" ){
confirmVal = true;
} else{
alert('亲,删除失败!');
}
},
error: function(){
alert('亲,删除失败!');
}
});
}
return confirmVal;
}
//运行删除操作后提示
function onRemove(e, treeId, treeNode) {
alert('亲,删除成功!');
}
//用于捕获分类编辑名称结束(Input 失去焦点 或 按下 Enter 键)之后,更新分类名称数据之前的事件回调函数
function beforeRename(treeId, treeNode, newName) {
if (newName.length == 0 || newName.indexOf("请输入名称")>=0) {
alert('亲,请输入分类名称!');
var zTree = $.fn.zTree.getZTreeObj("treeDemo");
setTimeout( function(){zTree.editName(treeNode)}, 10);
return false;
}
if(newName.length > 15){
alert('亲,分类名称过长!');
var zTree = $.fn.zTree.getZTreeObj("treeDemo");
setTimeout( function(){zTree.editName(treeNode)}, 10);
return false;
}
native_name = treeNode.name;
return true;
}
//运行编辑操作
function onRename(e, treeId, treeNode) {
if(native_name == treeNode.name){
return;
}
var data = {id:treeNode.id,level_id:treeNode.level,pid:treeNode.pId,name:treeNode.name};
$.ajax({
async: false,
type: "post",
data:data,
url: "<%=request.getContextPath() %>/library/updateLibraryName/ ",
success : function(json){
if(json == "success" ){
alert('操作成功!');
} else{
alert('亲,操作失败,请稍后再试!');
}
},
error : function() {
alert('亲,网络有点不给力呀!');
}
});
} //加入子分类
function addHoverDom(treeId, treeNode) {
var sObj = $("#" + treeNode.tId + "_span");
if (treeNode.editNameFlag || $("#addBtn_" +treeNode.tId).length>0 || treeNode.level == 3) return;
var addStr = "<span class='button add' id='addBtn_" + treeNode.tId + "' title='加入分类' onfocus='this.blur();'></span>";
sObj.after(addStr);
var btn = $("#addBtn_" +treeNode.tId);
if (btn) btn.bind("click" , function(){
var zTree = $.fn.zTree.getZTreeObj("treeDemo");
var treeNodes;
$.ajax({
async: false,
type: "post",
url: "<%=request.getContextPath() %>/library/saveLibrary/ ",
success : function(libraryId){
if(libraryId != "" ){
treeNodes = zTree.addNodes(treeNode, {id:(libraryId), pId:treeNode.id, name:"请输入名称" });
}
if (treeNodes) {
zTree.editName(treeNodes[0]);
}
},
error : function(){
alert('亲,网络有点不给力呀!');
}
});
return false;
});
}
//父级分类去除删除功能
function setRemoveBtn(treeId, treeNode) {
return !treeNode.isParent;
} //鼠标移开button消失
function removeHoverDom(treeId, treeNode) {
$( "#addBtn_"+treeNode.tId).unbind().remove();
}; //加入button点击事件
function addClick(){
$( "#addParent").bind("click" , {isParent:true}, add);
} //移除分类
function remove(e) {
var zTree = $.fn.zTree.getZTreeObj("treeDemo"),
nodes = zTree.getSelectedNodes(),
treeNode = nodes[0];
if (nodes.length == 0) {
alert( "亲,请先选择一个分类!" );
return;
}
var callbackFlag = $("#callbackTrigger" ).attr("checked");
zTree.removeNode(treeNode, callbackFlag);
}; //展开所有分类
function expandAllFlag(){
zTree_Menu.expandAll( true);
}
//合并所有分类
function combineAllFlag(){
zTree_Menu.expandAll( false);
} //载入ztree
function onloadZTree(){
var ztreeNodes;
$.ajax( {
async : true, //是否异步
cache : false, //是否使用缓存
type : 'post', //请求方式,post
dataType : "json", //传输数据格式
url : "<%=request.getContextPath() %>/library/findAllLibrary/ ", //请求链接
error : function() {
alert('亲,网络有点不给力呀!');
},
success : function(data) {
ztreeNodes = eval( "["+data+"]" ); //将string类型转换成json对象
$.fn.zTree.init($( "#treeDemo"), setting, ztreeNodes);
zTree_Menu = $.fn.zTree.getZTreeObj("treeDemo" );
$( "#selectAll").bind("click" , selectAll);
expandAllFlag();
addClick();
}
});
} //初始化操作
$(document).ready( function(){
onloadZTree();
});
</script>

备注:后台传过来的json数据一定运行这个操作:eval( "["+data+"]" ) 将string转换为对象

Controller层代码例如以下:

import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody; @Controller
@RequestMapping(value="library/")
public class LibraryController { @Autowired
public LibraryService libraryService; /**
* 跳转到分类页面
* @return
*/
@RequestMapping(value="toListLibrary/")
public String toListLibrary(){
return "library/listLibrary";
} /**
* 查询全部分类信息
* @return
*/
@RequestMapping(value="findAllLibrary/")
@ResponseBody
public List<Object> findAllLibrary(HttpServletRequest request, HttpServletResponse response){
return libraryService.findAllLibrary();
} /**
* 保存分类
* @return
*/
@RequestMapping(value="saveLibrary/")
@ResponseBody
public String saveLibrary(HttpServletRequest request, HttpServletResponse response){
String libraryId = UUIDUtil.randomUUID();
return libraryId;
} /**
* 更新分类名称
* @return
*/
@RequestMapping(value="updateLibraryName/")
@ResponseBody
public String updateLibraryName(HttpServletRequest request, HttpServletResponse response, Library library) {
String createname=(String) request.getSession().getAttribute(Constants.CURRENT_USER_NAME);
library.setCreate_user(createname);
library.setUpdate_user(createname);
return libraryService.addOrUpdateLibrary(library);
} /**
* 删除分类
* @return
*/
@RequestMapping(value="deleteLibrary/")
@ResponseBody
public String deleteLibrary(HttpServletRequest request, HttpServletResponse response,@RequestParam(value = "id") String id) {
return libraryService.deleteLibrary(id);
}
}

service层代码例如以下:

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; @Service
public class LibraryService {
protected final static Log log = LogFactory.getLog(LibraryService.class); @Autowired
private LibraryMapper libraryMapper; /**
* 查询全部分类信息
* @return
*/
public List<Object> findAllLibrary(){
List<Object> listZTree = new ArrayList<Object>();
List<Library> listLibrary = libraryMapper.findAllLibrary();
String str = "";
for (int i = 0; i < listLibrary.size(); i++) {
Library library = listLibrary.get(i);//分类信息
str = "{id:'" +library.getId() + "', pId:'"+library.getPid()+"', name:\""+library.getName()+"\" }";//封装ztree须要格式的字符串
log.info(str);
listZTree.add(str);
}
return listZTree;
} /**
* 保存或更新分类信息
* @param library
* @return
*/
public String addOrUpdateLibrary(Library library){
int numFlag = 0;
//依据id查询分类信息
if (StringUtils.isBlank(library.getId())) {
return "error";
}
int num = libraryMapper.findLibraryById(library.getId());
if (num >0) {//更新信息
library.setUpdate_time(new Date());
library.setCreate_user(null);
library.setPid(null);
numFlag = libraryMapper.updateByPrimaryKeySelective(library);
}else{//插入信息
if(library.getPid().equals("null")){
library.setPid("0");
}
int orderId = libraryMapper.findLastLibrary(library);
orderId++;
library.setCreate_time(new Date());
library.setUpdate_time(new Date());
library.setOrder_id(orderId);
numFlag = libraryMapper.insert(library);
}
return "success";
} /**
* 删除分类
* @param id
* @return
*/
public String deleteLibrary(String id){
int num = libraryMapper.deleteByPrimaryKey(id);
return "success";
} }

备注:运行完数据操作须要推断返回值,这里我直接返回success活error了。

Mapper层代码例如以下

import java.util.List;
import java.util.Map; public interface LibraryMapper extends BaseMapper<Library,String>{ /**
* 查询全部分类信息
* @return
*/
public List<Library> findAllLibrary(); /**
* 依据id查询条数
* @param id
* @return
*/
public int findLibraryById(String id); /**
* 查询最大排序号
* @return
*/
public int findLastLibrary(Library library); }

备注:BaseMapper里有几个公用的增删改查的方法,Library是数据库表相应的实体,都非常easy,避免代码过多这里就省略了

<?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= "LibraryMapper" >
< resultMap id= "BaseResultMap" type= "Library" >
<id column ="id" property="id" jdbcType= "VARCHAR" />
<result column ="pid" property="pid" jdbcType= "VARCHAR" />
<result column ="name" property="name" jdbcType= "VARCHAR" />
<result column ="create_time" property="create_time" jdbcType= "TIMESTAMP" />
<result column ="update_time" property="update_time" jdbcType= "TIMESTAMP" />
<result column ="is_delete" property="is_delete" jdbcType= "INTEGER" />
<result column ="update_user" property="update_user" jdbcType= "VARCHAR" />
<result column ="create_user" property="create_user" jdbcType= "VARCHAR" />
<result column ="level_id" property="level_id" jdbcType= "INTEGER" />
<result column ="order_id" property="order_id" jdbcType= "INTEGER" />
</ resultMap>
< sql id= "Base_Column_List" >
id, pid , name, create_time, update_time, is_delete, update_user, create_user, level_id,
order_id
</ sql> <!-- 依据id查询分类信息是否存在 -->
< select id= "findLibraryById" parameterType ="java.lang.String" resultType= "java.lang.Integer" >
select count(*) from onair_vms_library
where is_delete=1 and id = #{id,jdbcType=VARCHAR}
</ select>
<!-- 依据 pid查询最大排序号 -->
< select id= "findLastLibrary" resultType ="java.lang.Integer" parameterType="Library" >
SELECT MAX(order_id) as order_id FROM onair_vms_library
where pid = #{pid,jdbcType=VARCHAR}
</ select>
<!-- 查询全部分类信息 -->
< select id= "findAllLibrary" resultMap ="BaseResultMap">
select
<include refid ="Base_Column_List"/>
from onair_vms_library
where is_delete = 1 order by order_id
</ select> < select id= "selectByPrimaryKey" resultMap ="BaseResultMap" parameterType="java.lang.String" >
select
<include refid ="Base_Column_List" />
from onair_vms_library
where id = #{id,jdbcType=VARCHAR}
</ select>
< delete id= "deleteByPrimaryKey" parameterType="java.lang.String" >
update onair_vms_library set is_delete = 0
where id = #{id,jdbcType=VARCHAR}
</ delete>
< insert id= "insert" parameterType="Library" >
insert into onair_vms_library (id, pid, name,
create_time, update_time, is_delete,
update_user, create_user, level_id,
order_id)
values (#{id,jdbcType=VARCHAR}, #{pid,jdbcType=VARCHAR}, #{name,jdbcType=VARCHAR},
#{create_time,jdbcType=TIMESTAMP}, #{update_time,jdbcType=TIMESTAMP}, #{is_delete,jdbcType=INTEGER},
#{update_user,jdbcType=VARCHAR}, #{create_user,jdbcType=VARCHAR}, #{level_id,jdbcType=INTEGER},
#{order_id,jdbcType=INTEGER})
</ insert>
< update id= "updateByPrimaryKey" parameterType="Library" >
update onair_vms_library
set pid = #{pid,jdbcType=VARCHAR},
name = #{name,jdbcType=VARCHAR},
create_time = #{create_time,jdbcType=TIMESTAMP},
update_time = #{update_time,jdbcType=TIMESTAMP},
is_delete = #{is_delete,jdbcType=INTEGER},
update_user = #{update_user,jdbcType=VARCHAR},
create_user = #{create_user,jdbcType=VARCHAR},
level_id = #{level_id,jdbcType=INTEGER},
order_id = #{order_id,jdbcType=INTEGER}
where id = #{id,jdbcType=VARCHAR}
</ update>
</mapper>

备注:mapper相应的xml

与jsp相应的VO层代码例如以下:

public class LibraryVo {

     /*  id      */
private String id;
/* 目标id */
private String targetId;
/* pid */
private String pId;
/* 目标pid */
private String targetPId;
/* "inner":成为子节点,"prev":成为同级前一个节点,"next":成为同级后一个节点 */
private String moveType; public String getId() {
return id;
} public void setId(String id) {
this. id = id;
} public String getTargetId() {
return targetId;
} public void setTargetId(String targetId) {
this. targetId = targetId;
} public String getpId() {
return pId;
} public void setpId(String pId) {
this. pId = pId;
} public String getTargetPId() {
return targetPId;
} public void setTargetPId(String targetPId) {
this. targetPId = targetPId;
} public String getMoveType() {
return moveType;
} public void setMoveType(String moveType) {
this. moveType = moveType;
} }

上面的代码实现了主要的增删改查,有哪些地方有问题欢迎指正,也欢迎交流,每一次的进步都离不开大家的帮助。

ztree使用系列三(ztree与springmvc+spring+mybatis整合实现增删改查)的更多相关文章

  1. 3.springMVC+spring+Mybatis整合Demo(单表的增删该查,这里主要是贴代码,不多解释了)

    前面给大家讲了整合的思路和整合的过程,在这里就不在提了,直接把springMVC+spring+Mybatis整合的实例代码(单表的增删改查)贴给大家: 首先是目录结构: 仔细看看这个目录结构:我不详 ...

  2. JS组件系列——BootstrapTable+KnockoutJS实现增删改查解决方案(三):两个Viewmodel搞定增删改查

    前言:之前博主分享过knockoutJS和BootstrapTable的一些基础用法,都是写基础应用,根本谈不上封装,仅仅是避免了html控件的取值和赋值,远远没有将MVVM的精妙展现出来.最近项目打 ...

  3. SpringMVC+Spring+Mybatis整合

    SpringMVC+Spring+Mybatis整合 导包 配置jdbc.properties.log4j.properties jdbc.driver=com.mysql.jdbc.Driver j ...

  4. Springmvc+Spring+Mybatis整合开发(架构搭建)

    Springmvc+Spring+Mybatis整合开发(架构搭建) 0.项目结构 Springmvc:web层 Spring:对象的容器 Mybatis:数据库持久化操作 1.导入所有需要的jar包 ...

  5. Spring Boot(十五):spring boot+jpa+thymeleaf增删改查示例

    Spring Boot(十五):spring boot+jpa+thymeleaf增删改查示例 一.快速上手 1,配置文件 (1)pom包配置 pom包里面添加jpa和thymeleaf的相关包引用 ...

  6. 2.springMVC+spring+Mybatis整合

    前面已经说了,springMVC+spring+Mybatis的整合思路了,现在就照着这个思路来做一下: 在开始之前先来看一下工程的目录结构: config这个目录底下放的都是配置文件: mybati ...

  7. mybatis学习(十一)——springmvc++spring+mybatis整合

    做任何一个项目都以一个需求,这里先定义一下需求:利用三大框架查询酒店列表. 一.搭建开发环境 1.创建一个web项目 我这里用的是 jdk1.8+tomact7.0 2.创建hotel表 CREATE ...

  8. JavaWeb_(SpringMVC框架)SpringMVC&Spring&MyBatis整合

    JavaWeb_(SpringMVC框架)测试SpringMVC&Spring&MyBatis三大整合 传送门 1.整合ssm 3大框架 过程 a)导包 -> spring_Ja ...

  9. SpringMVC Spring Mybatis整合篇

    1.创建WEB项目 创建项目:(ssmbuild)步骤略........ 给项目添加lib文件夹,用于存放jar包: 在WEB-INF目录下创建lib文件夹: 创建完成:运行项目时需要把jar导入到l ...

随机推荐

  1. bzoj 1232 [Usaco2008Nov]安慰奶牛cheer

    思路:看出跟dfs的顺序有关就很好写了, 对于一棵树来说确定了起点那么访问点的顺序就是dfs序,每个点经过 其度数遍,每条边经过2边, 那么我们将边的权值×2加上两端点的权值跑最小生成树,最后加上一个 ...

  2. vmstat详解

    一.前言 很显然从名字中我们就可以知道vmstat是一个查看虚拟内存(Virtual Memory)使用状况的工具,但是怎样通过vmstat来发现系统中的瓶颈呢?在回答这个问题前,还是让我们回顾一下L ...

  3. ECSHOP的JS文件代入问题

    参考一下默认的js写法就行了<script type='text/javascript' src='themes/ecmoban/js/jquery-1.7.2.min.js'></ ...

  4. My blog in AI -- 梯度下降算法

    人工神经网络是对生物神经网络的模仿,神经网络对一个问题的学习,需要经历数据输入.网络参数的训练.超参数的调节等部分. 这次我们来详细讨论一下神经网络的学习过程. 假设我们要训练一个神经网络去识别一张图 ...

  5. iOS Sprite Kit教程之滚动场景

    iOS Sprite Kit教程之滚动场景 滚动场景 在很多的游戏中,场景都不是静止的,而是滚动的,如在植物大战僵尸的游戏中,它的场景如图2.26所示. 图2.26  植物大战僵尸 在图2.26中,用 ...

  6. BZOJ 2726: [SDOI2012]任务安排 [斜率优化DP 二分 提前计算代价]

    2726: [SDOI2012]任务安排 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 868  Solved: 236[Submit][Status ...

  7. luoguP4783 [模板]矩阵求逆 线性代数

    求\(n^2\)的矩阵的逆 翻了翻题解,看到了初等矩阵这个东西,突然想起来在看线代的时候看到过.... 然后又温习了一遍线性代数的知识 不妨设\(PA = E\),其中\(P\)是一堆初等矩阵的积(必 ...

  8. 【BZOJ】4565: [Haoi2016]字符合并

    4565: [Haoi2016]字符合并 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 690  Solved: 316[Submit][Status ...

  9. CentOS7安装GNOME可视化界面和如何配置IP地址

    本人在虚拟机安装 CentOS7 1,检查一下我们已经安装的软件以及可以安装的软件,用命令 yum grouplist 2,然后安装我们需要的图形界面软件,GNOME(GNOME Desktop) 这 ...

  10. codevs 1063 合并果子 STL 优先队列

    1063 合并果子 Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://codevs.cn/problem/1063/ Description 在一 ...