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

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


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服务器,当你启动SpringBoot应用的时候,内置的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)        @EnableAutoConfigurationSpring Boot 根据类路径中的jar包依赖为当前项目进行自动配置。简单来说,以前我们都是通过手动集成各种xml配置文件,然后在WEB-INF下的web.xml手动填写一下配置的位置来注册。而Spring Boot通过这个简单的注解让这一切都给你自动配置好了,是不是很贴心。

例如:添加了spring-boot-starter-web依赖,会自动添加TomcatSpring MVC的依赖,那么Spring Boot会对TomcatSpring 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-jpaspring-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实战



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值