SSM框架CRUD操作Demo
1、SSM开发环境搭建详见下一章微博
2、定义起始页,基本的超链接完成请求,详见如图

由于时间关系,本人将在本博客中陆续推出高级框架阶段的系列教程,现已经发布如下几篇,如果对大家有帮助也请各位给点鼓励吧 ,比如关注微博、顶一下或者给点评论,谢谢!

http://blog.csdn.net/dl0246/article/details/77996811 SSM框架CRUD操作&批量删除&批量追加数据(Oracle&MySQL数据库)
http://blog.csdn.net/dl0246/article/details/77966611 诸多设计模式中,最为常见的三种设计模式-单例模式,代理模式,工厂模式
http://blog.csdn.net/dl0246/article/details/78251319 SpringMVC入门及系列教程(一)-SpringMVC环境搭建及入门案例(详细)
http://blog.csdn.net/dl0246/article/details/78259612 SpringMVC入门及系列教程(二)-SpringMVC请求周期及响应处理(初级)(详细)
http://blog.csdn.net/dl0246/article/details/78274343 SpringMVC入门及系列教程(三)-请求的映射(详细)
http://blog.csdn.net/dl0246/article/details/78286685 SpringMVC入门及系列教程(四)-SpringMVC在控制器中获取请求中的参数值(详细)
http://blog.csdn.net/dl0246/article/details/78390587 SpringMVC入门及系列教程(五)-响应处理&响应参数处理&SpringMVC作用域对象&SpringMVC原生Servlet对象

1、SSM开发环境搭建详见下一章微博
2、定义起始页,基本的超链接完成请求,详见如图

    <fieldset><legend>SSM CRUD  数据库:MySQL,请切换连接MySQL参数</legend><a href="user/queryAllUser.do">查看所有员工信息</a></fieldset>

3、编写对对应控制器Handler

@Controller
@RequestMapping("/user")
public class UserAction {@Autowiredprivate IUserService userService;@RequestMapping("/queryAllUser")public String queryAllUser(Map<String,Object> requests){requests.put("users",userService.queryAllUser());return "/users";}
}   

4、创建service

@Service
@Transactional
public class IUserServiceImpl implements IUserService {@Resourceprivate IUserDao userDao;public List<User> queryAllUser(){return userDao.queryAllUser();}
}

5、创建对应的Dao

public interface IUserDao {public List<User> queryAllUser();
}

6、创建MyBaits对应的SQL文

<?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.rock.trainner.dao.IUserDao"><sql id="userLists">userid,username,phone,birthday,score,typename,password,question,answer</sql><select id="queryAllUser" resultType="User">select <include refid="userLists"/> from user</select>
</mapper>

响应的画面效果如图:

