基于SpringBoot + Mybatis实现SpringMVC Web项目【原创】

目录
[隐藏]

一、热身

一个现实的场景是:当我们开发一个Web工程时,架构师和开发工程师可能更关心项目技术结构上的设计。而几乎所有结构良好的软件(项目)都使用了分层设计。分层设计是将项目按技术职能分为几个内聚的部分,从而将技术或接口的实现细节隐藏起来。

从另一个角度上来看,结构上的分层往往也能促进了技术人员的分工,可以使开发人员更专注于某一层业务与功能的实现,比如前端工程师只关心页面的展示与交互效果(例如专注于HTML,JS等),而后端工程师只关心数据和业务逻辑的处理(专注于Java,Mysql等)。两者之间通过标准接口(协议)进行沟通。

在实现分层的过程中我们会使用一些框架,例如SpringMVC。但利用框架带来了一些使用方面的问题。我们经常要做的工作就是配置各种XML文件,然后还需要搭建配置Tomcat或者Jetty作为容器来运行这个工程。每次构建一个新项目,都要经历这个流程。更为不幸的是有时候前端人员为了能在本地调试或测试程序,也需要先配置这些环境,或者需要后端人员先实现一些服务功能。这就和刚才提到的“良好的分层结构”相冲突。

每一种技术和框架都有一定的学习曲线。开发人员需要了解具体细节,才知道如何把项目整合成一个完整的解决方案。事实上,一个整合良好的项目框架不仅仅能实现技术、业务的分离,还应该关注并满足开发人员的“隔离”。

为了解决此类问题,便产生了Spring Boot这一全新框架。Spring Boot就是用来简化Spring应用的搭建以及开发过程。该框架致力于实现免XML配置,提供便捷,独立的运行环境,实现“一键运行”满足快速应用开发的需求。

与此同时,一个完整的Web应用难免少不了数据库的支持。利用JDBC的API需要编写复杂重复且冗余的代码。而使用O/RM(例如Hibernate)工具需要基于一些假设和规则,例如最普遍的一个假设就是数据库被恰当的规范了。这些规范在现实项目中并非能完美实现。由此,诞生了一种混合型解决方案——Mybatis。Mybatis是一个持久层框架,它从各种数据库访问工具中汲取大量优秀的思想,适用于任何大小和用途的数据库。根据官方文档的描述:MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

最后,再回到技术结构分层上,目前主流倡导的设计模式为MVC,即模型(model)-视图(view)-控制器(controller)。实现该设计模式的框架有很多,例如Struts。而前文提到的SpringMVC是另一个更为优秀,灵活易用的MVC框架。 SpringMVC是一种基于Java的以请求为驱动类型的轻量级Web框架,其目的是将Web层进行解耦,即使用“请求-响应”模型,从工程结构上实现良好的分层,区分职责,简化Web开发。

目前,对于如何把这些技术整合起来形成一个完整的解决方案,并没有相关的最佳实践。将Spring Boot和Mybatis两者整合使用的资料和案例较少。因此,本文提供(介绍)一个完整利用SpringBoot和Mybatis来构架Web项目的案例。该案例基于SpringMVC架构提供完整且简洁的实现Demo,便于开发人员根据不同需求和业务进行拓展。

补充提示,Spring Boot 推荐采用基于 Java 注解的配置方式,而不是传统的 XML。只需要在主配置 Java 类上添加“@EnableAutoConfiguration”注解就可以启用自动配置。Spring Boot 的自动配置功能是没有侵入性的,只是作为一种基本的默认实现。开发人员可以通过定义其他 bean 来替代自动配置所提供的功能,例如在配置本案例数据源(DataSource)时,可以体会到该用法。

 

二、实践

一些说明:

项目IDE采用Intellij(主要原因在于Intellij颜值完爆Eclipse,谁叫这是一个看脸的时代)

工程依赖管理采用个人比较熟悉的Maven(事实上SpringBoot与Groovy才是天生一对)

1.预览:

(1)github地址

https://github.com/djmpink/springboot-mybatis

git :  https://github.com/djmpink/springboot-mybatis.git

(2)完整项目结构

(3)数据库

数据库名:test 

【user.sql】

2.Maven配置

完整的【pom.xml】配置如下:

3.主函数

【Application.java】包含main函数,像普通java程序启动即可。

此外,该类中还包含和数据库相关的DataSource,SqlSeesion配置内容。

注:@MapperScan(“cn.no7player.mapper”表示Mybatis的映射路径(package路径)

4.Controller

请求入口Controller部分提供三种接口样例:视图模板,Json,restful风格

(1)视图模板

返回结果为视图文件路径。视图相关文件默认放置在路径 resource/templates下:

(2)Json

返回Json格式数据,多用于Ajax请求。

(3)restful

REST 指的是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是 RESTful。

此外,有一款RESTFUL接口的文档在线自动生成+功能测试功能软件——Swagger UI,具体配置过程可移步《Spring Boot 利用 Swagger 实现restful测试》

5.Mybatis

配置相关代码在Application.java中体现。

(1)【application.properties】

注意,在Application.java代码中,配置DataSource时的注解

@ConfigurationProperties(prefix=“spring.datasource”

表示将根据前缀“spring.datasource”从application.properties中匹配相关属性值。

(2)【UserMapper.xml】

Mybatis的sql映射文件。Mybatis同样支持注解方式,在此不予举例了。

(3)接口UserMapper

三、总结

(1)运行 Application.java

(2)控制台输出:

…..(略过无数内容)

(3)访问:

针对三种控制器的访问分别为:

视图:

http://localhost:8080/hello?name=7player

Json:

http://localhost:8080/getUserInfo

Restful(使用了swagger):

http://localhost:8080/swagger/index.html

 

 

四、参阅

《Spring Boot – Quick Start》

http://projects.spring.io/spring-boot/#quick-start

《mybatis》

http://mybatis.github.io/mybatis-3/

《使用 Spring Boot 快速构建 Spring 框架应用》

http://www.ibm.com/developerworks/cn/java/j-lo-spring-boot/

《Using @ConfigurationProperties in Spring Boot》

http://www.javacodegeeks.com/2014/09/using-configurationproperties-in-spring-boot.html?utm_source=tuicool

《Springboot-Mybatis-Mysample》

https://github.com/mizukyf/springboot-mybatis-mysample

《Serving Web Content with Spring MVC》

http://spring.io/guides/gs/serving-web-content/

《理解RESTful架构》

http://www.ruanyifeng.com/blog/2011/09/restful

 

附录:

Spring Boot 推荐的基础 POM 文件

名称

说明

spring-boot-starter

核心 POM,包含自动配置支持、日志库和对 YAML 配置文件的支持。

spring-boot-starter-amqp

通过 spring-rabbit 支持 AMQP。

spring-boot-starter-aop

包含 spring-aop 和 AspectJ 来支持面向切面编程(AOP)。

spring-boot-starter-batch

支持 Spring Batch,包含 HSQLDB。

spring-boot-starter-data-jpa

包含 spring-data-jpa、spring-orm 和 Hibernate 来支持 JPA。

spring-boot-starter-data-mongodb 

包含 spring-data-mongodb 来支持 MongoDB。

spring-boot-starter-data-rest

通过 spring-data-rest-webmvc 支持以 REST 方式暴露 Spring Data 仓库。

spring-boot-starter-jdbc

支持使用 JDBC 访问数据库。

spring-boot-starter-security

包含 spring-security。

spring-boot-starter-test

包含常用的测试所需的依赖,如 JUnit、Hamcrest、Mockito 和 spring-test 等。 

spring-boot-starter-velocity

支持使用 Velocity 作为模板引擎。

spring-boot-starter-web

支持 Web 应用开发,包含 Tomcat 和 spring-mvc。

spring-boot-starter-websocket

支持使用 Tomcat 开发 WebSocket 应用。

spring-boot-starter-ws

支持 Spring Web Services。

spring-boot-starter-actuator

添加适用于生产环境的功能,如性能指标和监测等功能。

spring-boot-starter-remote-shell

添加远程 SSH 支持。

spring-boot-starter-jetty

使用 Jetty 而不是默认的 Tomcat 作为应用服务器。

spring-boot-starter-log4j

添加 Log4j 的支持。

spring-boot-starter-logging

使用 Spring Boot 默认的日志框架 Logback。

spring-boot-starter-tomcat

使用 Spring Boot 默认的 Tomcat 作为应用服务器。

 

分享到:

73 条评论

点击这里取消回复。

昵称
  1. Tyler

    test@iwdjfnvn1

  2. 匿名

    楼主,主题是什么?提别好看

    1. 左小岸·礼

      Minty 稍作修改

      1. 匿名

        谢谢

  3. 匿名

    感觉你的pom.xml不完整

  4. 匿名

    我按照你的写的,为什么报错
    Description:

    Field userService in com.hzm.controller.UserController required a bean of type ‘com.hzm.service.UserService’ that could not be found.

    Action:

    Consider defining a bean of type ‘com.hzm.service.UserService’ in your configuration.

  5. 匿名

    很棒,谢谢,写的不错,加油

  6. 故事的小黄花

    写得很棒,可以运行,这几天刚开始看springboot,正号看看

  7. 匿名

    写的很棒,项目起起来了,但是为什么我每次改动 html 和 js 文件需要重启项目才能生效呢

    1. 匿名

      我的js和CSS直接被拦截了呢? 为什么

  8. 匿名

    启动报错了,为什么你的项目没有web.xml?
    java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/my-springboot-mybatis]]

    1. 匿名

      springboot 不需要web.xml。简单的说,就是为了简化之前类似ssh框架的繁琐配置

  9. 匿名

    对jdk的版本有什么要求吗

    1. 匿名

      没有要求,但推荐jdk8

  10. 匿名

    mybatis.xml文件怎么没有了

  11. 匿名

    学习了

  12. 匿名

    很赞!

  13. 匿名

    请问一下,为什么我连续两次运行程序,会报端口占用错误?

    1. 匿名

      你需要在dos命令下关掉占用的端口 你直接百度 dos命令关闭占用端口你就会了

  14. 匿名

    你好,为什么我集成了之后,mybatis是可以了,但是我之前能访问的jsp变的不能访问了

    1. 匿名

      访问页面需要使用thymeleaf 的模板

  15. 匿名

    写得很好

  16. Pingback: Development based on SpringBoot - Soso Blog knowledge share

  17. 匿名

    你好,问一下,项目中配置热部署后,修改spring-boot-starter-parent为1.4.1版本,启动项目。无法获取url,显示url为空,您知道这个问题,有什么好的解决方案吗

  18. 匿名

    日志怎么没生成文件

  19. 匿名

    请问下你把html页面放到resources目录下是为何呢?

    1. 匿名

      我也想知道这个, 你知道了吗

      1. 匿名

        这是maven的规范 而且需要创建template文件夹

  20. 匿名

    如何让spring boot同时支持thymeleaf和jsp? 使用ueditor有个controller.jsp没法用啊。自己复写了一个controller也白搭。求解

  21. 匿名

    写的很好~~~以后会关注

  22. venbill

    可以发一份代码给我吗?邮箱 venbill@yeah.net

    1. 左小岸·礼

      提供代码在github上:https://github.com/djmpink/springboot-mybatis

  23. venbill

    请问这个是什么问题?谢谢
    org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘swaggerConfig': Injection of autowired dependencies failed;

    1. 左小岸·礼

      完整代码启动报的错么? 注意查看下 swagger相关的依赖 是否有配置代码

  24. 匿名

    可以说一下如何打印mybatis语句么。以前是配置mybatis一个xml文件,放入log4j好像是,现在如何控制台打印sql语句呢

    1. 左小岸·礼

      一样的,也是在log4j配置文件中加入 相关配置就可以了

  25. 匿名

    对照你的pom文件,为什么我总是引不到@MapperScan注解的包和 SqlSessionFactory包

  26. 匿名

    你好,请问在swagger里展示的那些接口中,我从项目中并没有看到我们有提供env, error, metrics, health 这几个接口,也找不到相关代码。 我试了一下,这几个接口也都能访问,您知道这几个接口是在项目中哪里提供的吗?

    1. 左小岸·礼

      这几个接口 是springboot提供的 用于健康检查,性能指标等监控相关接口。可以去了解下:Spring Boot Actuator相关概念。spring-boot-starter-actuator

      1. 匿名

        好的,谢谢你!

  27. 匿名

    尝试了很多篇关于springboot集成mybatis的文章,就这个达到自己想要的效果

    1. 左小岸·礼

      哈哈~ 比较简单,所以 不容易出错~ 还可以优化,得空更新下。

  28. 匿名

    Error parsing Mapper XML. Cause: java.lang.IllegalArgumentException: Result Maps collection already contains value for com.kka.ef.dao.AreaCodeMapper.BaseResultMap
    项目中调试发现报这个错误,楼主有碰到过么?

  29. 匿名

    logger.info(“中文”)。如果是中文控制台就会输出乱码。我试了System.out.println和从数据库读出中文都没有问题,就是这个log日志输出会是乱码,请问怎么解决

    1. 左小岸·礼

      在日志的配置文件log4j.properties中加入一行编码配置试试:
      log4j.appender.file.encoding=UTF-8

      1. 匿名

        还是不行,加入log4j.properties自动就关联上了?不需要在代码里写加载什么的?。楼主的代码在SpringBoot Start Success那个位置改成 启动成功,控制台就是乱码了。求解

        1. 左小岸·礼

          我本地跑了程序,可以正常显示,不加也没有乱码。我觉得也有可能是你的IDE环境问题,查看一下IDE的环境编码。确实也解决不了,发邮件截图联系我吧,或者联系QQ:343787567

          1. 匿名

            改了项目编码为utf-8就好了。另外问下现在thymyleaf3怎么和springboot整合,我看springboot的thymyleaf还是2.x的版本。看最新版的swagger是不是只能gradle引用了?没找到maven的那个地址了。另外问下做web项目是用maven还是gradle构建好

  30. 匿名

    你好。。我使用的的github项目直接运行报错了,报错内容是有关的依赖没有,找不到头绪啊
    Exception in thread “main” java.lang.NoClassDefFoundError: org/slf4j/MarkerFactory
    at org.apache.log4j.Category.(Category.java:53)
    at cn.no7player.Application.(Application.java:24)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:190)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:116)
    Caused by: java.lang.ClassNotFoundException: org.slf4j.MarkerFactory
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
    … 5 more

    1. 左小岸·礼

      你好,出错的原因可能有几种,比如 本地maven确实没有找到依赖(重新 maven import一下),或者修改了类名等。如果有需要,可以直接联系我qq:343787567

  31. 匿名

    非常不错的,看得出很用心。~\(≧▽≦)/~

    1. 左小岸·礼

      谢谢~~

  32. 匿名

    讲解 很详细 也很实用 赞一个

  33. 匿名

    多谢!讲解非常详细。

  34. 匿名

    是啊刚进公司用的springboot,为什么用java -jar运行啊,懵啊

    1. 匿名

      自带tomcat

      1. 匿名

        不是自带是依赖还是有tomcat的

  35. James.Fu

    写的很棒。不过感觉还是离真实web项目远了一点。为什么都是采用java -jar的方式来运行的?能不能谈一下用eclipse如何创建web项目呢?如何run on a server,如何调试?

    1. 匿名

      springboot就是这个写法啊,我们公司的web都是用这个弄的,

      1. 匿名

        我们公司也是用的这个框架,很棒的!

      2. 匿名

        service层和mapper没有展示出来,代码不全

      3. 匿名

        好吧 我看错了 后面有接口和mapper

    2. 匿名

      你是小白的话我可以回答你……做程序员最基本的就是学会使用工具

  36. 匿名

    谢谢您的项目啊

  37. 匿名

    没有事务控制

  38. 匿名

    我下的源码,为什么我本地数据库连不上呢

    1. 匿名

      注意看下 本地数据库的用户名和密码配置是否和源码一致?

  39. 匿名

    我就差一点,现在按照你的老是报错想看看你的代码是怎么写的,发给我吧,谢谢了627266375@qq.com

  40. 匿名

    能把你的源码打包提供出来吗(包可以删掉)?感激不尽,发我邮箱也可以谢谢了,627266375@qq.com

    1. 匿名

      两分钟就构建好了,Good

      1. 左小岸·礼

        谢谢,文章有些久了,很多依赖可以参考最新的版本

        1. 匿名

          能不能把swagger那部分也放上来啊

  41. coolguy

    虽然完全没看懂在说什么(实际上是完全没看),但是还是有必要抢个沙发坐坐