1. 什么是springboot
springboot可以完全不适用xml,而使用约定大于配置的方式来快速的启动项目,可以不通过xml来集成ORM框架,Springdata、Mybatis等。
springboot集成了tomcat,在打包web项目的时候,可以直接打成jar包,而且不需要在环境中安装tomcat,而只需要java环境,就可以用启动jar包的方式来启动web项目。
springboot快速部署和开发的特性,是它可以快速的和spring家族的Springcloud各组件快速的组合。
2. springboot项目初始化
springboot项目可以在线生成:通过网站http://start.spring.io/
可以在网站选择maven或者gradle工程,选择springboot版本。设置Group和Artifact值,还可以设置maven依赖项目,比如web和JPA依赖,当然这些依赖也可以后期项目需要再加入所需的maven依赖。填好项目的各种属性可以点击Generate Project生成并下载springboot工程,也可以利用付费版的idea来生成。
选择Spring Initializr,然后跟网站差不多一步一步选择就能生成项目了。
3. 简单的项目工程搭建
数据库设计:首先设计一个简单的数据库表
配置maven pom.xml文件,需要配置 web mysql jpa的相关dependency
<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.zjb.learning.springcloud</groupId>
<artifactId>learning-springboot-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>learning-springboot-demo</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.8.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
3.配置工程文件application.yml。springboot可以通过yml文件进行一些属性配置来代替properties文件。设置数据库连接,工程根目录
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
username: root
password: 123456
url: jdbc:mysql://localhost:3306/springboot_learning?characterEncoding=utf-8&useSSL=false
server:
context-path: /userCentre
4.根据数据库表的设计来设计域对象
package com.zjb.learning.springcloud.learningspringbootdemo.domain;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import java.util.Date;
/**
* @author zjb
* @date 2017/10/29.
*/
@Entity
@Table(name = "user_info")
public class User {
@Id
@GeneratedValue
private Integer id;
private String userId;
private String userName;
private String userAddress;
private Integer deleted;
private Date createTime;
private Date modifyTime;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserAddress() {
return userAddress;
}
public void setUserAddress(String userAddress) {
this.userAddress = userAddress;
}
public Integer getDeleted() {
return deleted;
}
public void setDeleted(Integer deleted) {
this.deleted = deleted;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public Date getModifyTime() {
return modifyTime;
}
public void setModifyTime(Date modifyTime) {
this.modifyTime = modifyTime;
}
}
@Entity来和数据库关联,这里预定大于配置,域对象命名以驼峰的方式,而数据库用_的方式,域对象的属性和数据库字段名一一对应。同样,域对象名和数据库名一一对应,当预定不能对应时可以通过@Table来进行设置。
5.repository类设置:本例中通过spring-data-jpa来完成对数据库的操作,有图jap操作是继承JpaRepository来实现的,因此本例子中的repository其实就是SSM开发中的dao层。
public interface UserRepository extends JpaRepository<User, Integer> {
}
申明接口UserRepository继承JpaRepository接口,接口的泛型为Entity类型已经Entity的主键类型,Jpa也是基于约定大于配置的方式,比如查询一个实体对象可以通过申明findOne(Integer id)这种方式来操作数据库,jpa会自动生成sql。而JpaRepository接口中已经声明了findOne这个方法,因此对于Jpa这种操作数据库的方式,一些简单的操作并不需要声明函数
6.service层:service层主要是接口和实现类两个service
public interface UserService {
User findOneById(Integer id);
}
package com.zjb.learning.springcloud.learningspringbootdemo.service.impl;
import com.zjb.learning.springcloud.learningspringbootdemo.domain.User;
import com.zjb.learning.springcloud.learningspringbootdemo.repository.UserRepository;
import com.zjb.learning.springcloud.learningspringbootdemo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* @author zjb
* @date 2017/10/29.
*/
@Service
public class UserServiceImpl implements UserService{
@Autowired
private UserRepository userRepository;
@Override
public User findOneById(Integer id) {
return userRepository.findOne(id);
}
}
7.最后是controller
package com.zjb.learning.springcloud.learningspringbootdemo.controller;
import com.google.gson.Gson;
import com.zjb.learning.springcloud.learningspringbootdemo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author zjb
* @date 2017/10/29.
*/
@RestController
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/user/{id}")
public String findOneById(@PathVariable Integer id){
Gson gson = new Gson();
return gson.toJson(userService.findOneById(id));
}
}
编写代码完成之后利用maven打包,运行jar包,浏览器通过get请求返回查找的数据库信息结果如下
4.总结
简单的工程这样就搭建起来了,有了这个简单的工程之后,就可以增加一些其他的功能,从最简单的增删改查,到后面的加入复杂逻辑,都可以在这样的基础上进行开发