SpringBoot
1. 配置
1)属性提示(仅在编译时调用,不会对生产产生影响)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
2)自定义属性配置
在application.properties
写入
my1.age=22
my1.name=battcn
再定义MyProperties1.java
文件,用来映射自定义在application.properties
中的内容,通过操作对象的方式获取配置文件内容
@Component
@ConfiguratonProperties(prefix="my1")
public class MyProperties1{
private int age;
private String name;
@Override
public String toString(){
return "age="+age+",name='"+name+"'";
}
}
之后定义PropertiesController
用来注入MyProperties
(Spring4.x之后推荐用构造函数的形式注入属性)
@RequestMapping("/properties")
@RestController
public class PropertiesController{
private final MyProperties1 myProperties1;
@Autowired
public PropertiesController(MyProperties1 myProperties1){
this.myProperties1 = myProperties1;
}
@GetMapping("/1")
public MyProperties1 myProperties1(){
System.out.println(myProperties1.toString());
}
}
3)自定义文件配置
自定义一个资源文件,例如名为mmm.properties
,然后再定义一个Java文件用来映射文件里的内容。
@Component
@PropertySource("classpath:mmm.properties")
@ConfigurationProperties(prefix = "前置")
//将以上注解写在Java类上即可
4)多环境化配置
在真实的应用中,常常会有多个环境(如:开发,测试,生产等),不同的环境数据库连接都不一样,这个时候就需要用到spring.profile.active
的强大功能了,它的格式为 application-{profile}.properties
,这里的 application
为前缀不能改,{profile}
是我们自己定义的。
在 application.properties
配置文件中写入 spring.profiles.active=dev
表示当前应用dev环境,会读取application-dev.properties里的配置。
2. 日志配置
Spring Boot
内部采用的是 Commons Logging
进行日志记录,但在底层为 Java Util Logging、Log4J2、Logback 等日志框架提供了默认配置 。
1)日志格式
2014-03-05 10:57:51.698 INFO 45469 --- [ost-startStop-1] o.s.b.c.e.ServletRegistrationBean : Mapping servlet: 'dispatcherServlet' to [/]
2014-03-05 10:57:51.702 INFO 45469 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
日志一般输入如下内容:
- 时间日期:精确到毫秒,可以用于排序
- 日志级别:ERROR、WARN、INFO、DEBUG、TRACE
- 进程ID
- 分隔符:采用
---
来标识日志开始部分 - 线程名:方括号括起来(可能会截断控制台输出)
- Logger名:通常使用源代码的类名
- 日志内容:我们输出的消息
2)文件保存
默认情况下,SpringBoot 仅将日志输出到控制台,不会写入到日志文件中去。若想写入到日志文件中,则需要在application.properties
设置logging.file
或者 logging.path
属性。
-
logging.file
:将日志写入到指定的文件中,默认为相对路径,可以设置成绝对路径 -
logging.path
:将名为spring.log
写入到指定的文件夹中。如(/var/log
)
日志文件在达到10MB
时进行切割,产生一个新的日志文件(如:spring.1.log
、spring.2.log
),新的日志依旧输出到spring.log
中去,默认情况下会记录error
warn
info
级别消息。
-
logging.file.max-size
:限制日志文件大小 -
logging.file.max-history
:限制日志保留天数
3. 整合Thymeleaf
模板
SpringBoot
使用模板时,默认从src/main/resources/templates
下加载。
Thymeleaf:是现代化服务器端的java模板引擎,与其他模板引擎相比,Thymeleaf的语法更接近HTML,并且具有很高的扩展性。
- 支持无网络环境下运行,由于它支持 html 原型,然后在 html 标签里增加额外的属性来达到模板+数据的展示方式。浏览器解释 html 时会忽略未定义的标签属性,所以 thymeleaf 的模板可以静态地运行;当有数据返回到页面时,Thymeleaf 标签会动态地替换掉静态内容,使页面动态显示。
- 开箱即用,为Spring提供方言,可直接套用模板实现JSTL、OGNL表达式效果。
- SpringBoot提供了可选集成模块(spring-boot-starter-thymeleaf),可以快速的实现表单绑定、属性编辑器、国际化等功能。
1)使用
首先在pom.xml
中添加对thymeleaf
模板依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
然后创建一个ThymeleafController
来映射HTTP请求与页面的跳转。
@Controller
@RequestMapping
public class ThymeleafController {
@GetMapping("/index")
public ModelAndView index(){
ModelAndView view = new ModelAndView();
//设置跳转的视图,默认映射到 src/main/resources/templates/{viewName}.html
view.setViewName("index");
//设置属性
view.addObject("title","this is title");
view.addObject("desc","this is desc");
Author author = new Author();
author.setAge(22);
author.setEmail("xxx@foxmail.com");
author.setName("John");
view.addObject("author",author);
return view;
}
class Author{
private int age;
private String name;
private String email;
//省略get set
}
}
编辑index.html
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<!-- 可以看到 thymeleaf 是通过在标签里添加额外属性来绑定动态数据的 -->
<title th:text="${title}">Title</title>
<!-- 在/resources/static/js目录下创建一个hello.js 用如下语法依赖即可-->
<script type="text/javascript" th:src="@{/js/hello.js}"></script>
</head>
<body>
<h1 th:text="${desc}">Hello World</h1>
<h2>=====作者信息=====</h2>
<p th:text="${author?.name}"></p>
<p th:text="${author?.age}"></p>
<p th:text="${author?.email}"></p>
</body>
</html>
将spring.thymeleaf.cache
属性设置为false
,修改静态内容后按 Ctrl+Shift+F9
即可重新加载。
设置网页图标:在src/main/statia
下防止一张名为favicon.ico
的图标即可
4. 使用JdbcTemplate访问数据库
Spring Framework
对数据库的操作在JDBC
上面做了深层次的封装,通过依赖注入
功能,可以将 DataSource
注册到JdbcTemplate
之中,使我们可以轻易的完成对象关系映射,并有助于规避常见的错误,在SpringBoot
中我们可以很轻松的使用它。
1)特点
- 速度快,对比其他的ORM框架而言,JDBC的方式是最快的
- 配置简单,Spring自家出品,几乎没有额外配置
- 学习成本低,JdbcTemplate更像是一个DBUtils
2)导入依赖
在pom.xml
中添加对JdbcTemplate
的依赖
<!-- Spring JDBC 的依赖包,使用 spring-boot-starter-jdbc 或 spring-boot-starter-data-jpa 将会自动获得HikariCP依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- MYSQL包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- 默认就内嵌了Tomcat 容器,如需要更换容器也极其简单-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
3)连接数据库
spring:
datasource:
url:jdbc:xxxx
username:root
password:123456
type:指定连接池
4)具体编码
表结构:
CREATE TABLE `t_user` (
`id` int(8) NOT NULL AUTO_INCREMENT COMMENT '主键自增',
`username` varchar(50) NOT NULL COMMENT '用户名',
`password` varchar(50) NOT NULL COMMENT '密码',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户表';
实体类:
public class User {
private Long id;
private String username;
private String password;
// TODO 省略get set
}
@RestController
@RequestMapping("/users")
public class SpringJdbcController {
private final JdbcTemplate jdbcTemplate;
@Autowired
public SpringJdbcController(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
@GetMapping
public List<User> queryUsers() {
// 查询所有用户
String sql = "select * from t_user";
return jdbcTemplate.query(sql, new Object[]{}, new BeanPropertyRowMapper<>(User.class));
}
@GetMapping("/{id}")
public User getUser(@PathVariable Long id) {
// 根据主键ID查询
String sql = "select * from t_user where id = ?";
return jdbcTemplate.queryForObject(sql, new Object[]{id}, new BeanPropertyRowMapper<>(User.class));
}
@DeleteMapping("/{id}")
public int delUser(@PathVariable Long id) {
// 根据主键ID删除用户信息
String sql = "DELETE FROM t_user WHERE id = ?";
return jdbcTemplate.update(sql, id);
}
@PostMapping
public int addUser(@RequestBody User user) {
// 添加用户
String sql = "insert into t_user(username, password) values(?, ?)";
return jdbcTemplate.update(sql, user.getUsername(), user.getPassword());
}
@PutMapping("/{id}")
public int editUser(@PathVariable Long id, @RequestBody User user) {
// 根据主键ID修改用户信息
String sql = "UPDATE t_user SET username = ? ,password = ? WHERE id = ?";
return jdbcTemplate.update(sql, user.getUsername(), user.getPassword(), id);
}
}
5. 整合SpringDataJPA
JPA:Java Persistence API,java持久层API
- ORM映射源数据:支持XML和注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中
- API:操作实体对象来执行CRUD操作,框架在后台替我们完成所有的事情,开发者从繁琐的JDBC和SQL代码中解放出来
- 查询语言:通过面向对象而非面向数据库的查询语言查询数据,避免程序的SQL语句紧密耦合
1)导入依赖
在 pom.xml
中添加 spring-boot-starter-data-jpa
的依赖
<!-- Spring JDBC 的依赖包,使用 spring-boot-starter-jdbc 或 spring-boot-starter-data-jpa 将会自动获得HikariCP依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- MYSQL包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- 默认就内嵌了Tomcat 容器,如需要更换容器也极其简单-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 测试包,当我们使用 mvn package 的时候该包并不会被打入,因为它的生命周期只在 test 之内-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
2)连接数据库
在 application.properties
中添加如下配置
spring.datasource.url=jdbc:mysql://localhost:3306/chapter5?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&useSSL=false
spring.datasource.password=root
spring.datasource.username=root
#spring.datasource.type
# JPA配置
spring.jpa.hibernate.ddl-auto=update
# 输出日志
spring.jpa.show-sql=true
# 数据库类型
spring.jpa.database=mysql
ddl-auto 几种属性
- create: 每次运行程序时,都会重新创建表,故而数据会丢失
- create-drop: 每次运行程序时会先创建表结构,然后待程序结束时清空表
- upadte: 每次运行程序,没有表时会创建表,如果对象发生改变会更新表结构,原有数据不会清空,只会更新(推荐使用)
- validate: 运行程序会校验数据与数据库的字段类型是否相同,字段不同会报错
常见自增策略:
- TABLE: 使用一个特定的数据库表格来保存主键
- SEQUENCE: 根据底层数据库的序列来生成主键,条件是数据库支持序列。这个值要与generator一起使用,generator 指定生成主键使用的生成器(可能是orcale中自己编写的序列)。
- IDENTITY: 主键由数据库自动生成(主要是支持自动增长的数据库,如mysql)
- AUTO: 主键由程序控制,也是GenerationType的默认值。
@Entity(name = "t_user")
public class User implements Serializable {
private static final long serialVersionUID = 8655851615465363473L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)//自增策略
private Long id;
private String username;
private String password;
/**
* TODO 忽略该字段的映射
*/
@Transient
private String email;
// TODO 省略get set
}
Repository
创建UserRepository数据访问层接口,需要继承 JpaRepository<T,K>,第一个泛型是实体对象名称,第二个是主键类型。
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
/**
* 根据用户名查询用户信息
*
* @param username 用户名
* @return 查询结果
*/
List<User> findAllByUsername(String username);
}