SSM 框架-06-详细整合教程(IDEA版)(Spring+SpringMVC+MyBatis)

SSM(Spring、Spring
MVC和Mybatis)如果你使用的是 Eclipse,请查看:SSM 框架-05-详细整合教程(Eclipse版)(Spring+SpringMVC+MyBatis)

许多童鞋现在开始学习这个流行的框架来进行Java开发,想要寻找一个最简单的SSM框架搭建方法,这里我不说什么废话,直接上手开始搭建,代码部分都做了详细的注释,可以快速上手!

创建Java Web项目

这里博主用到的开发工具是IntelliJ IDEA,项目创建可能和eclipse和myeclipse有所不同,按照自己的需要来创建就好,用什么IDE就按照什么步骤来创建。

以下是完整目录结构,不论什么IDE都可以是这种结构,具体内容看图:

导入jar包

因为我们不采用maven的方式配置jar包,所以需要我们手动导入jar文件。这一步就不再多说,以下会和源代码一同给出。

配置文件

这里我们分别将Spring 和 Mybatis的配置文件放在两个文件夹中,Spring的有applicationContext.xml和applicationContext-mvc.xml,Mybatis的有mybatis-config.xml。

Mybatis配置文件

Mybatis的配置文件就是mybatis-config.xml,主要是配置typeAlias,将实体类匹配成XXXMapper.xml中可以直接使用的类型,相当于一个别名,在XXXMapper.xml中就无需再写完整的实体类全路径,直接用alias的值来代替。


  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD SQL Map Config 3.0//EN"
  3. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  4. <configuration>
  5. <typeAliases>
  6. <!--之后用于测试-->
  7. <typeAlias type="com.javafeng.entity.User" alias="User" />
  8. </typeAliases>
  9. </configuration>

其中的XXXMapper.xml当然就是Mybatis动态实现所需要的Mapper文件,Dao接口就可以不用再编写实现类。这里的Mapper和Dao中的接口是对应的,再接下来的测试中我们会给出具体的配置。

Spring配置文件

applicationContext.xml

在这个配置文件中,我们主要配置数据源,Spring的事务管理和Dao接口的扫描,以及对Mybatis的一些列相关配置文件的扫描。


  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
  5. <!--数据源-链接数据库的基本信息,这里直接写,不放到*.properties资源文件中-->
  6. <bean id="dataSource"
  7. class="org.springframework.jdbc.datasource.DriverManagerDataSource">
  8. <property name="driverClassName" value="com.mysql.jdbc.Driver" />
  9. <property name="url" value="jdbc:mysql://localhost:3306/javafeng" />
  10. <property name="username" value="root" />
  11. <property name="password" value="root" />
  12. </bean>
  13. <!-- 配置数据源,加载配置,也就是dataSource -->
  14. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  15. <property name="dataSource" ref="dataSource"></property>
  16. <!--mybatis的配置文件-->
  17. <property name="configLocation" value="classpath:mybatis/mybatis-config.xml" />
  18. <!--扫描 XXXmapper.xml映射文件,配置扫描的路径-->
  19. <property name="mapperLocations" value="classpath:com/javafeng/mapping/*.xml"></property>
  20. </bean>
  21. <!-- DAO接口所在包名,Spring会自动查找之中的类 -->
  22. <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
  23. <property name="basePackage" value="com.javafeng.dao" />
  24. <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
  25. </bean>
  26. <!--事务管理-->
  27. <bean id="transactionManager"
  28. class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  29. <!--注入dataSource-->
  30. <property name="dataSource" ref="dataSource" />
  31. </bean>
  32. <!--开启事务注解扫描-->
  33. <tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
  34. </beans>
applicationContext-mvc.xml

