Java|Java Maven+Idea 构建SpringBoot项目(光速入门)

  • springboot+jpa+druid构建Restful服务
  • springboot官网
  • maven 创建项目
mvn archetype:generate -DgroupId=com.mico.emptyspringboot -DartifactId=emptyspringboot -DarchetypeArtifactId=maven-archetype-quickstart -DinteractivMode=false

  • 当然你可以从springboot的官网下载quickstart,也可以从intelij idea的File->New->Project->Spring Initializr
    Java|Java Maven+Idea 构建SpringBoot项目(光速入门)
    文章图片
    Spring Initializr
    Java|Java Maven+Idea 构建SpringBoot项目(光速入门)
    文章图片
    springboot-start
  • pom.xml大概像这样:
4.0.0org.springframework.boot spring-boot-starter-parent 2.1.2.RELEASE com.mico.domo.springboot demo 0.0.1-SNAPSHOT demo Demo project for Spring Boot1.8 org.springframework.boot spring-boot-starter-data-jpa org.springframework.boot spring-boot-starter-web mysql mysql-connector-java runtime org.projectlombok lombok true com.alibaba druid 1.0.18 org.slf4j log4j-over-slf4j org.springframework.boot spring-boot-starter-test test org.springframework.boot spring-boot-maven-plugin

  • 本地已创建项目push到远程git
  • springboot的配置文件application.properties
# Server Domain-Port server.address=127.0.0.1 server.port=9090#spring-datasource spring.datasource.type=com.alibaba.druid.pool.DruidDataSource spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8&useSSL=true spring.datasource.username=root spring.datasource.password=micocube spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver spring.datasource.initialSize=5 spring.datasource.minIdle=5 spring.datasource.maxActive=20 spring.datasource.maxWait=60000 spring.datasource.timeBetweenEvictionRunsMillis=60000 spring.datasource.minEvictableIdleTimeMillis=300000 spring.datasource.validationQuery=SELECT 1 FROM DUAL spring.datasource.testWhileIdle=true spring.datasource.testOnBorrow=false spring.datasource.testOnReturn=false spring.datasource.poolPreparedStatements=true spring.datasource.maxPoolPreparedStatementPerConnectionSize=20 spring.datasource.filters=stat,wall,log4j spring.datasource.connectionProperties=druid.stat.mergeSql=true; druid.stat.slowSqlMillis=5000 spring.datasource.useGlobalDataSourceStat=true #JPA Configuration: spring.jpa.database=MYSQL # Show or not log for each sql query spring.jpa.show-sql=true spring.jpa.generate-ddl=true # Hibernate ddl auto (create, create-drop, update) spring.jpa.hibernate.ddl-auto=update#log logging.config=classpath:logback.xml LOG_PATH=./logs/coding.log#encoding spring.http.encoding.force=true spring.http.encoding.charset=UTF-8 spring.http.encoding.enabled=true server.tomcat.uri-encoding=UTF-8

  • springboot日志配置文件,logback.xml,Springboot logback.xml配置文件详解,
    Springboot 使用druid连接池抛ClassNotFoundException
/data/www/file/logs/springboot.log%date %d{HH: mm:ss.SSS} %level [%thread] %logger{10} [%file:%line] %msg%n %date %d{HH: mm:ss.SSS} %level [%thread] %logger{10} [%file:%line] %msg%n

  • springboot启动类Application.java
package com.mico.domo.springboot.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class DemoApplication {public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); }}

  • 数据源配置