7、下面来看看页面效果的实现代码及前对对批量删除的前端代码,代码中有注释

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}/css/users.css">
<link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}/css/users_hover.css">
<script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery-2.1.1.js"></script>
<script type="text/javascript">$(document).ready(function(){//鼠标移动到行变色,单独建立css类hover//tr:gt(0):表示获取大于 tr index 为0 的所有tr,即不包括表头/*  $("#customers tbody tr:odd").addClass("odd");$("#customers tbody tr:even").addClass("even"); */var flag=false;$("#customers tr:gt(0)").hover(function () {if($(this).prop("class")=="alt"){flag=true;}$(this).removeClass("alt");$(this).addClass("hover");},function () {if(flag){$(this).addClass("alt");}$(this).removeClass("hover");flag=false;});$("#sal").click(function(){/* 返回了rquest域中users这个List集合的长度(User的个数) */var max="${fn:length(requestScope.users) }";for(var i=0;i<max;i++){if(this.checked){$("#selecters"+i).prop("checked",true);}else$("#selecters"+i).prop("`checked",false);}});$("#del").click(function(){var url="deleteBatchById.do?ids=";var max="${fn:length(requestScope.users) }";var ids="";/* 循环遍历所有的复选框 */for(var i=0;i<max;i++){if($("#selecters"+i).prop("checked")){//若这个复选框被选中状态,那么结果是true 否则是false、ids+=$("#selecters"+i).prop("value")+",";//若复选框被选中状态,那么将这个复选框中的value值获取后保存在ids变量zhong}}ids=ids.substr(0,ids.length-1);/* alert(ids); *//* 通过jQuery的get方法发起异步请求(ajax)请求,是以get方式发起的请求第一个参数:ajax请求的url是多少第二个参数是回调函数:回调函数中的第一个参数是服务器返回来的数据,第二个参数保存了ajaxget请求执行结果*/$.get(url+ids,function(data,status){   //url=deleteBatchById.do?ids=3,66,332,11/* 将id属性值是customers的table元素中的tr的行数大于0 就是除了表头之外的所有行 remove(); */$("#customers tr:gt(0)").remove();var newRow="";/* [{"userid":"aa","password":"aa","username":"aa","phone":"aa","birthday":"2010-09-09","score":200,"typename":"aaa","question":"aaa","answer":"aaa"},{"userid":"bb","password":"aa","username":"aa","phone":"aa","birthday":"2010-09-09","score":200,"typename":"aaa","question":"aaa","answer":"aaa"},{"userid":"cc","password":"aa","username":"aa","phone":"aa","birthday":"2010-09-09","score":200,"typename":"aaa","question":"aaa","answer":"aaa"},{"userid":"dd","password":"aa","username":"aa","phone":"aa","birthday":"2010-09-09","score":200,"typename":"aaa","question":"aaa","answer":"aaa"}] */for(var i=0;i<data.length;i++){   //data<---List<User>  [{},{},{}]     var id=data[i].userid;var username=data[i].username;var phone=data[i].phone;var birthday=data[i].birthday;var score=data[i].score;var typename=data[i].typename;var password=data[i].password;var question=data[i].question;var answer=data[i].answer;//alert(id+"&nbsp;"+username+"&nbsp;"+phone+"&nbsp;"+birthday);if(i%2==0){newRow="<tr><td>"+"<input type='checkbox' id='selecters"+i+"' name='selecters' value='"+id+"'>"+"</td><td>"+id+"</td><td>"+"<a href='abc'>"+username+"</a>"+"</td><td>"+phone+"</td><td>"+password+"</td><td>"+typename+"</td></tr>";}else{newRow="<tr class='alt'><td>"+"<input type='checkbox' id='selecters"+i+"' name='selecters' value='"+id+"'>"+"</td><td>"+id+"</td><td>"+username+"</td><td>"+phone+"</td><td>"+password+"</td><td>"+typename+"</td></tr>";}$("#customers tr:last").after(newRow);}  /* 将整个页面进行重新加载,说白了就是整个页面刷新一次 *///window.location.reload();//  reload body});});$("#delBody").click(function () {//删除指定行(第二行)// $("#table3 tr:gt(0):eq(1)").remove();/* 删除其它行,比如第二行之外的所有行: $("#table3 tr:gt(0):not(:eq(1))").remove(); */$("#customers tr:gt(0)").remove();});});
</script>
<title>Insert title here</title>
</head>
<body><fieldset><legend>jQuery操作table</legend><a href="#" id="delBody">删除其他行</a></fieldset><!-- 若用户单击了修改按钮 --><c:if test="${not empty requestScope.user }"><fieldset><legend>修改【${requestScope.user.username }】的数据</legend><form action="${pageContext.request.contextPath}/user/doUpdate.do"><div>Userid:<input type="text" name="userid" value="${requestScope.user.userid }"></div><div>username:<input type="text" name="username" value="${requestScope.user.username}"></div><div>password:<input type="text" name="password" value="${requestScope.user.password }"></div><div><input type="submit" value="修改密码"/></div></form></fieldset></c:if><c:if test="${empty requestScope.users }"><fieldset><legend>暂时没有数据</legend></fieldset></c:if><c:if test="${not empty requestScope.users }"><fieldset><legend>所有员工信息如下</legend><table id="customers"><tr><th><input type="checkbox" id="sal" > 全选<a href="#" id="del">删除</a></th><th>用户编号</th><th>用户姓名</th><th>用户电话</th><th>登录密码</th><th>会员类型</th><th>操作</th></tr><c:forEach items="${requestScope.users }" var="user" varStatus="stus"><c:if test="${stus.count%2 eq 0 }"><tr><td><input type="checkbox" id="selecters${stus.index}" name="selecters" value="${user.userid }"></td><td>${user.userid }</td><td><a href="${pageContext.request.contextPath }/user/update.do?userid=${user.userid }">${user.username }</a></td><td>${user.phone }</td><td>${user.password }</td><td>${user.typename }</td><td><a href="${pageContext.request.contextPath }/user/deleteUser.do?userid=${user.userid }">删除</a></td></tr></c:if><c:if test="${stus.count%2 eq 1 }"><tr class="alt"><td><input type="checkbox" id="selecters${stus.index}" name="selecters" value="${user.userid }"></td><td>${user.userid }</td><td><a href="${pageContext.request.contextPath }/user/update.do?userid=${user.userid }">${user.username }</a></td><td>${user.phone }</td><td>${user.password }</td><td>${user.typename }</td><td><a href="${pageContext.request.contextPath }/user/deleteUser.do?userid=${user.userid }">删除</a></td></tr></c:if></c:forEach></table></fieldset></c:if><fieldset><legend>添加数据</legend><div><form action="${pageContext.request.contextPath}/user/addUser.do"><div>Userid:<input type="text" name="userid" ></div><div>username:<input type="text" name="username" ></div><div>password:<input type="text" name="password" ></div><div><input type="submit" value="添加"/></div></form></div></fieldset></body>
</html>

8、下面来看看批量删除对应的控制器代码,因为整个CRUD操作后端代码中最主要的就是控制器Handler及MyBatis的映射文件了,所以这里把对应的代码全部贴出,以供参考

package com.rock.trainner.action;import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;import javax.servlet.http.HttpServletResponse;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;import com.rock.trainner.entities.User;
import com.rock.trainner.services.IUserService;@Controller
@RequestMapping("/user")
public class UserAction {@Autowiredprivate IUserService userService;@RequestMapping("/queryAllUser")public String queryAllUser(Map<String,Object> requests){requests.put("users",userService.queryAllUser());return "/users";}@RequestMapping("/addUser")public ModelAndView addUser(User user){System.out.println("UserAction.addUser() is running.........");userService.addUser(user);/*** 注意:在SpringMVC中  由控制器产生响应的方式有如下三种:* 1、action返回一个String,   prefix+retrunValue+suffix   ----》转发* 2、action返回一个ModelAndView* 3、若action方法想直接转发或重定向当前请求的话,可以通过在返回的字符串前加上forword: |  redirect:* return "forword:users.jsp"* ModelAndView  modelAndView=new ModelAndView("redirect:abc.jsp");*   * 若在一个action方法中将请求继续提交给另一个action方法,那么无需指定一级目录(Action类上的那个@RequestMapping)*/ModelAndView  modelAndView=new ModelAndView("redirect:queryAllUser.do");return modelAndView;}@RequestMapping("/deleteUser")public String deleteUser(@RequestParam("userid") String userid){System.out.println("UserAction.deleteUser() is running......"+userid );int a=userService.deleteUser(userid);return "redirect:queryAllUser.do";}/*@ModelAttributepublic void update_init(@RequestParam("userid") String userid,Map<String,Object> map){User user=userService.queryById(userid);map.put("user",user);}*/@RequestMapping("/update")public String update(User user,Map<String,Object> map){System.out.println("UserAction.update() is running......"+user );map.put("user",userService.queryById(user.getUserid()));return "users";}@RequestMapping("/doUpdate")public String doUpdate(@ModelAttribute("user") User user){System.out.println("UserAction.doUpdate() is running......"+user );int a=userService.updateUser(user);return "redirect:queryAllUser.do";}
//  若希望SpringMVC的Handler相应回来一个Json数据话,我们可以将这些数据存放在List集合中,
//  SpringMVC的jar包中提供了专门将List集合数据转化成json格式的对象@ResponseBody@RequestMapping("/deleteBatchById")public List<User> deleteBatchById(@RequestParam(value="ids") String ids,HttpServletResponse response){System.out.println("UserAction.deleteBatchById()............................."+ids);int a=userService.deleteBatchById(ids);return userService.queryAllUser();}@ResponseBody@RequestMapping("/jsonTest")public List<User> jsonTest(){List<User> all=new ArrayList<User>();Map<String,User> maps=new HashMap<String,User>();User user1=new User("aa","aa","aa","aa","2010-09-09",200,"aaa","aaa","aaa");User user2=new User("bb","aa","aa","aa","2010-09-09",200,"aaa","aaa","aaa");User user3=new User("cc","aa","aa","aa","2010-09-09",200,"aaa","aaa","aaa");User user4=new User("dd","aa","aa","aa","2010-09-09",200,"aaa","aaa","aaa");maps.put("aa",user1);maps.put("bb",user2);maps.put("cc",user3);maps.put("dd",user4);all.add(user1);all.add(user2);all.add(user3);all.add(user4);return all;}@ResponseBody@RequestMapping("/jsonTestMap")public Map<String,User> jsonTestMap(){List<User> all=new ArrayList<User>();Map<String,User> maps=new LinkedHashMap<String,User>();User user1=new User("aa","aa","aa","aa","2010-09-09",200,"aaa","aaa","aaa");User user2=new User("bb","aa","aa","aa","2010-09-09",200,"aaa","aaa","aaa");User user3=new User("cc","aa","aa","aa","2010-09-09",200,"aaa","aaa","aaa");User user4=new User("dd","aa","aa","aa","2010-09-09",200,"aaa","aaa","aaa");maps.put("aa",user1);maps.put("bb",user2);maps.put("cc",user3);maps.put("dd",user4);all.add(user1);all.add(user2);all.add(user3);all.add(user4);return maps;}}
<?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.rock.trainner.dao.IUserDao"><sql id="userLists">userid,username,phone,birthday,score,typename,password,question,answer</sql><select id="queryAllUser" resultType="User">select <include refid="userLists"/> from user</select><select id="queryById" parameterType="String" resultType="User">select <include refid="userLists"/> from user where userid=#{userid}</select><insert id="addUser" parameterType="User">insert into user(userid,password,username) values(#{userid},#{password},#{username})        </insert><delete id="deleteUser" parameterType="String">delete from user where userid=#{id}</delete><update id="updateUser" parameterType="User">update user set password=#{password} where userid=#{userid}</update><!-- MySQL中使用in完成批量删除操作,当然你也可以使用or多条件完成,这里为了简化代码使用in完成foreach是MyBatis中动态SQL中的标签,用于循环处理collection:指定被循环处理的集合类型    array|listitem:临时变量,如java中的foreach代码     foreach(String s:names)中的s变量的意义separator:分隔符open:开始字符close:结束字符--><delete id="deleteBatchById" parameterType="String">delete from user where userid in<foreach collection="array" item="ids" separator="," open="(" close=")">#{ids}</foreach></delete>
</mapper>

9、针对Oracle和MySQL数据库的批量追加功能稍后微博奉上,或者直接联系我。


10、关于SSM的批量插入数据的功能实现,今天有时间整理如下,首先我们预设实验场景,即在完成数据的批量删除的同时将被删除的数据存于备份表中,因为Oracle和MySQL的批量存储的SQL文不同,所以这里分开进行阐述。
1)、SSM框架完成批量保存-MySQL
①,MySQL表结构如下,user是用户表,而user_bak是user的备份表,其结构与user表一致,通过如下语句复制而来,代码及表结构如下:

②、在删除备询数据时将删除数据存于user_bak表中
批量删除页面效果

当选中7号和8号用户后,单击删除按钮开始批量删除,详情见本篇博客前部分。这里要补充是完成批量插入功能的实现。因为实验场景,所以这里采用常规手段,现将被删除的用户信息从数据库中检索出来然后再将数据保存到备份表中

userDao的saveBatchUser_MySQL代码如下

public int saveBatchUser_MySQL(List<User> users);

MyBatis配置MySQL批量存储的SQL文如下

2)、SSM框架完成批量保存-Oracle
其实Oracle和MySQL批量存储功能的差别,从代码角度看,主要的差别就是SQL语句不同而已
MyBatis配置Oracle批量存储的SQL文如下

数据库效果如下

至此:SSM框架CRUD操作&批量删除&批量追加数据(Oracle&MySQL数据库)文章的所有功能完毕,欢迎分享交流

由于时间关系,本人将在本博客中陆续推出高级框架阶段的系列教程,现已经发布如下几篇,如果对大家有帮助也请各位给点鼓励吧 ,比如关注微博、顶一下或者给点评论,谢谢!

http://blog.csdn.net/dl0246/article/details/77996811 SSM框架CRUD操作&批量删除&批量追加数据(Oracle&MySQL数据库)
http://blog.csdn.net/dl0246/article/details/77966611 诸多设计模式中,最为常见的三种设计模式-单例模式,代理模式,工厂模式
http://blog.csdn.net/dl0246/article/details/78251319 SpringMVC入门及系列教程(一)-SpringMVC环境搭建及入门案例(详细)
http://blog.csdn.net/dl0246/article/details/78259612 SpringMVC入门及系列教程(二)-SpringMVC请求周期及响应处理(初级)(详细)
http://blog.csdn.net/dl0246/article/details/78274343 SpringMVC入门及系列教程(三)-请求的映射(详细)
http://blog.csdn.net/dl0246/article/details/78286685 SpringMVC入门及系列教程(四)-SpringMVC在控制器中获取请求中的参数值(详细)
http://blog.csdn.net/dl0246/article/details/78390587 SpringMVC入门及系列教程(五)-响应处理&响应参数处理&SpringMVC作用域对象&SpringMVC原生Servlet对象

SSM框架CRUD操作批量删除批量追加数据(OracleMySQL数据库)相关推荐

  1. ORA-02292_主表在有子表外键约束的情况,如何快速批量删除和插入数据?

    ​ [引言] 最近接手一小活,需求要将一张表中的数据进行全部更新,因主表有外键关联,无法删除本表中数据,即删除有外键的表的数据时,oracle会提示:ORA-02292:integrity const ...

  2. java操作mysql导表_Java实现批量导入excel表格数据到数据库中的方法

    本文实例讲述了Java实现批量导入excel表格数据到数据库中的方法.分享给大家供大家参考,具体如下: 1.创建导入抽象类 package com.gcloud.common.excel; impor ...

  3. hibernate批量删除和更新数据

    转载自:http://blog.csdn.net/yuhua3272004/article/details/2909538 Hibernate3.0 採用新的基于ANTLR的HQL/SQL查询翻译器, ...

  4. EF Core中高效批量删除、更新数据的Zack.EFCore.Batch发布三个新特性

    Zack.EFCore.Batch是一个支持在Entity Framework Core中高效删除和更新数据的开源库.我们知道,EF Core中不支持高效的删除和更新数据,所有的更新和操作都是逐条数据 ...

  5. mysql批量删除5000条数据_mysql批量删除大量数据

    mysql批量删除大量数据 假设有一个表(syslogs)有1000万条记录,需要在业务不停止的情况下删除其中statusid=1的所有记录,差不多有600万条, 直接执行 DELETE FROM s ...

  6. Redis批量删除keys和清空全部数据库

    redis默认有0-15总共16个库,默认在0库 1.选择库DB0,例:select 1 选择db1 10.143.153.216:8896> select 0  OK 2.查看所选择库的大小: ...

  7. Ado.net[登录,增删改查,Get传值,全选,不选,批量删除,批量更新]

    [虽然说,开发的时候,我们可以使用各种框架,ado.net作为底层的东西,作为一个合格的程序员,在出问题的时候我们还是要知道如何调试] 一.增删改查 cmd.ExecuteReader();执行查询, ...

  8. mysql批量写入100万数据_Mysql数据库实践操作之————批量插入数据(100万级别的数据)-阿里云开发者社区...

    第一种方法:使用insert into 插入 从Redis每次获取100条数据,根据条件去插入到Mysql数据库中: 条件: 如果当前队列中的值大于1000条,则会自动的条用该方法,该方法每次获取从队 ...

  9. excel批量删除公式保留数据_Excel实用tips(17) – 批量删除隐藏的工作表

    大家可能遇到过这种情况:一个几经易手的远古 Excel 表,文件巨大无比,运行极慢,删除数据和公式也无济于事. 反复查找原因,才发现表格中有好几十个隐藏的 worksheet,这些 worksheet ...

最新文章

  1. python掌握程度怎么判断-Python数据分析路上,温故而知新
  2. 几种搜索引擎算法的研究
  3. 自己写的thinkphp自动生成类
  4. 视频百教程度云_腾讯视频的进击
  5. [推荐] 世界上最健康的作息时间表
  6. CTFHUB 《基础认证》:burp使用,basic请求了解
  7. java set collection_Java的Collection接口和Set接口?
  8. python 读xml_python读取xml文件
  9. 数据结构c语言版第4版答案,严蔚敏版数据结构(C语言版)参考答案第四、五章
  10. 管理信息系统(学习笔记)
  11. 使用命令查看linux编码,如何利用命令查看linux 系统汉字编码
  12. FreeMarker模板制作
  13. 名师李涛老师主讲 Photoshop CS2 (全教程下载)
  14. 黑客如何用线程注射技术隐藏自己的病毒
  15. 设置电脑保护视力的颜色
  16. 原来,嵌入式BI方案的核心差异在这,教你如何评估
  17. echarts实现各省市地图、中国地图
  18. 一个纯技术程序员的求职心酸历程
  19. 计算广告笔记04-合约广告
  20. 不要让自己成为温水里的青蛙

热门文章

  1. 深入SpringBoot源码(四)初识Environment
  2. perl——当split函数用空格做分隔符时
  3. 关于箱线/形图的上下边缘以及异常值的确定
  4. 周立功: 我的25年嵌入式生涯(转)
  5. 虚拟主机有哪些优缺点
  6. 第十四章 讲解如何去除和锁定网络验证暗装
  7. 统信UOS操作系统安装
  8. Cinema 4D 第一节(CG及软件介绍)
  9. 身份证名字转四六级成绩爬虫
  10. 海致大数据京信_海致BDP胡嵩:大数据在怎样的时代卖给怎样的人