这个配置文件中我们主要启用Sping注解驱动,进行静态资源的配置,注解扫描配置和视图解析器配置.


  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:mvc="http://www.springframework.org/schema/mvc"
  6. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
  7. <!-- 告知Spring,我们启用注解驱动 -->
  8. <mvc:annotation-driven/>
  9. <!-- org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler,
  10. 它会像一个检查员,对进入DispatcherServlet的URL进行筛查,如果发现是静态资源的请求,
  11. 就将该请求转由Web应用服务器默认的Servlet处理,如果不是静态资源的请求,才由DispatcherServlet继续处理。 -->
  12. <mvc:default-servlet-handler/>
  13. <!-- 指定要扫描的包的位置 -->
  14. <context:component-scan base-package="com.javafeng" />
  15. <!-- 对静态资源文件的访问,因为Spring MVC会拦截所有请求,导致jsp页面中对js和CSS的引用也被拦截,配置后可以把对资源的请求交给项目的
  16. 默认拦截器而不是Spring MVC-->
  17. <mvc:resources mapping="/static/**" location="/WEB-INF/static/" />
  18. <!-- 配置Spring MVC的视图解析器 -->
  19. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  20. <!-- 有时我们需要访问JSP页面,可理解为在控制器controller的返回值加前缀和后缀,变成一个可用的URL地址 -->
  21. <property name="prefix" value="/WEB-INF/jsp/"/>
  22. <property name="suffix" value=".jsp"/>
  23. </bean>
  24. </beans>
web.xml

我们在web.xml中加载Spring配置,并且将所有的请求都过滤给Spring MVC来处理,同时设置编码过滤器解决编码问题(最后一项可以不配置)。

