初始准备
本文项目将基于Spring Boot(一)快速开始的项目继续搭建
项目结构
之前的项目结构如下图所示
本文构建项目目录结构如下图所示
配置文件
依赖文件pom.xml
<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>cn.edu.cqu</groupId>
<artifactId>SpringBootDemo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.2.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
<scope>true</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<!-- 没有该配置,devtools 不生效 -->
<fork>true</fork>
</configuration>
</plugin>
</plugins>
</build>
</project>
依赖配置文件application.properties
##########################################
###datasource--指定mysql数据库连接信息
###spring.datasource.url:mysql地址
###spring.datasource.user:数据库用户名
###spring.datasource.password:数据库密码
###spring.datasource.driverClassName:对应数据库驱动
###spring.datasource.max-active:指定连接池中最大的活跃连接数
###spring.datasource.max-idle:指定连接池最大的空闲连接数量.
###spring.datasource.min-idle:指定必须保持连接的最小值(For DBCP and Tomcat connection pools)
###spring.datasource.initial-size:指定启动连接池时,初始建立的连接数量
###
###其他信息总结:
###spring.dao.exceptiontranslation.enabled是否开启PersistenceExceptionTranslationPostProcessor,默认为true
###spring.datasource.abandon-when-percentage-full设定超时被废弃的连接占到多少比例时要被关闭或上报
###spring.datasource.allow-pool-suspension使用Hikari pool时,是否允许连接池暂停,默认为: false
###spring.datasource.alternate-username-allowed是否允许替代的用户名.
###spring.datasource.auto-commit指定updates是否自动提交.
###spring.datasource.catalog指定默认的catalog.
###spring.datasource.commit-on-return设置当连接被归还时,是否要提交所有还未完成的事务
###spring.datasource.connection-init-sql指定连接被创建,再被添加到连接池之前执行的sql.
###spring.datasource.connection-init-sqls使用DBCP connection pool时,指定初始化时要执行的sql
###spring.datasource.connection-properties.[key]在使用DBCP connection pool时指定要配置的属性
###spring.datasource.connection-test-query指定校验连接合法性执行的sql语句
###spring.datasource.connection-timeout指定连接的超时时间,毫秒单位.
###spring.datasource.continue-on-error在初始化数据库时,遇到错误是否继续,默认false
###spring.datasource.data指定Data (DML)脚本
###spring.datasource.data-source-class-name指定数据源的全限定名.
###spring.datasource.data-source-jndi指定jndi的地址
###spring.datasource.data-source-properties.[key]使用Hikari connection pool时,指定要设置的属性
###spring.datasource.db-properties使用Tomcat connection pool,指定要设置的属性
###spring.datasource.default-auto-commit是否自动提交.
###spring.datasource.default-catalog指定连接默认的catalog.
###spring.datasource.default-read-only是否设置默认连接只读.
###spring.datasource.default-transaction-isolation指定连接的事务的默认隔离级别.
###spring.datasource.driver-class-name指定driver的类名,默认从jdbc url中自动探测.
###spring.datasource.fair-queue是否采用FIFO返回连接.
###spring.datasource.health-check-properties.[key]使用Hikari connection pool时,在心跳检查时传递的属性
###spring.datasource.idle-timeout指定连接多久没被使用时,被设置为空闲,默认为10ms
###spring.datasource.ignore-exception-on-pre-load当初始化连接池时,是否忽略异常.
###spring.datasource.init-sql当连接创建时,执行的sql
###spring.datasource.initial-size指定启动连接池时,初始建立的连接数量
###spring.datasource.initialization-fail-fast当创建连接池时,没法创建指定最小连接数量是否抛异常
###spring.datasource.initialize指定初始化数据源,是否用data.sql来初始化,默认: true
###spring.datasource.isolate-internal-queries指定内部查询是否要被隔离,默认为false
###spring.datasource.jdbc-interceptors使用Tomcat connection pool时,指定jdbc拦截器,分号分隔
###spring.datasource.jdbc-url指定JDBC URL.
###spring.datasource.jmx-enabled是否开启JMX,默认为: false
###spring.datasource.jndi-name指定jndi的名称.
###spring.datasource.leak-detection-threshold使用Hikari connection pool时,多少毫秒检测一次连接泄露.
###spring.datasource.log-abandoned使用DBCP connection pool,是否追踪废弃statement或连接,默认为: false
###spring.datasource.log-validation-errors当使用Tomcat connection pool是否打印校验错误.
###spring.datasource.login-timeout指定连接数据库的超时时间.
###spring.datasource.max-age指定连接池中连接的最大年龄
###spring.datasource.max-lifetime指定连接池中连接的最大生存时间,毫秒单位.
###spring.datasource.max-open-prepared-statements指定最大的打开的prepared statements数量.
###spring.datasource.max-wait指定连接池等待连接返回的最大等待时间,毫秒单位.
###spring.datasource.maximum-pool-size指定连接池最大的连接数,包括使用中的和空闲的连接.
###spring.datasource.min-evictable-idle-time-millis指定一个空闲连接最少空闲多久后可被清除.
###spring.datasource.min-idle指定必须保持连接的最小值(For DBCP and Tomcat connection pools)
###spring.datasource.minimum-idle指定连接维护的最小空闲连接数,当使用HikariCP时指定.
###spring.datasource.name指定数据源名.
###spring.datasource.num-tests-per-eviction-run指定运行每个idle object evictor线程时的对象数量
###spring.datasource.password指定数据库密码.
###spring.datasource.platform指定schema要使用的Platform(schema-${platform}.sql),默认为: all
###spring.datasource.pool-name指定连接池名字.
###spring.datasource.pool-prepared-statements指定是否池化statements.
###spring.datasource.propagate-interrupt-state在等待连接时,如果线程被中断,是否传播中断状态.
###spring.datasource.read-only当使用Hikari connection pool时,是否标记数据源只读
###spring.datasource.register-mbeans指定Hikari connection pool是否注册JMX MBeans.
###spring.datasource.remove-abandoned指定当连接超过废弃超时时间时,是否立刻删除该连接.
###spring.datasource.remove-abandoned-timeout指定连接应该被废弃的时间.
###spring.datasource.rollback-on-return在归还连接时,是否回滚等待中的事务.
###spring.datasource.schema指定Schema (DDL)脚本.
###spring.datasource.separator指定初始化脚本的语句分隔符,默认: ;
###spring.datasource.sql-script-encoding指定SQL scripts编码.
###spring.datasource.suspect-timeout指定打印废弃连接前的超时时间.
###spring.datasource.test-on-borrow当从连接池借用连接时,是否测试该连接.
###spring.datasource.test-on-connect创建时,是否测试连接
###spring.datasource.test-on-return在连接归还到连接池时是否测试该连接.
###spring.datasource.test-while-idle当连接空闲时,是否执行连接测试.
###spring.datasource.time-between-eviction-runs-millis指定空闲连接检查、废弃连接清理、空闲连接池大小调整之间的操作时间间隔
###spring.datasource.transaction-isolation指定事务隔离级别,使用Hikari connection pool时指定
###spring.datasource.url指定JDBC URL.
###spring.datasource.use-disposable-connection-facade是否对连接进行包装,防止连接关闭之后被使用.
###spring.datasource.use-equals比较方法名时是否使用String.equals()替换==.
###spring.datasource.use-lock是否对连接操作加锁
###spring.datasource.username指定数据库名.
###spring.datasource.validation-interval指定多少ms执行一次连接校验.
###spring.datasource.validation-query指定获取连接时连接校验的sql查询语句.
###spring.datasource.validation-query-timeout指定连接校验查询的超时时间.
###spring.datasource.validation-timeout设定连接校验的超时时间,当使用Hikari connection pool时指定
###spring.datasource.validator-class-name用来测试查询的validator全限定名.
###spring.datasource.xa.data-source-class-name指定数据源的全限定名.
###spring.datasource.xa.properties指定传递给XA data source的属性
###spring.datasource.url=jdbc:mysql://localhost:3306/test?user=root&password=root&useUnicode=true&characterEncoding=UTF8
##########################################
spring.datasource.url=jdbc:mysql://localhost:3306/testdatabase?useUnicode=true&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.max-active=20
spring.datasource.max-idle=8
spring.datasource.min-idle=8
spring.datasource.initial-size=10
##########################################
##SPring JPA配置信息
###spring.jpa.database指定目标数据库.
###spring.jps.show-sq:是否显示sql语句
###spring.jpa.hibernate.ddl-auto指定DDL mode (none, validate, update, create, create-drop). 当使用内嵌数据库时,默认是create-drop,否则为none.
###spring.jpa.hibernate.naming-strategy指定命名策略.
###其他:
###spring.jpa.database-platform指定目标数据库的类型.
###spring.jpa.generate-ddl是否在启动时初始化schema,默认为false
###spring.jpa.hibernate.ddl-auto指定DDL mode (none, validate, update, create, create-drop). 当使用内嵌数据库时,默认是create-drop,否则为none.
###spring.jpa.hibernate.naming-strategy指定命名策略.
###spring.jpa.open-in-view是否注册OpenEntityManagerInViewInterceptor,绑定JPA EntityManager到请求线程中,默认为: true
###spring.jpa.properties添加额外的属性到JPA provider.
###spring.jpa.show-sql是否开启sql的log,默认为: false
##########################################
spring.jpa.database = MYSQL
spring.jpa.show-sql = true
spring.jpa.hibernate.ddl-auto = update
spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
spring.freemarker.charset=UTF-8
创建数据库
创建testdatabase数据库
实体类
这里使用hibernate的自动建表功能
package app.domain;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name="info")
public class BaseInfo {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
private String info;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
}
Jpa查询接口
最基本的增删查改不需要sql语句,也可以自定查询语句
package app.repositoty;
import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import app.domain.BaseInfo;
@Repository
public interface InfoRepositoty extends JpaRepository<BaseInfo, Long> {
//最基本的增删查改不需要sql语句,也可以自定查询语句
/*
* 根据info查询
*/
@Modifying
@Query("select b from BaseInfo b where b.info = :info")
public List<BaseInfo> getByInfo(@Param("info") String info);
}
Service接口和Service实现
Service接口
package app.service;
import java.util.List;
import javax.transaction.Transactional;
import app.domain.BaseInfo;
public interface SampleService {
public void addInfo(BaseInfo baseInfo);
public List<BaseInfo> getByInfo(String info);
}
Service实现
package app.service.Imp;
import java.util.List;
import javax.transaction.Transactional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import app.domain.BaseInfo;
import app.repositoty.InfoRepositoty;
import app.service.SampleService;
@Service
public class SampleServiceImp implements SampleService {
@Autowired
private InfoRepositoty infoRepositoty;
@Override
@Transactional
public void addInfo(BaseInfo baseInfo){
infoRepositoty.save(baseInfo);
}
//查询数据
@Override
@Transactional
public List<BaseInfo> getByInfo(String info) {
return infoRepositoty.getByInfo(info);
}
//删除数据
@Transactional
public void delete(Long id) {
infoRepositoty.deleteById(id);
}
}
Controller
SampleController在上一篇文章中已有,本文主要是使用InfoController 的功能
package app.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import app.domain.BaseInfo;
import app.repositoty.InfoRepositoty;
import app.service.SampleService;
@RestController
@EnableAutoConfiguration
public class InfoController {
@Autowired
private SampleService sampleService;
@RequestMapping("/addInfo")
public BaseInfo addInfo(@RequestParam(value = "info")String info) {
BaseInfo bInfo = new BaseInfo();
bInfo.setInfo(info);
sampleService.addInfo(bInfo);
return bInfo;
}
@RequestMapping("/getInfo")
public List<BaseInfo> getInfo(@RequestParam(value = "info")String info) {
List<BaseInfo> aBaseInfos = sampleService.getByInfo(info);
return aBaseInfos;
}
}
Application启动应用
package app;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
System.out.println("Hello World!");
SpringApplication.run(Application.class, args);
}
}
在这个java文件中右键 Run as -> Java Application。当看到 “FrameworkServlet ‘dispatcherServlet’: initialization completed in xx ms” 字样说明启动成功。
打开浏览器访问 http://localhost:8080/addInfo?info=qwe,结果如下:
之后访问http://localhost:8080/getInfo?info=qwe可以看到数据已经查询到了
项目可在GitHub上下载https://github.com/tripleHu/SpringBootDemo