spring jpa
Posted 凉介lin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring jpa相关的知识,希望对你有一定的参考价值。
SpringBoot JPA
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
一、创建步骤
二、目录结构
三、application.properties配置datasource
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.url=jdbc:mysql://localhost/springboot?userUnicode=true@characterEncoding=UTF8&serverTimezone=UTC
- 1
- 2
- 3
- 4
- 5
四、domain层创建实体类User
package com.willam.domain;
import javax.persistence.*;
/**
* @author :lijunxuan
* @date :Created in 2019/6/28 17:04
* @description :
* @version: 1.0
*/
@Table(name = "user")
@Entity
public class User {
@Id //ID代表是主键
@GeneratedValue(strategy = GenerationType.IDENTITY) //按照主键自增
private Integer id;
//@Column(name="username") //把数据库里的名字和当前名字做一个绑定关系
private String username;
private String password;
private String name;
@Override
public String toString() {
return "User{" +
"id=" + id +
", username=‘" + username + ‘‘‘ +
", password=‘" + password + ‘‘‘ +
", name=‘" + name + ‘‘‘ +
‘}‘;
}
public Integer getId() {
return id;
}
public void setId(Integer 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;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
五、Controller层UserController
package com.willam.Controller;
import com.willam.Service.UserService;
import com.willam.domain.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* @author :lijunxuan
* @date :Created in 2019/6/28 17:02
* @description :
* @version: 1.0
*/
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
UserService userService;
/**
* 查询所有用户
* @return
*/
@RequestMapping("/findAll")
public List<User> findAll(){
return userService.findAll();
}
/**
* 通过ID查询用户
* @param id
* @return
*/
@RequestMapping("/findById")
public User findById(Integer id){
return userService.findById(id);
}
/**
* 添加用户
* @param user
*
*/
@RequestMapping("/add")
public void add(User user){
userService.add(user);
}
/**
* 通过用户ID删除用户
* @param id
*
*/
@RequestMapping("/deleteById")
public void deleteById(Integer id){
userService.deleteById(id);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
六、service层
(1)UserService接口
package com.willam.Service;
import com.willam.domain.User;
import java.util.List;
public interface UserService {
/**
* 查询所有用户信息
* @return
*/
List<User> findAll();
/**
* 通过ID查询用户
* @param id
* @return
*/
User findById(Integer id);
/**
* 添加用户
* @param user
*
*/
void add(User user);
/**
* 通过用户ID删除用户
* @param id
*
*/
void deleteById(Integer id);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
(2)UserServiceImpl实现类
package com.willam.Service.impl;
import com.willam.Dao.UserDao;
import com.willam.Service.UserService;
import com.willam.domain.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Optional;
/**
* @author :lijunxuan
* @date :Created in 2019/6/28 17:27
* @description :
* @version: 1.0
*/
@Service
public class UserServiceImpl implements UserService {
@Autowired
UserDao userDao;
@Override
public List<User> findAll() {
return userDao.findAll();
}
@Override
public User findById(Integer id) {
Optional<User> userById = userDao.findById(id);
return userById.get();
}
@Override
public void add(User user) {
userDao.save(user);
}
@Override
public void deleteById(Integer id) {
userDao.deleteById(id);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
七、Dao层
package com.willam.Dao;
import com.willam.domain.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface UserDao extends JpaRepository<User,Integer> {
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
八、 集成Spring Data Redis
实现步骤:
- 添加Redis起步依赖
- 在application.properties中配置redis端口、地址
- 注入RedisTemplate操作Redis缓存查询所有用户数据
- 测试缓存
1. 添加Redis起步依赖
<!--redis起步依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
- 1
- 2
- 3
- 4
- 5
2. 在application.properties中配置redis端口、地址
# Redis 配置(不填也是可以的)
spring.redis.host=localhost
spring.redis.port=6379
- 1
- 2
- 3
3. 注入RedisTemplate操作Redis缓存查询所有用户数据
将Controller层的findAll方法修改一下
@Resource
RedisTemplate redisTemplate;
@RequestMapping("/findAll")
public List<User> findAll(){
/*如果第一次查询,redis缓存没有数据,就从数据库中获取
如果有缓存数据,那么从缓存中获取
*/
String users = (String)redisTemplate.boundValueOps("userDao.findAll").get();
if (users==null){
//数据库查询
List<User> all=userService.findAll();
users = all.toString();
redisTemplate.boundValueOps("userDao.findAll").set(users); //把当前的数据缓存
}
return userService.findAll();
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
4. 测试缓存
打一个断点
地址栏 发送请求 http://localhost:8080/user/findAll
后台
redis中有缓存则直接走 return userService.findAll();
九、 集成定时器
(1)在SpringbootJpaApplication开启定时器
(2)创建Timer类
package com.willam.Utils;
import com.willam.Service.UserService;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Date;
/**
* @author :lijunxuan
* @date :Created in 2019/6/28 19:18
* @description :
* @version: 1.0
*/
@Component //把当前的类加入spring容器
public class Timer {
UserService userService;
/**
* 定时任务的配置
* corn 表达式
* fixedDelay 固定的延迟时间执行,上一个任务执行完成,多久之后下一个任务执行。
* rateDelay 固定频率执行,每隔固定时间执行任务
*/
@Scheduled(fixedRate = 2000)
public void task(){
System.out.println(new Date());
System.out.println(LocalDateTime.now());
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
(3)测试结果
每隔2秒执行一次
十、SpringBoot如何代码测试
(1)加入依赖
<!--springBoot的测试依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
- 1
- 2
- 3
- 4
- 5
- 6
(2)编写测试类:
- SpringRunner继承SpringJUnit4ClassRunner,使用哪一个Spring提供的测试引擎都可以。指定运行测试的引擎
- @SpringBootTest的属性值指的是引导类的字节码对象
package com.willam;
import com.willam.Service.UserService;
import com.willam.domain.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import javax.annotation.Resource;
import java.util.List;
@RunWith(SpringRunner.class)
@SpringBootTest //SpringBoot测试类
public class SpringbootJpaApplicationTests {
@Resource
UserService userService;
@Test
public void contextLoads() {
List<User> userList = userService.findAll();
System.out.println(userList);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
(3)测试结果
十一、Spring Boot 如何打包部署
(1)打成Jar包部署
在cmd切换到项目的路径
如:H:workspaceIdeaProjectSpringBootday01day01_springboot_jpa
启动命令:
java -jar target/day01_springboot_jpa-0.0.1-SNAPSHOT.jar
- 1
启动命令的时候配置jvm参数也是可以的。然后查看一下Java的参数配置结果
java -Xmx80m -Xms20m -jar target/day01_springboot_demo01-1.0-SNAPSHOT.jar
- 1
小技巧
(2)打成War包部署
1.执行maven打包命令或者使用IDEA的Maven工具打包,需要修改pom.xml文件中的打包类型。
<packaging>war</packaging>
- 1
2. 注册启动类
- 创建 ServletInitializer.java,继承 SpringBootServletInitializer ,覆盖 configure(),把启动类 Application 注册进去。外部 Web 应用服务器构建 Web Application Context 的时候,会把启动类添加进去
//web.xml
public class ServletInitializer extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(DemoApplication.class);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
3.然后执行打包操作
启动
以上是关于spring jpa的主要内容,如果未能解决你的问题,请参考以下文章
试图在我的代码中找到数据库连接泄漏,使用 Spring / JPA / Hikari