您的位置:首页 > 编程语言 > Java开发

关于Spring Boot的学习心得。安装,集成Spring Boot 与 mybatis

2018-03-04 21:37 926 查看
        前两天刚上班,然后就被我们的直属老大叫去分组搞定一些技术,出品成文档在所有人之间传阅学习。于是我和其余俩个小伙同心协力之下搞出了一份成品。其他两个小伙伴很给力。没有他们,无法有这份文档。虽然有些粗略,但还是希望能给大家有所帮助。

Spring Boot学习文档
 
文档说明:标有浅灰色背景内容为扩展内容,忽略阅读不影响学习Spring Boot的使用。

一.  为什么选择Spring Boot

随着动态语言的流行(Ruby、Groovy、Scala、Node.js),java的开发显得格外的笨重,
繁多的配置、低下的开发效率、复杂的部署流程以及第三方技术集成难度大。
在上述环境下,Spring Boot应运而生。它使用“习惯优于配置”(项目中存在大量的配
置,此外还内置一个习惯性的配置,让你无需手动进行配置)的理念让你的项目快速运行起来。使用Spring Boot很容易创建一个独立运行(运行jar,内嵌Servlet容器)、准生产级别的基于Spring框架的项目,使用Spring Boot你可以不用或者只需要很少的Spring配置。

1.spring boot的优缺点

(1)优点:

1、快速构建项目。2、对主流开发框架的无配置集成。3、项目可独立运行,无须外部依赖Servlet容器。4、提供运行时的应用监控。5、极大的提高了开发、部署效率。6、与云计算的天然集成。

(2)缺点:

1、如果你不认同spring框架,也许这就是缺点。

二.idea快速搭建spring boot项目+原理解析

1. 创建简单web项目(没有连接数据库)

         第一步:点击File—>New—>Project…  弹出以下页面
        


 
第二步:点击上图所示的“1”即Spring Initializr即可创建spring boot应用,“2”和“3”保持默认即可,点击Next进入下一步。
注意:IntelliJ IDEA的商业版本是自带这个选项功能的,但是社区版本是没有这个选项的,需要另外安装插件“Spring Assistant”。关于商业版IntelliJ IDEA的破解方法在文档末尾会有说明。
 
第三步:Next之后进入页面,这些便是传统创建maven工程的选项了,相信大家不会陌生。



注释:首先,
SpringBoot
应用是可以打包成
JAR
或者
WAR
形式的。但是官方文档推荐的是打包成
JAR
,作为一个
web
应用
,为什么会推荐打包成
JAR
,这是因为
SpringBoot
内集成了
Tomcat
服务器,当你启动
Spri
172e9
ngBoot
应用的时候,内置的
Tomcat
服务器就会启动,加载
web
应用
。这个可以从启动
SpringBoot
项目的时候从控制台的日志中可以看出,如下:
 
第四步:上图填完点击Next,变到了比较重要的一个页面



首先,我们创建一个简单的可以通过浏览器输入http://localhost:8080/访问的简单web应用,所以我们依次点击最左边的“Web”,再勾选中间的“Web”,接着点击Next。这个页面在接下来需要创建连接数据库的web应用时还会讲到。
 
第五步:默认项目名称,还有根据需要选择项目存放路径,点击“Finish”便可以创建一个Spring boot应用了。



 
成功创建后目录结构如下:



 
第七步:运行,点击src下的main目录里的SpringBootDemoApplication文件或者test下的SpringBootDemoApplicationTests文件都可以运行测试。



运行后显示以下类似图案并且无报错信息便算搭建成功。



注释:在我们创建过程中碰到一个问题也分享一下,就是当我们右键点击这个main方法的类时,并没有找到执行这个应用的选项,即没有Run方法,这时候点击下示按钮便可设置出来。



点击后弹出下列页面,点击左边的Module,设置右边的内容,详细原理请看:http://blog.csdn.net/bug_moving/article/details/62217017



 
 

2. 创建不简单的web项目(Spring Boot集成Mybatis)

