1.SSM整合_单表的增删改查
- 目标:增删改查
- 环境:Maven+Eclipse+Tomcat7+JDK7
- 思维导图:

- 表结构

- 目录结构



- 依赖
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!-- SpringMVC -->
<!-- 1)核心组件 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.3.10.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.10.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.3.10.RELEASE</version>
</dependency>
<!-- spring dao层组件 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.3.10.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>4.3.10.RELEASE</version>
</dependency>
<!-- spring web组件 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.3.10.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.10.RELEASE</version>
</dependency>
<!-- mybatis和spring整合的依赖 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.2</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.1</version>
</dependency>
<!-- 数据库连接池 和驱动-->
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.43</version>
</dependency>
<!-- jstl servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!-- spring单元测试 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.3.10.RELEASE</version>
<scope>test</scope>
</dependency>
<!-- JSON包 -->
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
<classifier>jdk15</classifier>
</dependency>
</dependencies>
页面上引入了Bootstrap,只是简单的使用的一下,复杂的我并不太会。下载的Bootstrap的包直接复制到webapp目录下就行,除此之外还有JQuery的包。

- 实体类
public class User {
private int id;
private String userName;
private String age;
//省略getter和setter
...
}
- 接口和映射文件
接口:
public interface UserMapper {
public void addUser(User user);
public void deleteUser(String name);
public void updateUser(User user);
public User getUser(String name);
public List<User> getUser2(String name);
public List<User> getAllUser();
}
映射文件:
<!-- namespace的属性值命名规则:文件所在的包路径+文件名 -->
<mapper namespace="com.demo.mapper.UserMapper">
<!-- 添加 -->
<select id="addUser" parameterType="User">
insert into t_user(t_id,t_name,t_age) value(#{id},#{userName},#{age})
</select>
<!-- 删除 -->
<delete id="deleteUser" parameterType="String">
delete from t_user where t_name = #{name}
</delete>
<!-- 修改 -->
<update id="updateUser" parameterType="User">
update t_user set t_name = #{userName}, t_age = #{age} where t_id = #{id}
</update>
<!-- 查找 -->
<select id="getUser" parameterType="String" resultType="User">
select t_id id, t_name userName, t_age age from t_user where t_name = #{id}
</select>
<!-- 模糊查询 -->
<select id="getUser2" parameterType="String" resultType="User">
select t_id id, t_name userName, t_age age from t_user where t_name like "%"#{name}"%"
</select>
<!-- 查找所有 -->
<select id="getAllUser" resultType="User">
select t_id id, t_name userName, t_age age from t_user
</select>
</mapper>
- service和其实现类
service层:
public interface IUserService {
public void addUser(User user);
public void delectUser(String name);
public void updateUser(User user);
public User getUser(String name);
public List<User> getUser2(String name);
public List<User> getAll();
}
实现类:
@Service
@Transactional
public class UserServiceImp implements IUserService{
@Resource
private UserMapper mapper;
@Override
public void addUser(User user) {
mapper.addUser(user);
}
@Override
public void delectUser(String name) {
mapper.deleteUser(name);
}
@Override
public void updateUser(User user) {
mapper.updateUser(user);
}
@Override
public User getUser(String name) {
return mapper.getUser(name);
}
@Override
public List<User> getAll() {
return mapper.getAllUser();
}
@Override
public List<User> getUser2(String name) {
return mapper.getUser2(name);
}
}
- controller
@Controller
@RequestMapping("/user")
public class UserController {
@Autowired
private IUserService userService;
/**
* 跳转到添加页面
* @return
*/
@RequestMapping("/toAddUser")
public String toAddUser(){
return "adduser";
}
/**
* 添加用户
*/
@RequestMapping("/addUser")
public String addUser(User user,Model model){
userService.addUser(user);
return "redirect:/user/getAll";
}
/**
* 删除用户
*/
@RequestMapping("/deleteUser")
public String deleteUser(String name){
userService.delectUser(name);
return "redirect:/user/getAll";
}
/**
* 跳转到修改页面,修改页面和新增页面共用一个JSP
* @param name
* @param request
* @return
*/
@RequestMapping("/toUpdateUser")
public String toUpdateUser(String name, HttpServletRequest request){
User user = userService.getUser(name);
request.setAttribute("user", user);
return "adduser";
}
/**
* 修改用户:forward可以传参数,redirect不能传参数
*/
@RequestMapping("/updateUser")
public String updateUser(User user,HttpServletRequest request){
userService.updateUser(user);
return "redirect:/user/getAll";
}
/**
* 查询
*/
@RequestMapping("/getUser")
public String getUser(String name, HttpServletRequest request){
User user = userService.getUser(name);
request.setAttribute("user", user);
return "/userlist";
}
/**
* 模糊查询
* @param name
* @return
*/
@RequestMapping("/getUser2")
public String getUser2(String name, HttpServletRequest request){
List list = userService.getUser2(name);
request.setAttribute("userList", list);
return "/userlist";
}
/**
* 获取所有的用户
*/
@RequestMapping("/getAll")
public String getAll(HttpServletRequest request){
List<User> userList = userService.getAll();
request.setAttribute("userList", userList);
return "/userlist";
}
}
- 配置文件_web.xml
web.xml
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring.xml</param-value>
</context-param>
<!--2.加载spring的配置文件 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--1. 加载springmvc的配置文件 -->
<servlet>
<servlet-name>springDispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springDispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- 3.编码方式 -->
<filter>
<filter-name>CharacterEncoding</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>
</filter>
<filter-mapping>
<filter-name>CharacterEncoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
- spring配置文件
<!-- 1.扫描Service包 -->
<context:component-scan base-package="com.demo.service"></context:component-scan>
<context:component-scan base-package="com.demo1.service"></context:component-scan>
<!-- 2.引用数据库配置文件 -->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!-- 3.数据库连接池 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="user" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
<property name="driverClass" value="${jdbc.driverClass}"></property>
<property name="jdbcUrl" value="${jdbc.url}"></property>
</bean>
<!-- 4.Spring 和 Mybatis整合 -->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 注入数据源 -->
<property name="dataSource" ref="dataSource"></property>
<!-- 加载mybatis的全局文件 -->
<property name="configLocation" value="classpath:mybatis-cfg.xml"></property>
<!-- 扫描mybatis的映射文件,此处可以不配置,但是需要在Mybatis的全局配置文件中配置<mappers>标签,二选一
一个目录:classpath:com/demo/mapper/*.xml,多个目录:classpath*:com/demo*/mapper/*.xml
-->
<property name="mapperLocations" value="classpath*:com/demo*/mapper/*.xml"></property>
<!-- 配置别名,多个包之间用逗号或分号隔开 -->
<property name="typeAliasesPackage" value="com.demo.model;com.demo1.model"></property>
</bean>
<!-- 5.mybatis自动扫描加载SQL映射文件/接口:MapperScannerConfigurer sqlSessionFactory,
basePackage: 指定SQL映射文件/接口所在的包(自动扫描)
-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 扫描接口 ,扫描多个接口使用逗号隔开-->
<property name="basePackage" value="com.demo.mapper,com.demo1.mapper"></property>
<property name="sqlSessionFactoryBeanName" value="sqlSession"></property>
</bean>
<!-- 6.事务管理 DataSourceTransactionManager dataSource:引用数据源-->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 7.声明式事务 -->
<tx:annotation-driven transaction-manager="txManager"/>
- springmvc配置文件
<!-- 扫描Controller层 -->
<context:component-scan base-package="com.demo.controller"></context:component-scan>
<context:component-scan base-package="com.demo1.controller"></context:component-scan>
<!-- 会自动注册RequestMappingHandlerMapping与RequestMappingHandlerAdapter两个Bean,
HandlerMapping的实现类的作用:
实现类RequestMappingHandlerMapping,它会处理@RequestMapping 注解,并将其注册到请求映射表中。
HandlerAdapter的实现类的作用:
实现类RequestMappingHandlerAdapter,则是处理请求的适配器,确定调用哪个类的哪个方法,并且构造方法参数,返回值。
当配置了mvc:annotation-driven/后,Spring就知道了我们启用注解驱动。然后Spring通过context:component-scan/标签的配置,
会自动为我们将扫描到的@Component,@Controller,@Service,@Repository等注解标记的组件注册到工厂中,来处理我们的请求。
如果不配置该标签则,spring默认注册这两个Bean,但是如果为了不拦截静态资源,而配置了<mvc:default-servlet-handler/>标签,
此标签使spring不再默认注册RequestMappingHandlerAdapter的bean,这个bean能够处理@RequestMapping这个注解。
所以单独的使用<mvc:default-servlet-handler/>标签,会导致@RequestMapping失效
-->
<mvc:annotation-driven/>
<!-- 表示上述配置的 css 文件不属 viewResolver 解析 -->
<mvc:default-servlet-handler/>
<!-- 配置 springMVC 不拦截的静态资源 -->
<!-- css 下所有文件都映射到 /bootstrap/css/ (*: 只处理文件夹下一级; **: 文件夹下多级) -->
<mvc:resources mapping="/css/**" location="/bootstrap-3.3.7-dist/css/"/>
<mvc:resources mapping="/js/**" location="/bootstrap-3.3.7-dist/js/"/>
<!-- 配置视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
- mybatis-cfg.xml(可有可无)
<configuration>
<!-- mybatis配置文件 -->
<!-- 别名,Spring配置文件中配置了typeAliasesPackage属性后,此处不需要配置 -->
<!-- <typeAliases>
<package name="com.demo.model"/>
<package name="com.demo1.model"/>
</typeAliases> -->
<!-- Spring配置文件中配置了MapperLocation属性后,此处不需要配置 -->
<!-- <mappers>
<mapper resource="com/demo/mapper/userMapper.xml"/>
</mappers> -->
</configuration>
- jdbc.properties
jdbc.url=jdbc:mysql://localhost:3306/ssm_test?useUnicode=true&characterEncoding=utf8
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.username=root
jdbc.password=root
- log4j.properties
### set log levels ###
log4j.rootLogger = info , Console , D
#Console
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
log4j.logger.java.sql.ResultSet=INFO
log4j.logger.org.apache=INFO
log4j.logger.java.sql.Connection=INFO
log4j.logger.java.sql.Statement=INFO
log4j.logger.java.sql.PreparedStatement=INFO
#output2file
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = D\:/logs/log.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = INFO \#\# \u00E8\u00BE\u0093\u00E5\u0087\u00BAinfo\u00E7\u00BA\u00A7\u00E5\u0088\u00AB\u00E4\u00BB\u00A5\u00E4\u00B8\u008A\u00E7\u009A\u0084\u00E6\u0097\u00A5\u00E5\u00BF\u0097
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH\:mm\:ss} [ %t\:%r ] - [ %p ] %m%n
17.jsp页面
列表页:userlist.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core_rt"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path;
request.setAttribute("basePath", basePath);
%>
<!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">
<!-- 引入CSS样式 -->
<link rel="stylesheet" href="${pageContext.request.contextPath }/css/bootstrap.min.css">
<link rel="stylesheet" href="${pageContext.request.contextPath }/css/bootstrap-theme.css">
<!-- 引入Bootstrap文件,JS包放在Bootstrap包上 -->
<script type="text/javascript" src="${pageContext.request.contextPath }/js/jquery-3.2.1.min.js"></script>
<script type="text/javascript" src="${pageContext.request.contextPath }/js/bootstrap.min.js"></script>
<title></title>
</head>
<body>
<div>
<h2 align="center">信息</h2>
</div>
<div align="center" style="margin-bottom: 50px">
<form action="${basePath }/user/getUser2" method="post">
<input type="text" name="name"><input type="submit" value="Search">
</form>
</div>
<div align="center">
<a href="${basePath }/user/toAddUser">新增</a>
</div>
<div class="container" align="center" style="margin-bottom: 50px">
<table class="table table-bordered">
<tr>
<th>序号</th>
<th>ID</th>
<th>姓名</th>
<th>年龄</th>
<th>操作</th>
</tr>
<c:forEach items="${userList}" var="user" varStatus="status">
<tr>
<td>${status.count }</td>
<td>${user.id }</td>
<td>${user.userName }</td>
<td>${user.age }</td>
<td><a href="${basePath }/user/toUpdateUser?name=${user.userName }">修改</a><a href="${basePath }/user/deleteUser?name=${user.userName }">删除</a></td>
</tr>
</c:forEach>
</table>
</div>
</body>
</html>
添加修改页:adduser.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path;
request.setAttribute("basePath", basePath);
%>
<!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">
<!-- 引入CSS样式 -->
<link rel="stylesheet" href="${pageContext.request.contextPath }/css/bootstrap.min.css">
<link rel="stylesheet" href="${pageContext.request.contextPath }/css/bootstrap-theme.css">
<!-- 引入Bootstrap文件,JS包放在Bootstrap包上 -->
<script type="text/javascript" src="${pageContext.request.contextPath }/js/jquery-3.2.1.min.js"></script>
<script type="text/javascript" src="${pageContext.request.contextPath }/js/bootstrap.min.js"></script>
<title></title>
</head>
<body>
<div align="center">
<c:if test="${empty user }">
<h2>新增</h2>
</c:if>
<c:if test="${not empty user }">
<h2>修改</h2>
</c:if>
<c:if test="${empty user }">
<form action="${basePath }/user/addUser" method="post" >
</c:if>
<c:if test="${not empty user }">
<form action="${basePath }/user/updateUser" method="post" >
</c:if>
序号:<input type="text" name="id" value="${user.id }">
<br>
姓名:<input type="text" name="userName" value="${user.userName }">
<br>
年龄:<input type="text" name="age" value="${user.age }">
<br>
<button type="submit" class="btn btn-default">提交</button>
</form>
</div>
</body>
</html>
源码:链接: https://pan.baidu.com/s/1x7hIvRhmiCh1gkzaCwLu8Q 提取码: 8ci5
1.SSM整合_单表的增删改查的更多相关文章
- python全栈开发day61-django简单的出版社网站展示,添加,删除,编辑(单表的增删改查)
day61 django内容回顾: 1. 下载: pip install django==1.11.14 pip install -i 源 django==1.11.14 pycharm 2. 创建项 ...
- hibernate对单表的增删改查
ORM: 对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping) 实现对单表的增删改查 向区域表中增加数据: 第一步: 新建一个Da ...
- Django学习笔记(10)——Book单表的增删改查页面
一,项目题目:Book单表的增删改查页面 该项目主要练习使用Django开发一个Book单表的增删改查页面,通过这个项目巩固自己这段时间学习Django知识. 二,项目需求: 开发一个简单的Book增 ...
- django模型层 关于单表的增删改查
关于ORM MTV或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库, 通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员 ...
- Django学习笔记--数据库中的单表操作----增删改查
1.Django数据库中的增删改查 1.添加表和字段 # 创建的表的名字为app的名称拼接类名 class User(models.Model): # id字段 自增 是主键 id = models. ...
- django 利用ORM对单表进行增删改查
牛小妹上周末,一直在尝试如何把数据库的数据弄到界面上.毕竟是新手,搞不出来,文档也看不懂.不过没关系,才刚上大学.今晚我们就来解释下,要把数据搞到界面的第一步.先把数据放到库里,然后再把数据从库里拿出 ...
- Mybatis(一)实现单表的增删改查
1.1 什么是Mybatis MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并 ...
- Django中对单表的增删改查
之前的简单预习,重点在后面 方式一: # create方法的返回值book_obj就是插入book表中的python葵花宝典这本书籍纪录对象 book_obj=Book.objects.creat ...
- MYSQL基础操作之单表的增删改查
一.添加数据. -- 1.创建表,并插入一定的数据. CREATE TABLE STUDENT( ID INT, USERNAME ), SERVLET INT, JSP INT, ADDRESS ) ...
随机推荐
- 如何做一个项目.ppt
链接:https://pan.baidu.com/s/1q8Ogj0xYQV_vk-HGcszxqw 提取码:0a82 复制这段内容后打开百度网盘手机App,操作更方便哦
- python封装configparser模块获取conf.ini值
configparser模块是python自带的从文件中获取固定格式参数的模块,因为是python只带的,大家用的应该很多,我觉得这个参数模块比较灵活,添加参数.修改参数.读取参数等都有对应的参数供用 ...
- 项目Alpha冲刺(团队)-第五天冲刺
格式描述 课程名称:软件工程1916|W(福州大学) 作业要求:项目Alpha冲刺(团队)-代码规范.冲刺任务与计划 团队名称:为了交项目干杯 作业目标:描述第五天冲刺的项目进展.问题困难.心得体会 ...
- day17——其他内置函数
zip函数: print(list(zip(('a','b','c'),(1,2,3)))) p={'name':'alex','age':18,'gender':'none'} print(list ...
- 帆软报表(finereport)实现自动滚屏效果
例如Demo:IOS平台年度数据报表. 展示内容丰富,一个页面中存在多个图表.内容,超出了浏览器窗口的大小导致内容展示不全. 为了能够预览这个报表的全部内容,可以使用JS滚屏效果来实现. 操作步骤: ...
- C++入门篇六
struct和class的访问权限:结构体,类 struct和class 是相同的,唯一的而不同,就是默认权限,struct是public,class默认是private class Animal { ...
- 主席树+树链剖分——南昌邀请赛Distance on the tree
学了差不多一星期的主席树+树链剖分,再来看这题发现其实是个板子题 一开始想复杂了,以为要用类似求树上第k大的树上差分思想来解决这道题,但其实树链上<=k的元素个数其实直接可以用树链剖分来求 具体 ...
- sql 语句中count()有条件的时候为什么要加上or null
参考:https://blog.csdn.net/qq_32719287/article/details/79513164 1.sql 语句中count()有条件的时候为什么要加上or null. 如 ...
- PHP使用urlencode对中文编码时空格、加号的问题
使用urlencode这个函数进行格式化,urlencode函数会把空格编码为为:+ 当然,前端在接收时可以解码后进行替换 + 为空格的方式处理. 但是这样就多做了一步,很麻烦,有的时候我们的数据接口 ...
- Excel 统计区间频数,按照条件标记
MS Office 2013 统计区间频数--countif函数 如要统计[75,90)区间段的成绩,使用 =COUNTIF(L3:L44, ">=75")-COUN ...