package com.mico.emptyspringboot.config; import com.alibaba.druid.pool.DruidDataSource; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import javax.sql.DataSource; import java.sql.SQLException; /** * DruidDBConfig类被@Configuration标注,用作配置信息; * DataSource对象被@Bean声明,为Spring容器所管理, * @Primary表示这里定义的DataSource将覆盖其他来源的DataSource。 *jdbc.url=${jdbc.url} *最新的支持方式如下: *jdbc.url=@jdbc.url@ */ @Configuration public class DruidDBConfig { //private Logger logger = LoggerFactory.getLogger(DruidDBConfig.class); @Value("${spring.datasource.url}") private String dbUrl; @Value("${spring.datasource.username}") private String username; @Value("${spring.datasource.password}") private String password; @Value("${spring.datasource.driverClassName}") private String driverClassName; @Value("${spring.datasource.initialSize}") private int initialSize; @Value("${spring.datasource.minIdle}") private int minIdle; @Value("${spring.datasource.maxActive}") private int maxActive; @Value("${spring.datasource.maxWait}") private int maxWait; @Value("${spring.datasource.timeBetweenEvictionRunsMillis}") private int timeBetweenEvictionRunsMillis; @Value("${spring.datasource.minEvictableIdleTimeMillis}") private int minEvictableIdleTimeMillis; @Value("${spring.datasource.validationQuery}") private String validationQuery; @Value("${spring.datasource.testWhileIdle}") private boolean testWhileIdle; @Value("${spring.datasource.testOnBorrow}") private boolean testOnBorrow; @Value("${spring.datasource.testOnReturn}") private boolean testOnReturn; @Value("${spring.datasource.poolPreparedStatements}") private boolean poolPreparedStatements; @Value("${spring.datasource.maxPoolPreparedStatementPerConnectionSize}") private int maxPoolPreparedStatementPerConnectionSize; @Value("${spring.datasource.filters}") private String filters; @Value("{spring.datasource.connectionProperties}") private String connectionProperties; @Bean // 声明其为Bean实例 @Primary // 在同样的DataSource中,首先使用被标注的DataSource public DataSource dataSource() { DruidDataSource datasource = new DruidDataSource(); datasource.setUrl(this.dbUrl); datasource.setUsername(username); datasource.setPassword(password); datasource.setDriverClassName(driverClassName); // configuration datasource.setInitialSize(initialSize); datasource.setMinIdle(minIdle); datasource.setMaxActive(maxActive); datasource.setMaxWait(maxWait); datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis); datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis); datasource.setValidationQuery(validationQuery); datasource.setTestWhileIdle(testWhileIdle); datasource.setTestOnBorrow(testOnBorrow); datasource.setTestOnReturn(testOnReturn); datasource.setPoolPreparedStatements(poolPreparedStatements); datasource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize); try { datasource.setFilters(filters); } catch (SQLException e) {} datasource.setConnectionProperties(connectionProperties); return datasource; } }

  • App 配置类,WebAppConfigurer
package com.mico.emptyspringboot.config; import org.springframework.boot.web.servlet.MultipartConfigFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.StringHttpMessageConverter; import org.springframework.util.unit.DataSize; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import javax.servlet.MultipartConfigElement; import java.nio.charset.Charset; /** * 访问uri:http://localhost:9090/swagger-ui.html */ @Configuration public class WebAppConfigurer implements WebMvcConfigurer {@Override public void addViewControllers(ViewControllerRegistry registry) { registry.addViewController("/sign_in").setViewName("thymeleaf/login"); registry.addViewController("/sign_up").setViewName("thymeleaf/registry"); /** * 与上面的等效 @RequestMapping("/sign_in") public String sign_in() { return "thymeleaf/login"; } @RequestMapping("/sign_up") public String sign_up() { return "thymeleaf/registry"; } */ }@Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/"); }@Bean public MultipartConfigElement multipartConfigElement(){ MultipartConfigFactory factory = new MultipartConfigFactory(); factory.setMaxFileSize(DataSize.ofMegabytes(10)); factory.setMaxRequestSize(DataSize.ofMegabytes(10)); return factory.createMultipartConfig(); }@Bean public HttpMessageConverter responseBodyConverter() { StringHttpMessageConverter converter = new StringHttpMessageConverter(Charset.forName("UTF-8")); return converter; } }

  • domain
package com.mico.domo.springboot.demo.domain; import lombok.Data; import javax.persistence.*; @Entity @Table @Data public class Role {@Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; private String name; public Role(){}public Role(String name) { this.name = name; } }

package com.mico.domo.springboot.demo.domain; import lombok.Data; import javax.persistence.*; import java.util.List; @Entity @Table @Data public class User {@Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; private String username; private String password; @ManyToMany(cascade = {CascadeType.REFRESH},fetch = FetchType.EAGER) private List roles; public User() { }public User(String username, String password) { this.username = username; this.password = password; } }

  • DAO
package com.mico.domo.springboot.demo.repository; import com.mico.domo.springboot.demo.domain.User; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; public interface UserRepository extends JpaRepository {User findByUsername(String name); @Query(value = "https://www.it610.com/article/FROM User u where u.username=:name") User findUser(@Param("name") String name); }

  • Service
package com.mico.domo.springboot.demo.service; import com.mico.domo.springboot.demo.domain.User; import com.mico.domo.springboot.demo.repository.UserRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.List; import java.util.Objects; @Service public class UserDetailsService {@Autowired private UserRepository userRepository; public User loadUserByUsername(String s) { return userRepository.findByUsername(s); } }

  • Controller
package com.mico.domo.springboot.demo.controller; import com.mico.domo.springboot.demo.domain.User; import com.mico.domo.springboot.demo.service.UserDetailsService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; @RestController @RequestMapping("/user") public class UserController { @Autowired private UserDetailsService userDetailsService; @RequestMapping(value = "https://www.it610.com/{id}",method = RequestMethod.GET) @ResponseBody public User view(@PathVariable("id") Integer id) { User user = new User(); user.setId(id); user.setUsername("zhang"); return user; } @RequestMapping(value = "https://www.it610.com/login") @ResponseBody public User login(String userName, String password) { User user = userDetailsService.loadUserByUsername(userName); return user; } }

  • spring.jpa.hibernate.ddl-auto=update时jpa会自动创建数据库,插入数据
INSERT INTO test.role (id,name) VALUES (1,'User'); INSERT INTO test.user (id,username, password) VALUES (1,'root', '$2a$10$TeayMIrpuDwrpLHL5QsNpOcPeE/Kx3c4UYbi4NQzNkfKgf9YtL6F2'); INSERT INTO test.user_roles (user_id, roles_id) VALUES (1, 1);

  • 【Java|Java Maven+Idea 构建SpringBoot项目(光速入门)】Run DemoApplication.main会从9090端口启动服务

    Java|Java Maven+Idea 构建SpringBoot项目(光速入门)
    文章图片
    最终效果
  • 项目源码

    推荐阅读