俗话说,一切不连数据库的web应用都是耍流氓。Spring Boot集成Mybatis的web应用创建过程与前面大致相同,但是,唯一不同的是,在第四步上。

这一页要勾选三个,分别是“Web”、“MySQL”和“MyBatis”。

第一步:创建数据表

表名: user
id
BigInt
Primary key
用户编号
name
Varchar(32)
Not null
用户名
age
Int(3)
Not null
年龄

第二步:创建对应实体类:

 

第三步:创建mapper接口文件

package com.facebank.springbootmybatis.mapper;

import com.facebank.springbootmybatis.domain.User;
import org.apache.ibatis.annotations.*;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * User映射接口
 */
@Mapper
@Repository
public interface UserMapper {

    /**
     * 查询所有用户
     * @return
     */
    @Select("SELECT * FROM user")
    List<User> findAll();

    /**
     * 查询总记录数
     * @return
     */
    @Select("SELECT COUNT(*) FROM user")
    Long findCount();

    /**
     * 通过姓名模糊查询对应用户
     * @param name
     * @return
     */
    @Select("SELECT * FROM user WHERE name LIKE \"%\"#{name}\"%\"")
    List<User> findByName(String name);

    /**
     * 插入/新增新用户
     * @param user
     * @return
     */
    @Insert("INSERT INTO user(name, age) VALUES(#{name}, #{age})")
    int saveUser(User user);

    /**
     * 更新用户信息
     * @param user
     * @return
     */
    @Update("UPDATE user SET name = #{name},age = #{age} WHERE id = #{id}")
    int updateUser(User user);

    /**
     * 根据用户id删除用户信息
     * @param id
     * @return
     */
    @Delete("DELETE FROM user WHERE id = #{id}")
    int deleteById(Integer id);

}
 
值得注意的是可以通过注解实现dao层的构建,摒弃了传统使用一个Mapper类对应一个Xml文件的繁杂方式,有时候还会因为找不到对应业务的方法在哪而平白浪费开发时间,降低开发效率。与此对比的是,这种注解的方式可以一一对应查看修改,清晰。
在这个接口上方使用了两个注解,分别是@Mapper和@Repository
         (1)@Mapper:这个注解是为了Spring Boot的自动配置机制使用的,通过它可以让整个环境找到这个mapper接口,从而实现数据库的连接和数据获取。
(2)@Repository:这个注解则是为了让Service层在调用mapper时,需要使用@Autowired注解自动注入这个mapper,若没有,则直接编译错误,报Could not found错误。
增删改查对应着四个注解
(3)@Insert
(4)@Delete
(5)@Update
(6)@Select
可以发现,在注解的括号中书写SQL,若是基本类型或者是基本类型的包装类型,则直接对应参数名称在sql中用#{xxx}的方式注入。若是自定义类型(例如User),则也可直接使用自定义类型中的属性变量名称在sql中以#{xxx}注入,而不是#{user.xxx}。
 

第四步:创建service接口

package com.facebank.springbootmybatis.service;

import com.facebank.springbootmybatis.domain.User;

import java.util.List;

/**
 * 用户表接口
 */
public interface UserService {

    /**
     * 插入新用户
     * @param user
     * @return
    
*/
    int saveUser(User user);

    /**
     * 根据姓名查询用户
     * @param name
     * @return
    
*/
    List<User> findByName(String name);

    /**
     * 查询所有用户
     * @return
    
*/
    List<User> findAll();

    /**
     * 查询总记录数
     * @return
    
*/
    Long findCount();

    /**
     * 更新用户信息
     * @param user
     * @return
    
*/
    int updateUser(User user);

    /**
     * 根据用户id删除用户
     * @param id
     * @return
    
*/
    int deleteById(Integer id);
}
 
 

第五步:创建service接口对应实现类

package com.facebank.springbootmybatis.service.impl;

import com.facebank.springbootmybatis.domain.User;
import com.facebank.springbootmybatis.mapper.UserMapper;
import com.facebank.springbootmybatis.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * 用户表service实现
 */
@Service
public class UserServiceImpl implements UserService {

    @Autowired
    UserMapper userMapper;