其中Spring MVC的请求过滤就是一个简单的Servlet配置。


  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
  5. version="3.1">
  6. <!-- 加载Spring容器配置 -->
  7. <listener>
  8. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  9. </listener>
  10. <!-- Spring容器加载所有的配置文件的路径 -->
  11. <context-param>
  12. <param-name>contextConfigLocation</param-name>
  13. <param-value>classpath*:spring/applicationContext.xml</param-value>
  14. </context-param>
  15. <!-- 配置SpringMVC核心控制器,将所有的请求(除了刚刚Spring MVC中的静态资源请求)都交给Spring MVC -->
  16. <servlet>
  17. <servlet-name>springMvc</servlet-name>
  18. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  19. <init-param>
  20. <param-name>contextConfigLocation</param-name>
  21. <param-value>classpath*:spring/applicationContext-mvc.xml</param-value>
  22. </init-param>
  23. <!--用来标记是否在项目启动时就加在此Servlet,0或正数表示容器在应用启动时就加载这个Servlet,
  24. 当是一个负数时或者没有指定时,则指示容器在该servlet被选择时才加载.正数值越小启动优先值越高 -->
  25. <load-on-startup>1</load-on-startup>
  26. </servlet>
  27. <!--为DispatcherServlet建立映射-->
  28. <servlet-mapping>
  29. <servlet-name>springMvc</servlet-name>
  30. <!-- 拦截所有请求,千万注意是(/)而不是(/*) -->
  31. <url-pattern>/</url-pattern>
  32. </servlet-mapping>
  33. <!-- 设置编码过滤器 -->
  34. <filter>
  35. <filter-name>encodingFilter</filter-name>
  36. <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  37. <init-param>
  38. <param-name>encoding</param-name>
  39. <param-value>UTF-8</param-value>
  40. </init-param>
  41. <init-param>
  42. <param-name>forceEncoding</param-name>
  43. <param-value>true</param-value>
  44. </init-param>
  45. </filter>
  46. <filter-mapping>
  47. <filter-name>encodingFilter</filter-name>
  48. <url-pattern>/*</url-pattern>
  49. </filter-mapping>
  50. </web-app>

到这里我们的框架基本上就成形了,接下来可以进行简单的测试。

测试

接下来就是应用实例,我会在文章结尾给出源码下载地址。

我们在数据库新建如下表(我的数据库名为javafeng,用的MySql):


  1. CREATE TABLE `user` (
  2. `ID` int(11) NOT NULL AUTO_INCREMENT,
  3. `Name` varchar(255) DEFAULT NULL,
  4. `Age` int(11) DEFAULT NULL,
  5. PRIMARY KEY (`ID`)
  6. ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

这里我们用逆向工程来生成实体类,Dao接口和对应的Mapper文件,具体方法参考:

点击打开链接  (版权归原作者所有),逆向工程的工具同代码一并奉上。我在里面分别添加了可以查询表内全部数据的代码。

实体类User.java


  1. package com.javafeng.entity;
  2. public class User {
  3. private Integer id;
  4. private String name;
  5. private Integer age;
  6. public Integer getId() {
  7. return id;
  8. }
  9. public void setId(Integer id) {
  10. this.id = id;
  11. }
  12. public String getName() {
  13. return name;
  14. }
  15. public void setName(String name) {
  16. this.name = name == null ? null : name.trim();
  17. }
  18. public Integer getAge() {
  19. return age;
  20. }
  21. public void setAge(Integer age) {
  22. this.age = age;
  23. }
  24. }

Mapper文件UserMapper.xml(自动生成,篇幅长也不可怕,前提是你已经基本掌握):


  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
  3. <!--namespace就是与此文件对应的Dao接口的全路径-->
  4. <mapper namespace="com.javafeng.dao.IUserDao" >
  5. <!--如下type的User就是mybatis-config.xml中配置的user-->
  6. <resultMap id="BaseResultMap" type="User" >
  7. <id column="ID" property="id" jdbcType="INTEGER" />
  8. <result column="Name" property="name" jdbcType="VARCHAR" />
  9. <result column="Age" property="age" jdbcType="INTEGER" />
  10. </resultMap>
  11. <!--自己配置的查询表所有数据的sql-->
  12. <select id="selectAllUser" resultType="User">
  13. select * FROM USER;
  14. </select>
  15. <sql id="Base_Column_List" >
  16. ID, Name, Age
  17. </sql>
  18. <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
  19. select
  20. <include refid="Base_Column_List" />
  21. from user
  22. where ID = #{id,jdbcType=INTEGER}
  23. </select>
  24. <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer" >
  25. delete from user
  26. where ID = #{id,jdbcType=INTEGER}
  27. </delete>
  28. <insert id="insert" parameterType="User" >
  29. insert into user (ID, Name, Age
  30. )
  31. values (#{id,jdbcType=INTEGER}, #{name,jdbcType=VARCHAR}, #{age,jdbcType=INTEGER}
  32. )
  33. </insert>
  34. <insert id="insertSelective" parameterType="User" >
  35. insert into user
  36. <trim prefix="(" suffix=")" suffixOverrides="," >
  37. <if test="id != null" >
  38. ID,
  39. </if>
  40. <if test="name != null" >
  41. Name,
  42. </if>
  43. <if test="age != null" >
  44. Age,
  45. </if>
  46. </trim>
  47. <trim prefix="values (" suffix=")" suffixOverrides="," >
  48. <if test="id != null" >
  49. #{id,jdbcType=INTEGER},
  50. </if>
  51. <if test="name != null" >
  52. #{name,jdbcType=VARCHAR},
  53. </if>
  54. <if test="age != null" >
  55. #{age,jdbcType=INTEGER},
  56. </if>
  57. </trim>
  58. </insert>
  59. <update id="updateByPrimaryKeySelective" parameterType="User" >
  60. update user
  61. <set >
  62. <if test="name != null" >
  63. Name = #{name,jdbcType=VARCHAR},
  64. </if>
  65. <if test="age != null" >
  66. Age = #{age,jdbcType=INTEGER},
  67. </if>
  68. </set>
  69. where ID = #{id,jdbcType=INTEGER}
  70. </update>
  71. <update id="updateByPrimaryKey" parameterType="User" >
  72. update user
  73. set Name = #{name,jdbcType=VARCHAR},
  74. Age = #{age,jdbcType=INTEGER}
  75. where ID = #{id,jdbcType=INTEGER}
  76. </update>
  77. </mapper>

Dao层接口IUserDao.java,生成时为UserMapper.java,我这里进行了重命名,注意一定要记得同时修改Mapper文件中的namespace:


  1. package com.javafeng.dao;
  2. import com.javafeng.entity.User;
  3. import org.springframework.stereotype.Repository;
  4. import java.util.List;
  5. @Repository("userDao")
  6. public interface IUserDao {
  7. int deleteByPrimaryKey(Integer id);
  8. int insert(User record);
  9. int insertSelective(User record);
  10. User selectByPrimaryKey(Integer id);
  11. int updateByPrimaryKeySelective(User record);
  12. int updateByPrimaryKey(User record);
  13. //自己添加的,已匹配Mapper中的Sql
  14. List<User> selectAllUser();
  15. }

接下来是Service层接口UserService.java:


  1. package com.javafeng.service;
  2. import com.javafeng.entity.User;
  3. import java.util.List;
  4. public interface UserSercice {
  5. public List<User> getUser();
  6. }

Service接口实现类UserServiceImpl.java:


  1. package com.javafeng.service.impl;
  2. import com.javafeng.dao.IUserDao;
  3. import com.javafeng.entity.User;
  4. import com.javafeng.service.UserSercice;
  5. import org.springframework.stereotype.Service;
  6. import javax.annotation.Resource;
  7. import java.util.List;
  8. @Service("userService")
  9. public class UserServiceImpl implements UserSercice{
  10. @Resource(name = "userDao")
  11. private IUserDao userDao;
  12. @Override
  13. public List<User> getUser() {
  14. return userDao.selectAllUser();
  15. }
  16. }

控制器UserController.java


  1. package com.javafeng.controller;
  2. import com.javafeng.entity.User;
  3. import com.javafeng.service.UserSercice;
  4. import org.springframework.stereotype.Controller;
  5. import org.springframework.web.bind.annotation.RequestMapping;
  6. import org.springframework.web.servlet.ModelAndView;
  7. import javax.annotation.Resource;
  8. import java.util.List;
  9. @Controller
  10. @RequestMapping(value = "/user")
  11. public class UserController {
  12. @Resource(name = "userService")
  13. UserSercice userService;
  14. @RequestMapping(value = "/list")
  15. public ModelAndView list()
  16. {
  17. ModelAndView mv=new ModelAndView();
  18. List<User> userList=userService.getUser();
  19. mv.addObject("userList",userList);
  20. mv.setViewName("/show");
  21. return mv;
  22. }
  23. }

我们要做的就是把这个表的数据显示在一个Jsp页面上,所以在WEB-INF/jsp下新建一个show.jsp来显示数据


  1. <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  2. <%--
  3. Created by IntelliJ IDEA.
  4. User: 13926
  5. Date: 2017/7/18
  6. Time: 23:07
  7. To change this template use File | Settings | File Templates.
  8. --%>
  9. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  10. <html>
  11. <head>
  12. <title>Title</title>
  13. </head>
  14. <body>
  15. <table border="1">
  16. <tr>
  17. <td>序号</td>
  18. <td>姓名</td>
  19. <td>年龄</td>
  20. </tr>
  21. <c:choose>
  22. <c:when test="${not empty userList}">
  23. <c:forEach items="${userList}" var="user" varStatus="vs">
  24. <tr>
  25. <td>${user.id}</td>
  26. <td>${user.name}</td>
  27. <td>${user.age}</td>
  28. </tr>
  29. </c:forEach>
  30. </c:when>
  31. <c:otherwise>
  32. <tr>
  33. <td colspan="2">无数据!</td>
  34. </tr>
  35. </c:otherwise>
  36. </c:choose>
  37. </table>
  38. </body>
  39. </html>

我们在index.html中做如下更改来使项目启动时自动访问user/list路径(其实就是懒得每次都输这个地址,因为测试时大多数时候都不是一次就成)


  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <html>
  3. <head>
  4. <title>$Title$</title>
  5. </head>
  6. <body>
  7. <jsp:forward page="/user/list"/>
  8. </body>
  9. </html>

项目部署不用多讲,直接发布到Tomcat服务器即可,因为已经才index.html做了修改,所以已不需要在地址栏输可恶的user/list路径了,直接http://localhost:8080/SSMDemoByIdea

这样我们就能把User表的数据显示在show.jsp了。

到这里我们的SSM框架搭建算是圆满完成,要是你还在报错中,恭喜,你可以接着继续调试了!

注意

0.     无论是注解的扫描还是配置文件的扫描,路径千万要写对,路径千万要写对,路径千万要写对

1.     再写Mapper和Dao接口时,一定要对应上,否则

Invalid bound statement (not found)

3.     Mapper在自动生成后,一定要按照自己项目的内容进行修改,比如namespace要和Dao接口对应,以及其中parameterType,resultType所对应的类型时你mybatis-config.xml中配置为alias值等等等等,总之千万要注意!

文件下载地址

更多链接

SSM 框架-06-详细整合教程(IDEA版)(Spring+SpringMVC+MyBatis)的更多相关文章

  1. SSM 框架-05-详细整合教程(Eclipse版)(Spring+SpringMVC+MyBatis)

    SSM 框架-05-详细整合教程(Eclipse版)(Spring+SpringMVC+MyBatis) 如果你使用的是 Intellij IDEA,请查看: SSM的配置流程详细的写了出来,方便很少 ...

  2. SSM框架搭建web服务器实现登录功能(Spring+SpringMVC+Mybatis)

    初学java EE,虽然知道使用框架会使开发更加便捷高效,但是对于初学者来说,感到使用框架比较迷惑,尤其是各种jar包的引用.各种框架的配置.注解的使用等等. 最好的学习方法就是实践,于是下载了一个现 ...

  3. SSM框架简介及整合教程

    1.Spring Spring 框架是 Java 应用最广的框架,它的成功来源于理念,而不是技术本身,它的理念包括 IoC (控制反转) 和 A面向切面编程).Spring框架是个轻量级的Java E ...

  4. SSM整合+WebUpload使用(spring+springmvc+mybatis+maven)

      SSM框架整合以及webupload的集成与使用 在项目中最近用到了webupload.js,也方方面面遇到了不少问题,比如上传文件前对表单参数校验,当校验失败不予提交,及在文件上传成功后,选择同 ...

  5. 记录-项目java项目框架搭建的一些问题(maven+spring+springmvc+mybatis)

    伴随着项目框架的落成后,本以为启动就能成功的,but.... 项目启动开始报错误1:java.lang.ClassNotFoundException: org.springframework.web. ...

  6. Spring+SpringMvc+Mybatis框架集成搭建教程

    一.背景 最近有很多同学由于没有过SSM(Spring+SpringMvc+Mybatis , 以下简称SSM)框架的搭建的经历,所以在自己搭建SSM框架集成的时候,出现了这样或者那样的问题,很是苦恼 ...

  7. Spring+SpringMVC+Mybatis(SSM)框架集成搭建

    Spring+SpringMVC+Mybatis框架集成搭建教程 一.背景 最近有很多同学由于没有过SSM(Spring+SpringMvc+Mybatis , 以下简称SSM)框架的搭建的经历,所以 ...

  8. SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)【申明:来源于网络】

    SSM框架--详细整合教程(Spring+SpringMVC+MyBatis)[申明:来源于网络] 地址:http://blog.csdn.net/u014662268/article/details ...

  9. SSM框架——详细整合教程

    SSM框架——详细整合教程(Spring+SpringMVC+MyBatis) 1.基本概念   1.1.Spring Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Jav ...

随机推荐

  1. python的面向对象和类

    目录 一.基本知识点 1.面向过程编程 2.面向对象编程 3.注意 二.类的结构 1.类的理解 2.代码形式 3.类和函数的一些区别 4.类中的数据 5.类中的方法(基础) 三.类的实例化 四.类的继 ...

  2. 12.Proxy

    1.概述 Proxy 用于修改某些操作的默认行为,等同于在语言层面做出修改,所以属于一种“元编程”(meta programming),即对编程语言进行编程. Proxy 可以理解成,在目标对象之前架 ...

  3. SpringMVC中配置AOP拦截controller 失效

    来源:http://www.oschina.net/question/222929_124314 目测大部分同学的aop失效都是因为在springmvc的配置文件里面扫描了类,那么spring去扫描的 ...

  4. vue测试安装和配置

    npm install --save-dev @vue/test-utils mocha mocha-webpack npm install --save-dev jsdom jsdom-global ...

  5. WPF 将TextBox更改为PasswordBox样式(文字显示方式为密码)

    在TextBox样式中增加如下所诉: <Style x:Key="TxtPwd" TargetType="{x:Type TextBox}"> &l ...

  6. java外观模式(Facade)

    1.外观模式(Facade [fə'sɑd] n. 正面:表面:外观) 外观模式:可以理解为 中介模式(没错,就是在用户与系统之间,增加了一个类,而这个类就是外观类,所以这个模式就叫外观模式) 如下图 ...

  7. mysql8.0关闭log-bin功能

    一.查看log-bin是否开启: mysql> show variables like 'log-bin'; 二.关闭log-bin: 在配置文件中的 [mysqld] 配置节中增加 skip- ...

  8. 入门系列之在Ubuntu 14.04上备份,还原和迁移MongoDB数据库

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由信姜缘 发表于云+社区专栏 MongoDB是最受欢迎的NoSQL数据库引擎之一.它以可扩展,强大,可靠和易于使用而闻名.在本文中,我们 ...

  9. Android studio的调试方法

    1. DDMS DDMS 全称 Dalvik Debug Monitor Service, dalvik虚拟机调试监控服务. 可以进行的操作有:为测试设备截屏,查看特定行程中正在运行的线程以及堆信息. ...

  10. Node.js创建第一个应用

    在我们创建 Node.js 第一个 "Hello, World!" 应用前,让我们先了解下 Node.js 应用是由哪几部分组成的: 引入 required 模块:我们可以使用 r ...