- springmvc /
- mybatis /
- maven /
- ssm整合
1.首先是建立一个Maven-project,具体操作请参考我的另一篇文章 点击这里 2. 然后导入maven依赖,这里将我的依赖列出如下 [html] view plain copy
- <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
- <modelVersion>4.0.0</modelVersion>
- <groupId>org.bb</groupId>
- <artifactId>ssm</artifactId>
- <packaging>war</packaging>
- <version>0.0.1-SNAPSHOT</version>
- <name>ssm Maven Webapp</name>
- <url>http://maven.apache.org</url>
- <dependencies>
- <!-- 单元测试 -->
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>4.10</version>
- <scope>test</scope>
- </dependency>
- <!-- Spring 相关依赖 -->
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-context</artifactId>
- <version>4.1.3.RELEASE</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-beans</artifactId>
- <version>4.1.3.RELEASE</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-webmvc</artifactId>
- <version>4.1.3.RELEASE</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-jdbc</artifactId>
- <version>4.1.3.RELEASE</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-aspects</artifactId>
- <version>4.1.3.RELEASE</version>
- </dependency>
- <!-- Mybatis 依赖 -->
- <dependency>
- <groupId>org.mybatis</groupId>
- <artifactId>mybatis</artifactId>
- <version>3.4.2</version>
- </dependency>
- <!-- mybatis整合Spring -->
- <dependency>
- <groupId>org.mybatis</groupId>
- <artifactId>mybatis-spring</artifactId>
- <version>1.3.0</version>
- </dependency>
- <!-- Mysql 依赖 -->
- <dependency>
- <groupId>mysql</groupId>
- <artifactId>mysql-connector-Java</artifactId>
- <version>5.1.6</version>
- </dependency>
- <!-- log4j日志 依赖 -->
- <dependency>
- <groupId>apache-log4j</groupId>
- <artifactId>log4j</artifactId>
- <version>1.2.15</version>
- </dependency>
- <!-- JSP相关 -->
- <dependency>
- <groupId>jstl</groupId>
- <artifactId>jstl</artifactId>
- <version>1.2</version>
- </dependency>
- <dependency>
- <groupId>javax.servlet</groupId>
- <artifactId>servlet-api</artifactId>
- <version>2.5</version>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>javax.servlet</groupId>
- <artifactId>jsp-api</artifactId>
- <version>2.0</version>
- <scope>provided</scope>
- </dependency>
- </dependencies>
- <build>
- <finalName>ssm</finalName>
- <plugins>
- <plugin>
- <groupId>org.mybatis.generator</groupId>
- <artifactId>mybatis-generator-maven-plugin</artifactId>
- <version>1.3.2</version>
- <configuration>
- <verbose>true</verbose>
- <overwrite>true</overwrite>
- </configuration>
- </plugin>
- </plugins>
- </build>
- </project>
3.然后在src/main/java下新建需要的package,如下图所示
各包的用途如下:controller-无需多说,放的是springmvc的controller文件 mode-放的实体类 service-业务层 service.impl-业务实现层 mapper-mybatis的操作数据库的接口文件,类似于dao层(这里需要注意src/main/resources下的目录,和org.bb.ssm.mapper包名一样) 4.此处我使用mybatis-generator自动生成映射类、dao、xml文件,具体做法是:现在pom.xml中引用mybatis-generator这个插件(前面我们已经引进),在src/main/resource下新建generatorConfig.xml,内容如下: [html] view plain copy
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
- <generatorConfiguration>
- <!-- <properties resource="init.properties"/> -->
- <!-- 指定数据库连接驱动地址 -->
- <classPathEntry
- location="D:\Program Files\apache-maven-3.3.9\repository\mysql\mysql-connector-java\5.1.6\mysql-connector-Java-5.1.6.jar" />
- <!-- 一个数据库一个 context -->
- <context id="context1">
- <commentGenerator>
- <!-- 是否取消注释 -->
- <property name="suppressAllComments" value="true"></property>
- <!-- 是否生成注释代时间戳-->
- <property name="suppressDate" value="true"></property>
- </commentGenerator>
- <!-- jdbc连接配置 -->
- <jdbcConnection
- connectionURL="jdbc:mysql://127.0.0.1:3306/ssm?useUnicode=true&characterEncoding=UTF-8"
- driverClass="com.mysql.jdbc.Driver" password="root" userId="root" />
- <!-- 类型转换 -->
- <javaTypeResolver>
- <!-- 是否使用bigDecimal, false可自动转化以下类型(Long, Integer, Short, etc.) -->
- <property name="forceBigDecimals" value="false"/>
- </javaTypeResolver>
- <!-- 生成实体类的地址 -->
- <javaModelGenerator targetPackage="org.bb.ssm.model"
- targetProject="D:\SXYC\workspace\ssm\src\main\java" />
- <!-- 生成mapper.xml文件 -->
- <sqlMapGenerator targetPackage="org.bb.ssm.mapper"
- targetProject="D:\SXYC\workspace\ssm\src\main\resources" />
- <!-- 生成mapxml对应的client 也就是接口dao -->
- <javaClientGenerator targetPackage="org.bb.ssm.mapper"
- targetProject="D:\SXYC\workspace\ssm\src\main\java" type="XMLMAPPER" />
- <table schema="ssm" tableName="userinfo" domainObjectName="UserInfo" enableCountByExample="false"
- enableDeleteByExample="false" enableSelectByExample="false"
- enableUpdateByExample="false">
- <!-- domainObjectName 指定生成的类的名字 -->
- </table>
- </context>
- </generatorConfiguration>
[html] view plain copy
5.鼠标右击pom.xml,run as "Maven build" 在goals中输入命令:mybatis-generator:generate,即可自动生成相应文件。 6.下面开始配置spring与mybatis的整合配置--applicationContext-mybatis.xml,直接上配置: [html] view plain copy
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
- xmlns:context="http://www.springframework.org/schema/context"
- xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:tx="http://www.springframework.org/schema/tx"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans.xsd
- http://www.springframework.org/schema/mvc
- http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context.xsd
- http://www.springframework.org/schema/tx
- http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">
- <!-- Mybatis 和 Spring的整合 -->
- <!-- 1.数据源:DriverManagerDataSource -->
- <bean id="dataSource"
- class="org.springframework.jdbc.datasource.DriverManagerDataSource">
- <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
- <property name="url" value="jdbc:mysql://localhost:3306/ssm"></property>
- <property name="username" value="root"></property>
- <property name="password" value="root"></property>
- </bean>
- <!-- 2.Mybatis 的 SqlSession的工厂:SqlSessionFactoryBean dataSource引用数据源 Mybatis
- 定义数据源,同意加载配置 -->
- <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
- <property name="dataSource" ref="dataSource"></property>
- <property name="configLocation" value="classpath:mybatis-config.xml"></property>
- </bean>
- <!-- 3. Mybatis自动扫描加载Sql映射文件/接口:MapperScannerConfigurer sqlSessionFactory
- basePackage:指定sql映射文件/接口所在的包(自动扫描) -->
- <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
- <property name="basePackage" value="org.bb.ssm.mapper"></property>
- <property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
- </bean>
- <!-- 4.事务管理:DataSourceTransactionManager dataSource 引用上面定义好的数据源 -->
- <bean id="txManager"
- class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
- <property name="dataSource" ref="dataSource"></property>
- </bean>
- <!-- 5.使用声明式事务: transaction-manager = "txManager" tx:advice 这种 是用 aop方式管理事物
- annotation-driven 这种是注解方式管理事物 第一种方式,需要在spring配置文件配置一些参数 第二种方式,需要在 类里 加一些注解进行事物管理
- 用一种就行,没必须都用 -->
- <tx:annotation-driven transaction-manager="txManager" />
- </beans>
7.配置Mybatis的配置文件,mybatis官方文档推荐起名为mybatis-config.xml,这里遵循约定: [html] view plain copy
- <?xml version="1.0" encoding="UTF-8" ?>
- <!DOCTYPE configuration
- PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
- "http://mybatis.org/dtd/mybatis-3-config.dtd">
- <configuration>
- <!-- 配置打印 SQL 到控制台 以及懒加载 -->
- <settings>
- <setting name="logImpl" value="STDOUT_LOGGING" />
- <!-- 打开延迟加载的全局开关 -->
- <setting name="lazyLoadingEnabled" value="true" />
- <setting name="aggressiveLazyLoading" value="false" />
- <setting name="mapUnderscoreToCamelCase" value="true" />
- </settings>
- <!-- 为org.bb.ssm.mode.UserInfo 设置一个别名 UserInfo -->
- <typeAliases>
- <typeAlias type="org.bb.ssm.model.UserInfo" alias="UserInfo"/>
- </typeAliases>
- <mappers>
- <package name="org.bb.ssm.mapper"/>
- </mappers>
- </configuration>
8.下来是springMVC的配置文件spring-MVC.xml: [html] view plain copy
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
- xmlns:context="http://www.springframework.org/schema/context"
- xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:tx="http://www.springframework.org/schema/tx"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans.xsd
- http://www.springframework.org/schema/mvc
- http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context.xsd
- http://www.springframework.org/schema/tx
- http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">
- <!-- 开启注解 -->
- <mvc:annotation-driven/>
- <!-- 配置自定扫描包 -->
- <context:component-scan base-package="org.bb.ssm.controller"/>
- <context:component-scan base-package="org.bb.ssm.service.Impl"/>
- <!-- 配置视图解析器: 如何把 handler 方法返回值解析为实际的物理视图 -->
- <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
- <property name="prefix" value="/WEB-INF/view/"></property>
- <property name="suffix" value=".jsp"></property>
- </bean>
- <!-- 处理静态资源 -->
- <mvc:default-servlet-handler/>
- </beans>
9.web.xml配置: [html] view plain copy
- <?xml version="1.0" encoding="UTF-8"?>
- <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
- http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
- <!-- 加载Spring 容器配置 -->
- <listener>
- <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
- </listener>
- <!-- 加载spring与mybatis的整合配置 -->
- <context-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>classpath:applicationContext-mybatis.xml</param-value>
- </context-param>
- <!-- 配置 springMVC 核心控制器 -->
- <servlet>
- <servlet-name>springMVC</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>springMVC</servlet-name>
- <url-pattern>/</url-pattern>
- </servlet-mapping>
- <!-- 防止Spring内存溢出监听器 -->
- <listener>
- <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
- </listener>
- <!-- 解决工程编码过滤器
- 注意:请将此过滤器放在所有过滤器的前面,否则有可能出现乱码
- -->
- <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>`ssm` ;
- USE `ssm`;
- DROP TABLE IF EXISTS `userinfo`;
- CREATE TABLE `userinfo` (
- `user_id` int(11) NOT NULL AUTO_INCREMENT,
- `user_name` varchar(30) DEFAULT NULL,
- `user_age` int(3) DEFAULT NULL,
- `user_address` varchar(400) DEFAULT NULL,
- PRIMARY KEY (`user_id`)
- ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
11.配置到这里已经完成,启动项目访问欢迎页面,如果看到熟悉的Hello world 代表整合成功了。
12.创建业务层接口文件,UserInfoService.java 和 对应的实现类 UserInfoServiceImpl.java [html] view plain copy
- package org.bb.ssm.service;
- import java.util.List;
- import org.bb.ssm.model.UserInfo;
- public interface UserInfoService {
- List<UserInfo> findAll();
- int deleteByPrimaryKey(Integer userId);
- int insert(UserInfo record);
- int insertSelective(UserInfo record);
- UserInfo selectByPrimaryKey(Integer userId);
- int updateByPrimaryKeySelective(UserInfo record);
- int updateByPrimaryKey(UserInfo record);
- }
[html] view plain copy
- package org.bb.ssm.service.Impl;
- import java.util.List;
- import javax.annotation.Resource;
- import org.bb.ssm.mapper.UserInfoMapper;
- import org.bb.ssm.model.UserInfo;
- import org.bb.ssm.service.UserInfoService;
- import org.springframework.stereotype.Service;
- import org.springframework.transaction.annotation.Transactional;
- //可以消除xml中对bean的配置
- @Service
- // 此处使用spring的声明式事务,不在使用sqlsession和提交事务了
- @Transactional
- public class UserInfoServiceImpl implements UserInfoService {
- @Resource
- private UserInfoMapper mapper;
- @Override
- public List<UserInfo> findAll() {
- List<UserInfo> list = mapper.findAll();
- return list;
- }
- @Override
- public int deleteByPrimaryKey(Integer userId) {
- return mapper.deleteByPrimaryKey(userId);
- }
- @Override
- public int insert(UserInfo record) {
- return mapper.insert(record);
- }
- @Override
- public int insertSelective(UserInfo record) {
- return mapper.insertSelective(record);
- }
- @Override
- public UserInfo selectByPrimaryKey(Integer userId) {
- return mapper.selectByPrimaryKey(userId);
- }
- @Override
- public int updateByPrimaryKeySelective(UserInfo record) {
- return mapper.updateByPrimaryKeySelective(record);
- }
- @Override
- public int updateByPrimaryKey(UserInfo record) {
- return mapper.updateByPrimaryKey(record);
- }
- }
13.创建controller文件,UserInfoCotroller.java [html] view plain copy
- package org.bb.ssm.controller;
- import java.util.List;
- import java.util.Map;
- import org.bb.ssm.model.UserInfo;
- import org.bb.ssm.service.UserInfoService;
- 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.PathVariable;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.RequestMethod;
- import org.springframework.web.bind.annotation.RequestParam;
- @Controller
- @RequestMapping(value="/user")
- public class UserInfoCotroller {
- @Autowired
- private UserInfoService userInfoService;
- @RequestMapping(value="/getAllUser")
- public String getAllUser(Map<String, Object> map){
- List<UserInfo> userList = userInfoService.findAll();
- map.put("ALLUSER", userList);
- return "allUser";
- }
- @RequestMapping(value="/addUser",method= RequestMethod.GET)
- public String addUser(Map<String, Object> map){
- //因为页面使用spring的form标签,其中属性modelAttribute需要存在bean 要不会报错
- map.put("command", new UserInfo());
- return "addUser";
- }
- @RequestMapping(value="/addUser",method=RequestMethod.POST)
- public String save(UserInfo userinfo){
- int result = userInfoService.insert(userinfo);
- System.out.println("添加用户的操作结果为:"+result);
- return "redirect:/user/getAllUser";
- }
- @RequestMapping(value="/delete/{id}",method=RequestMethod.DELETE)
- public String delete(@PathVariable(value="id") int id){
- int result = userInfoService.deleteByPrimaryKey(id);
- System.out.println("删除用户的操作结果为:"+result+"传递进来的id为:"+id);
- return "redirect:/user/getAllUser";
- }
- @RequestMapping(value="/detail/{id}",method=RequestMethod.GET)
- public String input(@PathVariable(value="id") Integer id,Map<String, Object> map){
- map.put("command", userInfoService.selectByPrimaryKey(id));
- return "addUser";
- }
- @ModelAttribute
- public void getUserInfo(@RequestParam(value="userId",required=false) Integer id
- ,Map<String, Object> map){
- System.out.println("每个controller 方法都会先调用我哦");
- if(id != null){
- System.out.println("update 操作");
- map.put("userInfo", userInfoService.selectByPrimaryKey(id));
- }
- System.out.println("insert 操作");
- }
- @RequestMapping(value="/addUser",method=RequestMethod.PUT)
- public String update(UserInfo userinfo){
- userInfoService.updateByPrimaryKey(userinfo);
- return "redirect:/user/getAllUser";
- }
- }
14.展示页面:分别是allUser.jsp、addUser.jsp [html] view plain copy
- <%@ page language="java" contentType="text/html; charset=utf-8"
- pageEncoding="utf-8"%>
- <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
- <!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">
- <title>全部员工</title>
- <!--
- SpringMVC 处理静态资源:
- 1. 为什么会有这样的问题:
- 优雅的 REST 风格的资源URL 不希望带 .html 或 .do 等后缀
- 若将 DispatcherServlet 请求映射配置为 /,
- 则 Spring MVC 将捕获 WEB 容器的所有请求, 包括静态资源的请求, SpringMVC 会将他们当成一个普通请求处理,
- 因找不到对应处理器将导致错误。
- 2. 解决: 在 SpringMVC 的配置文件中配置 <mvc:default-servlet-handler/>
- -->
- <script type="text/javascript" src="../scripts/jquery-1.9.1.min.js"></script>
- <script type="text/javascript">
- $(function(){
- $(".delete").click(function(){
- var href = $(this).attr("href");
- $("form").attr("action", href).submit();
- return false;
- });
- });
- </script>
- </head>
- <body>
- <form action="" method="post">
- <input type="hidden" name="_method" value="DELETE" />
- </form>
- <c:choose>
- <c:when test="${empty requestScope.ALLUSER}">
- 没有员工信息
- </c:when>
- <c:otherwise>
- <table border="1">
- <tr>
- <th>编号</th>
- <th>姓名</th>
- <th>年龄</th>
- <th>地址</th>
- <th>操作</th>
- </tr>
- <c:forEach items="${requestScope.ALLUSER }" var="UserInfo">
- <tr>
- <td> ${UserInfo.userId } </td>
- <td> ${UserInfo.userName } </td>
- <td>${UserInfo.userAge }</td>
- <td>${UserInfo.userAddress }</td>
- <td><a class="delete"
- href="${pageContext.request.contextPath }/user/delete/${UserInfo.userId}">删除</a> <a
- href="${pageContext.request.contextPath }/user/detail/${UserInfo.userId}">更新</a></td>
- </tr>
- </c:forEach>
- </table>
- </c:otherwise>
- </c:choose>
- </body>
- </html>
[html] view plain copy
- <%@ 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="form" uri="http://www.springframework.org/tags/form" %>
- <!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">
- <title>添加新员工</title>
- </head>
- <body>
- <form:form action="${pageContext.request.contextPath }/user/addUser" method="post" modelAttribute="command">
- <c:if test="${command.userId != null }">
- <form:hidden path="userId"/>
- <input type="hidden" name="_method" value="PUT"/>
- <%-- 对于 _method 不能使用 form:hidden 标签, 因为 modelAttribute 对应的 bean 中没有 _method 这个属性 --%>
- <%--
- <form:hidden path="_method" value="PUT"/>
- --%>
- </c:if>
- userName : <form:input path="userName"/><br><br>
- userAge : <form:input path="userAge"/><br><br>
- userAddress : <form:input path="userAddress"/><br><br>
- <input type="submit" value="提交"/>
- </form:form>
- </body>
- </html>
15.运行tomcat,访问http://localhost:8089/ssm/user/addUser 进入添加用户页面,输入用户信息
点击提交
点击更新(此处addUser.jsp使用了springmvc的 form标签,可以更方便的进行数据的回显):
点击提交(这里偷懒,将更新和添加放在一个页面了)
点击删除
最后附上项目的树状图:
到这里,ssm整合以及用户的crud功能已基本实现。
gitHub:免积分下载