    @Override
    public int saveUser(User user) {
        return userMapper.saveUser(user);
    }

    @Override
    public List<User> findByName(String name) {
        List<User> users = userMapper.findByName(name);
        return users;
    }

    @Override
    public List<User> findAll() {
        return userMapper.findAll();
    }

    @Override
    public Long findCount() {
        return userMapper.findCount();
    }

    @Override
    public int updateUser(User user) {
        return userMapper.updateUser(user);
    }

    @Override
    public int deleteById(Integer id) {
        return userMapper.deleteById(id);
    }
}
 

第六步:创建Controller

package com.facebank.springbootmybatis.controller;

import com.facebank.springbootmybatis.domain.User;
import com.facebank.springbootmybatis.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@Controller
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("/findAll")
    @ResponseBody
    public List<User> findAll() {
        return userService.findAll();
    }

    @GetMapping("/findByName/{name}")
    @ResponseBody
    public List<User> findByName(@PathVariable("name") String name) {
        return userService.findByName(name);
    }

    @GetMapping("/findCount")
    @ResponseBody
    public String findCount() {
        Long count = userService.findCount();
        return "总记录数为:" + count;
    }

    @PostMapping("/saveUser")
    @ResponseBody
    public String saveUser(User user) {
        int row = userService.saveUser(user);
        if (row > 0) {
            return "添加成功";
        }
        return "添加失败";
    }

    @PutMapping("/updateUser")
    @ResponseBody
    public String updateUser(User user) {
        int row = userService.updateUser(user);
        if (row > 0) {
            return "更新成功";
        }
        return "更新失败";
    }

    @DeleteMapping("/deleteById/{id}")
    @ResponseBody
    public String deleteById(@PathVariable("id") Integer id) {
        int row = userService.deleteById(id);
        if (row > 0) {
            return "删除成功";
        }
        return "删除失败";
    }

}
 
注释:这里可以看到,相对于SpringMVC传统使用@Controller(value=’’,method= RequestMethod.POST) 这种在括号中设置Post或者Get或者其他请求方式的书写方式。Spring Boot提供了更为清晰的注解来分别区分开来。
       (1)@GetMapping  对应Get请求,例如查询数据等业务
       (2)@PostMapping 对应Post请求,例如添加/保存数据等业务
(3)@PutMapping  对应更新数据等业务
(4)@DeleteMapping 对应删除数据等业务
 

第七步:测试

首先,点开SpringbootMybatisApplication类,右键或者菜单上点击运行。
然后,点击Tools à Test RESTful webservice 即可打开idea自带的测试web应用的框架。
 
增—访问地址:http://localhost:8080/user/saveUser



测试结果:



数据库也毫无问题,Good Job!



 
同理:
删:http://localhost:8080/user/deleteById/5
改:http://localhost:8080/user/updateUser
查:http://localhost:8080/user/findAll
 
以上测试均无问题。期待你自己run一次。
 
 
本程序可上Github拷贝参考,最好就自己做一遍啦。
https://github.com/KrishnnaOUT/spring-mybatis.git
 
 

Spring Boot 静态资源访问

关于Spring Boot项目,它与传统项目不同的是,传统项目的页面和css、js等静态资源都是放在WEB-INF下的。当然,css和js也有放在跟WEB-INF同级目录下的。当然,这不是我们讨论的重点。
       Spring Boot应用则是别具一格。他的css、js等静态资源都放置在src/main/resouces下的static目录下。注意:这个static目录就是访问的根目录。举个例子,在static目录中放一张图片A.jpg,那么启动程序后,在浏览器输入http://localhost:8080/A.jpg即可访问到该图片。
       除此之外。SpringBoot是不支持Jsp的,这是因为JSP在内嵌的Servlet的容器上运行有一些问题(内嵌Tomcat、Jetty不支持以jar形式运行JSP,Undertow不支持JSP)。
