** 快速开发框架_SpringBoot* [day04] *
课程目标
- 能够理解Spring的优缺点
- 能够理解SpringBoot的特点
- 能够理解SpringBoot的核心功能
- 能够搭建SpringBoot的环境
- 能够完成application.properties配置文件的配置
- 能够完成application.yml配置文件的配置
- 能够使用SpringBoot集成Mybatis
- 能够使用SpringBoot集成Junit
- 能够使用SpringBoot集成SpringData JPA
SpringBoot简介
-
原有Spring优缺点分析
- 优点分析:
- Spring是Java企业版(Java Enterprise Edition,JEE,也称J2EE)的轻量级代替品。无需开发重量级的
Enterprise JavaBean(EJB)
,Spring为企业级Java开发提供了一种相对简单的方法,通过依赖注入和面向切面编程,用简单的Java对象(Plain Old Java Object,POJO)实现了EJB的功能 - 简单来说:
- 在原来基础上提高了开发效率
- 使用简单的面向对象实现了EJB的功能
- 组件上轻量级的替代品
- Spring是Java企业版(Java Enterprise Edition,JEE,也称J2EE)的轻量级代替品。无需开发重量级的
- 缺点分析:
- 配置上重量级,延长了开发损耗
- 依赖管理繁琐,容易产生版本不兼容
- 优点分析:
-
SpringBoot的如何解决的?
- SpringBoot对上述Spring的缺点进行的改善和优化,基于
约定优于配置
的思想,可以让开发人员不必在配置与逻辑业务之间进行思维的切换,全身心的投入到逻辑业务的代码编写中,从而大大提高了开发的效率,一定程度上缩短了项目周期。
- SpringBoot对上述Spring的缺点进行的改善和优化,基于
-
SpringBoot的特点?
- 为基于Spring的开发提供
更快的入门体验
2.开箱即用
,没有代码生成,也无需XML配置。同时也可以修改默认值来满足特定的需求 - 提供了一些大型项目中常见的
非功能性特性
,如嵌入式服务器、安全、指标,健康检测、外部配置等 - SpringBoot不是对Spring功能上的增强,而是提供了一种
快速使用Spring
的方式
- 为基于Spring的开发提供
-
SpringBoot的核心功能?
-
起步依赖
- 起步依赖本质上是一个Maven项目对象模型(Project Object Model,POM),定义了对其他库的传递依赖,这些东西加在一起即支持某项功能。
- 简单的说,起步依赖就是将具备某种功能的坐标打包到一起,并提供一些默认的功能。
-
自动配置
- Spring Boot的自动配置是一个运行时(更准确地说,是应用程序启动时)的过程,考虑了众多因素,才决定
- Spring配置应该用哪个,不该用哪个。该过程是Spring自动完成的。
-
起步依赖
-
springBoot原理分析:
-
spring-boot-starter-parent:
- 在它的里面加载了自带的配置文件和引入的内置文件;[引入配置文件]
- 继承了spring-boot-dependencies,在dependencies里面引入了一些maven工程的一些常用包;[引入包,解决了版本依赖]
-
spring-boot-starter-web:
- 引入了web应用所需要的一些jar包依赖,也解决了版本冲突 [依赖传递,依赖打包功能]
-
@SpringBootApplication:
- 它是一个引导类的注解,被使用后将会自动加载配置;
-
-
首先springboot已经默认设置了一些参数(如tomcat端口:8080)[类:spring-configuration-metadata.json]
如图示: -
它通过引入注解等方式传递参数,再通过AutoConfiguration自动加载,再引入进@SpringBootApplication
-
如果有修改参数,它里面将进行自动覆盖[include标签内进行覆盖]; 图示是配置要扫描的地方,如果该地方有相关覆盖参数,就会执行覆盖;
如图示:)
-
-
引入的覆盖文件也有优先级:
- properties->yaml->yml 因为yml和yaml会先执行,所以会容易被properties覆盖掉,所以需要注意;
-
入门解析
1. SpringBoot注解解析:
1. @SpringBootApplication:标注SpringBoot的启动类,该注解具备多种功能(后面详细剖析)
2. SpringApplication.run(MySpringBootApplication.class) 代表运行SpringBoot的启动类,参数为SpringBoot启动类的字节码对象
2. 热部署:
1. 概念:
* 我们在开发中反复修改类、页面等资源,每次修改后都是需要重新启动才生效,这样每次启动都很麻烦,浪费了大量的时间,我们可以在修改代码后不重启就能生效,在 pom.xml 中添加如下配置就可以实现这样的功能,我们称之为热部署。
2. 热部署操作步骤:
1. pom.xml:
~~~java
<!--热部署配置-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
3. 注意:IDEA进行SpringBoot热部署失败:
使用idea快速创建项目
-
我们可以使用idea自带的 Spring Initializr 快速创建项目,在选择URL中如果报错将Default改为Custom,将https变为http;
-
步骤如下:
-
下一步:
-
这三个文件是可以删除的:
原理总结:
1. 从spring-boot-starter-dependencies的pom.xml中我们可以发现,一部分坐标的版本、依赖管理、插件管理已经定义好,所以我们的SpringBoot工程继承spring-boot-starter-parent后已经具备版本锁定等配置了。所以起步依赖的作用就是进行`依赖的传递`。
2. 从spring-boot-starter-web的pom.xml中我们可以发现,spring-boot-starter-web就是将web开发要使用的spring-web、spring-webmvc等坐标进行了“打包”,这样我们的工程只要引入spring-boot-starter-web起步依赖的坐标就可以进行web开发了,同样体现了依赖传递的作用。
3. 注解释义:
@SpringBootConfiguration:等同与@Configuration,既标注该类是Spring的一个配置类
@EnableAutoConfiguration:SpringBoot自动配置功能开启
~~~
## SpringBoot的配置文件
1. SpringBoot是基于约定的,所以很多配置都有默认值,但如果想使用自己的配置替换默认配置的话,就可以使用application.properties或者application.yml(application.yaml)进行配置。
2. SpringBoot默认会从Resources目录下加载application.properties或application.yml(application.yaml)文件。
3. 其中,application.properties文件是键值对类型的文件,之前一直在使用,所以此处不在对properties文件的格式进行阐述。除了properties文件外,SpringBoot还可以使用yml文件进行配置,下面对yml文件进行讲解。
4. yml配置文件简介
* YML文件格式是YAML (YAML Aint Markup Language)编写的文件格式,YAML是一种直观的能够被电脑识别的的数据数据序列化格式,并且容易被人类阅读,容易和脚本语言交互的,可以被支持YAML库的不同的编程语言程序导入,比如: C/C++, Ruby, Python, Java, Perl, C#, PHP等。YML文件是以数据为核心的,比传统的xml方式更加简洁。
* YML文件的扩展名可以使用.yml或者.yaml。
5. 语法:[value之前必须有一个空格,一定要注意!]
~~~java
1. 配置普通数据:
1. 语法: key: value
2. 示例代码:
name: haohao
2. 配置对象数据
1. 语法:
key:
key1: value1
key2: value2
或者:
key: {key1: value1,key2: value2}
2. 示例代码:
person:
name: haohao
age: 31
addr: beijing
#或者
person: {name: haohao,age: 31,addr: beijing}
3. 注意: key1前面的空格个数不限定,在yml语法中,相同缩进代表同一个级别
3. 配置Map数据
同上面对象写法
4. 配置数组(List、Set)数据
1. 语法:
key:
-value1
-value2
或者:
key:[value1,value2]
2. 示例代码:
city:
- beijing
- tianjin
- shanghai
- chongqing
#或者
city: [beijing,tianjin,shanghai,chongqing]
#集合中的元素是对象形式
student:
- name: zhangsan
age: 18
score: 100
- name: lisi
age: 28
score: 88
- name: wangwu
age: 38
score: 90
3. 注意: value与之间的- 之间存在一个空格
SpringBoot配置信息的查询
1. 概述:
* 上面提及过,SpringBoot的配置文件,主要的目的就是对配置信息进行修改的,但在配置时的key从哪里去查询呢?我们可以查阅SpringBoot的官方文档
* 文档URL:https://docs.spring.io/spring-boot/docs/2.0.1.RELEASE/reference/htmlsingle/#common-application-properties
2. 常用的配置摘录:
# QUARTZ SCHEDULER (QuartzProperties)
spring.quartz.jdbc.initialize-schema=embedded # Database schema initialization mode.
spring.quartz.jdbc.schema=classpath:org/quartz/impl/jdbcjobstore/[email protected]@platform@@.
sql # Path to the SQL file to use to initialize the database schema.
spring.quartz.job-store-type=memory # Quartz job store type
spring.quartz.properties.*= # Additional Quartz Scheduler properties.
# ----------------------------------------
# WEB PROPERTIES
# ----------------------------------------
# EMBEDDED SERVER CONFIGURATION (ServerProperties)
server.port=8080 # Server HTTP port.
server.servlet.context-path= # Context path of the application.
server.servlet.path=/ # Path of the main dispatcher servlet.
# HTTP encoding (HttpEncodingProperties)
spring.http.encoding.charset=UTF-8 # Charset of HTTP requests and responses. Added to
the "Content-Type" header if not set explicitly.
# JACKSON (JacksonProperties)
spring.jackson.date-format= # Date format string or a fully-qualified date format
class name. For instance, `yyyy-MM-dd HH:mm:ss`.
# SPRING MVC (WebMvcProperties)
spring.mvc.servlet.load-on-startup=-1 # Load on startup priority of the dispatcher
servlet.
spring.mvc.static-path-pattern=/** # Path pattern used for static resources.
spring.mvc.view.prefix= # Spring MVC view prefix.
spring.mvc.view.suffix= # Spring MVC view suffix.
# DATASOURCE (DataSourceAutoConfiguration & DataSourceProperties)
spring.datasource.driver-class-name= # Fully qualified name of the JDBC driver. Auto-
detected based on the URL by default.
spring.datasource.password= # Login password of the database.
spring.datasource.url= # JDBC URL of the database.
spring.datasource.username= # Login username of the database.
# JEST (Elasticsearch HTTP client) (JestProperties)
spring.elasticsearch.jest.password= # Login password.
spring.elasticsearch.jest.proxy.host= # Proxy host the HTTP client should use.
spring.elasticsearch.jest.proxy.port= # Proxy port the HTTP client should use.
spring.elasticsearch.jest.read-timeout=3s # Read timeout.
spring.elasticsearch.jest.username= # Login username.
* 我们可以通过配置application.poperties或者application.yml来修改SpringBoot的默认配置
* 例如:
1. application.properties文件:
server.port=8888
server.servlet.context-path=demo
2. application.yml文件
server:
port: 8888
servlet:
context-path: /demo
配置文件与配置类的属性映射方式
-
使用注解@Value映射
- 我们可以通过@Value注解将配置文件中的值映射到一个Spring管理的Bean的字段上
- 图示:
-
使用注解@ConfigurationProperties映射
- 通过注解@ConfigurationProperties(prefix=“配置文件中的key的前缀”)可以将配置文件中的配置自动与实体进行映射
- 通过注解@ConfigurationProperties(prefix=“配置文件中的key的前缀”)可以将配置文件中的配置自动与实体进行映射
-
注意:
- 使用processor执行器,通过先调用后配置,在配置文件中会根据调用的变量进行智能提示;
- 使用@ConfigurationProperties方式可以进行配置文件与实体字段的自动映射,但需要字段必须提供set方法才可以,而使用@Value注解修饰的字段不需要提供set方法
-----------------------------------------------------------------## SpringBoot与整合Mybatis&Junit---------------------------
SpringBoot与整合Mybatis&Junit
pom.xml
<?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>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.itheima</groupId>
<artifactId>springboot_mybaits</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot_mybaits</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--SpringBoot集成Junit测试起步依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--mybatis的起步依赖-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.1.1</version>
</dependency>
<!--MySQL连接驱动-->
<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>
</plugin>
</plugins>
</build>
</project>
controller/MybatisController.java
package com.itheima.controller;
import com.itheima.domain.User;
import com.itheima.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.List;
/**
* MybatisController
* hasee
* 2018/12/20
* 16:06
*
* @Version 1.0 */
@Controller
public class MybatisController {
@Autowired
private UserMapper userMapper;
@RequestMapping("/quick")
@ResponseBody
public List<User> queryUserList(){
List<User> users=userMapper.queryUserList();
return users;
};
}
domain/User.java
package com.itheima.domain;
import java.io.Serializable;
/**
* User
* hasee
* 2018/12/20
* 15:55
*
* @Version 1.0
**/
public class User implements Serializable {
private Long id;
private String username;
private String password;
private String name;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id=id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username=username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password=password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name=name;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
", name='" + name + '\'' +
'}';
}
}
mapper/UserMapper.java
package com.itheima.mapper;
import com.itheima.domain.User;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface UserMapper {
public List<User> queryUserList();
}
#### SpringbootMybatisApplication.java
package com.itheima;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringbootMybatisApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootMybatisApplication.class, args);
}
}
#### resources/mapper/UserMapper.xml
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.itheima.mapper.UserMapper">
<select id="queryUserList" resultType="user">
select * from user
</select>
</mapper>
application.properties
配置数据库
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=root
扫描Mapper.xml
mybatis.type-aliases-package=com.itheima.domain
mybatis.mapper-locations=classpath:mapper/*Mapper.xml
test/ MybatisTest
package com.itheima;
import com.itheima.domain.User;
import com.itheima.mapper.UserMapper;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.List;
/**
* MybatisTest
* hasee
* 2018/12/20
* 16:20
*
* @Version 1.0
**/
@RunWith(SpringRunner.class)
@SpringBootTest(classes = SpringbootMybatisApplication.class)
public class MybatisTest {
@Autowired
private UserMapper userMapper;
@Test
public void test(){
List<User> users=userMapper.queryUserList();
System.out.println(users);
}
}
-------------------------------------------------------------------SpringBoot与整合Spring Data Jpa---------------------------------------------------------------------------------
SpringBoot与整合Spring Data Jpa
pom.xml:
<?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>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.itheima</groupId>
<artifactId>springboot_jpa</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot_jpa</name>
<description>Demo project for Spring Boot</description>
<properties>
<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>
<!--springboot Jpa的起步依赖-->
<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>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
User.java
package com.itheima.domain;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import java.io.Serializable;
/**
* User
* hasee
* 2018/12/20
* 18:18
*
* @Version 1.0
**/
@Entity
public class User implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
private String username;
private String password;
private String name;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id=id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username=username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password=password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name=name;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
", name='" + name + '\'' +
'}';
}
}
UserRepository.java
package com.itheima.repository;
import com.itheima.domain.User;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
/**
* UserRepository
* hasee
* 2018/12/20
* 18:27
*
* @Version 1.0
**/
public interface UserRepository extends JpaRepository<User,Long> {
public List<User> findAll();
}
SpringbootJpaApplication.java
package com.itheima;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringbootJpaApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootJpaApplication.class, args);
}
}
application.properties
#DB Configuration:
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?
useUnicode=true&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=root
#JPA Configuration:
spring.jpa.database=MySQL
spring.jpa.show-sql=true
spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.hibernate.naming_strategy=org.hibernate.cfg.ImprovedNamingStrategy
UserRepositoryTest.java
package com.itheima;
import com.itheima.domain.User;
import com.itheima.repository.UserRepository;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.List;
/**
* UserRepositoryTest
* hasee
* 2018/12/20
* 18:33
*
* @Version 1.0
**/
@RunWith(SpringRunner.class)
@SpringBootTest(classes = SpringbootJpaApplication.class)
public class UserRepositoryTest {
@Autowired
private UserRepository userRepository;
@Test
public void test1(){
List<User> list=userRepository.findAll();
for (User user : list) {
System.out.println(user);
}
}
}
-----------------------SpringBoot_jpa整合redis------------------------------------------------
SpringBoot_jpa整合redis…
pom.xml
<?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>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.itheima</groupId>
<artifactId>springboot_jpa_redis</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot_jpa_reids</name>
<description>Demo project for Spring Boot</description>
<properties>
<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>
<!--springboot Jpa的起步依赖-->
<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>
<!--配置使用redis启动器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
User.java
package com.itheima.domain;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import java.io.Serializable;
/**
* User
* hasee
* 2018/12/20
* 18:18
*
* @Version 1.0
**/
@Entity
public class User implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
private String username;
private String password;
private String name;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id=id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username=username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password=password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name=name;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
", name='" + name + '\'' +
'}';
}
}
UserRepository
package com.itheima.repository;
import com.itheima.domain.User;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
/**
* UserRepository
* hasee
* 2018/12/20
* 18:27
*
* @Version 1.0
**/
public interface UserRepository extends JpaRepository<User,Long> {
public List<User> findAll();
}
SpringbootJpaApplication
package com.itheima;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringbootJpaApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootJpaApplication.class, args);
}
}
## application.properties
#DB Configuration:
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?
useUnicode=true&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=root
#JPA Configuration:
spring.jpa.database=MySQL
spring.jpa.show-sql=true
spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.hibernate.naming_strategy=org.hibernate.cfg.ImprovedNamingStrategy
# Redis
spring.redis.host=127.0.0.1
spring.redis.port=6379
RedisTest
package com.itheima;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.itheima.domain.User;
import com.itheima.repository.UserRepository;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.BoundHashOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.List;
/**
* RedisTest
* hasee
* 2018/12/20
* 18:55
*
* @Version 1.0
**/
/*
* 这里是对整合redis进行测试
* 整合redis需要进行的步骤:
* 1. 引入依赖
* 2. 启动redis.server服务
* 3. 在idea中进行端口号等配置
* 4. 进行测试
*
* */
@RunWith(SpringRunner.class)
@SpringBootTest(classes=SpringbootJpaApplication.class)
public class RedisTest {
@Autowired
private RedisTemplate<String,String> redisTemplate;
@Autowired
private UserRepository userRepository;
@Test
public void test() throws JsonProcessingException {
//1. 从redis中获得数据,数据的形式json字符串
String userListJson=redisTemplate.boundValueOps("user.findAll").get();
//2. 判断redis中是否存在数据
if (null==userListJson){
//3. 不存在数据 从数据库查询
List<User> all=userRepository.findAll();
//4. 将查询出来的输出存储到redis缓存中
//向将list集合转换成json格式的字符串 使用jackson进行转换
ObjectMapper objectMapper=new ObjectMapper();
userListJson=objectMapper.writeValueAsString(all);
//将数据存入缓存
redisTemplate.boundValueOps("user.findAll").set(userListJson);
System.out.println("===============从数据库中获取user的数据");
}else {
System.out.println("--------------从缓存中获取user的数据");
}
}
}
UserRepositoryTest
package com.itheima;
import com.itheima.domain.User;
import com.itheima.repository.UserRepository;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.List;
/**
* UserRepositoryTest
* hasee
* 2018/12/20
* 18:33
*
* @Version 1.0
**/
@RunWith(SpringRunner.class)
@SpringBootTest(classes = SpringbootJpaApplication.class)
public class UserRepositoryTest {
@Autowired
private UserRepository userRepository;
@Test
public void test1(){
List<User> list=userRepository.findAll();
for (User user : list) {
System.out.println(user);
}
}
}