那该怎么办呢。很遗憾的是,唯有学习才能继续开发了。SpringBoot提供了大量模板引擎,包含括FreeMarker、Groovy、Thymeleaf、Velocity和Mustache,Spring Boot中推荐使用Themeleaf作为模板引擎,因为Thymeleaf提供了完美的Spring MVC的支持。
而这些Thymeleaf文件(实际上是后缀为.html的文件)放置在templates目录下的。



3.  相关原理分析

(一)注解分析

(1)    @EnableConfigurationProperties:自动映射一个pojo到springboot的配置文件(默认是application.properties文件)的属性集。
(2)    @RestController:它继承自@Controller注解,放在表现层,我们都知道,返回json需要@ResponseBody和@Controller配合来标识当前类是一个控制器servlet,@RestController可以代替以上两个注解来使用。而开发rest服务的时候就要使用@RestController。
(3)  @SpringBootApplication:是springboot最重要的一个注解,用于快捷配置启动类。源码说明它只是一个配置文件类,它会被@ComponentScan扫描到。源码如下:



分析:可以知道,在@SpringBootApplication注解里比较重要的是这个三个注解:@Configuration、@EnableAutoConfiguration
、@ComponentScan。即若不使用@SpringBootApplication
使用以上三个注解一样可以达到同样的目的。
使用方法:当用idea创建Spring Boot项目时,便自动在主包下创建好了这个配置类。直接便可以运行。它会自动扫描所在类的同级包以及下级包里的Bean(若为JPA项目还可以扫描标注@Entity的实体类)。建议入口类放置的位置在groupId+arctifactID组合的包名下。
   

             
排除配置类:若有时候多个配置类存在,而我们想要关闭特定的自动配置应该使用@SpringBootApplication注解的exclude参数,例如:@SpringBootApplication(exclude={myConfiguration.class})
(4)        @EnableAutoConfiguration:让Spring Boot 根据类路径中的jar包依赖为当前项目进行自动配置。简单来说,以前我们都是通过手动集成各种xml配置文件,然后在WEB-INF下的web.xml手动填写一下配置的位置来注册。而Spring Boot通过这个简单的注解让这一切都给你自动配置好了,是不是很贴心。
例如:添加了spring-boot-starter-web依赖,会自动添加Tomcat和Spring MVC的依赖,那么Spring Boot会对Tomcat和Spring MVC进行自动配置。

(二)Spring Boot的配置文件

         Spring Boot使用一个全局的配置文件Application.yml 或者Application.properties,放置在src/main/resources目录或者类路径的/config下。
       Spring Boot不仅支持常规的properties配置文件,还支持yaml语言的配置文件,yaml是以数据为中心的语言,在配置数据的时候具有面向对象的特征。
       Spring Boot的全局配置文件的作用是对一些默认配置的配置值进行修改。如修改Tomcat默认的端口号,并将默认的访问路径“/”修改为“/helloboot”,可以在Application.properties中添加以下代码即可:



 
                   该文件还是设置数据源、数据库连接池的地方。如下。



 

(三)pom.xml

(1)spring-boot-starter-parent



 
         注释:Maven的用户可以通过继承spring-boot-starter-parent项目来获得一些合理的默认配置。这个parent提供了以下特性:
默认使用Java 8
使用UTF-8编码
一个引用管理的功能,在dependencies里的部分配置可以不用填写version信息,这些version信息会从spring-boot-dependencies里得到继承。
识别过来资源过滤(Sensible resource filtering.)
识别插件的配置(Sensible plugin configuration (exec plugin, surefire, Git commit ID, shade).)
能够识别application.properties和application.yml类型的文件,同时也能支持profile-specific类型的文件(如: application-foo.properties and application-foo.yml,这个功能可以更好的配置不同生产环境下的配置文件)。
maven把默认的占位符${…​}改为了@..@(这点大家还是看下原文自己理解下吧,我个人用的也比较少 
since the default config files accept Spring style placeholders (${…​}) the Maven filtering is changed to use @..@ placeholders (you can override that with a Maven property resource.delimiter).)
 

(2)starter pom

         本项目中使用到以下starter pom:
        
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
   <groupId>org.mybatis.spring.boot</groupId>
   <artifactId>mybatis-spring-boot-starter</artifactId>
   <version>1.3.1</version>
</dependency> <dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-test</artifactId>
   <scope>test</scope>
</dependency>
 
Spring Boot为我们提供了简化企业级开发绝大多数场景的starterpom, 只要使用了应用场景所需要的starterpom, 相关的技术配置将会删除,就可以得到SpringBoot为我们提供的自动配置的Bean。简单来说,他帮我们封装好了,就等着我们在pom文件中添加依赖就可以用了。
 
1. 官方starter pom
名称
描述
spring-boot-starter核心Spring Boot starter,包括自动配置支持,日志和YAML
spring-boot-starter-actuator生产准备的特性,用于帮你监控和管理应用
spring-boot-starter-amqp对”高级消息队列协议”的支持,通过spring-rabbit实现
spring-boot-starter-aop对面向切面编程的支持,包括spring-aop和AspectJ
spring-boot-starter-batch对Spring Batch的支持,包括HSQLDB数据库
spring-boot-starter-cloud-connectors对Spring Cloud Connectors的支持,简化在云平台下(例如,Cloud Foundry 和Heroku)服务的连接
spring-boot-starter-data-elasticsearch对Elasticsearch搜索和分析引擎的支持,包括spring-data-elasticsearch
spring-boot-starter-data-gemfire对GemFire分布式数据存储的支持,包括spring-data-gemfire
spring-boot-starter-data-jpa对”Java持久化API”的支持,包括spring-data-jpa,spring-orm和Hibernate
spring-boot-starter-data-mongodb对MongoDB NOSQL数据库的支持,包括spring-data-mongodb
spring-boot-starter-data-rest对通过REST暴露Spring Data仓库的支持,通过spring-data-rest-webmvc实现
spring-boot-starter-data-solr对Apache Solr搜索平台的支持,包括spring-data-solr
spring-boot-starter-freemarker对FreeMarker模板引擎的支持
spring-boot-starter-groovy-templates对Groovy模板引擎的支持
spring-boot-starter-hateoas对基于HATEOAS的RESTful服务的支持,通过spring-hateoas实现
spring-boot-starter-hornetq对”Java消息服务API”的支持,通过HornetQ实现
spring-boot-starter-integration对普通spring-integration模块的支持
spring-boot-starter-jdbc对JDBC数据库的支持
spring-boot-starter-jersey对Jersey RESTful Web服务框架的支持
spring-boot-starter-jta-atomikos对JTA分布式事务的支持,通过Atomikos实现
spring-boot-starter-jta-bitronix对JTA分布式事务的支持,通过Bitronix实现
spring-boot-starter-mail对javax.mail的支持
spring-boot-starter-mobile对spring-mobile的支持
spring-boot-starter-mustache对Mustache模板引擎的支持
spring-boot-starter-redis对REDIS键值数据存储的支持,包括spring-redis
spring-boot-starter-security对spring-security的支持
spring-boot-starter-social-facebook对spring-social-facebook的支持
spring-boot-starter-social-linkedin对spring-social-linkedin的支持
spring-boot-starter-social-twitter对spring-social-twitter的支持
spring-boot-starter-test对常用测试依赖的支持,包括JUnit, Hamcrest和Mockito,还有spring-test模块
spring-boot-starter-thymeleaf对Thymeleaf模板引擎的支持,包括和Spring的集成
spring-boot-starter-velocity对Velocity模板引擎的支持
spring-boot-starter-web对全栈web开发的支持,包括Tomcat和spring-webmvc
spring-boot-starter-websocket对WebSocket开发的支持
spring-boot-starter-ws对Spring Web服务的支持
 
相关starter pom具体资料可以查看官网:
http://docs.spring.io/spring-boot/docs/1.4.1.RELEASE/reference/htmlsingle/#using-boot-starter
 
2. 第三方 starter pom(不常用,不做记录。)
 

三.spring Boot其他相关知识点(扩展)

https://www.jianshu.com/p/9a08417e4e84
 
推荐学习文献:JavaEE开发的颠覆者 Spring Boot实战
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: