@@ -0,0 +1,148 @@ | |||||
# spring-boot-demo-jpa | |||||
依赖 [spring-boot-demo-helloworld](../spring-boot-demo-parent)、`spring-boot-starter-data-jpa`、`druid-spring-boot-starter` | |||||
### pom.xml | |||||
```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> | |||||
<artifactId>spring-boot-demo-jpa</artifactId> | |||||
<version>0.0.1-SNAPSHOT</version> | |||||
<packaging>jar</packaging> | |||||
<name>spring-boot-demo-jpa</name> | |||||
<description>Demo project for Spring Boot</description> | |||||
<parent> | |||||
<groupId>com.xkcoding</groupId> | |||||
<artifactId>spring-boot-demo-parent</artifactId> | |||||
<version>0.0.1-SNAPSHOT</version> | |||||
<relativePath>../spring-boot-demo-parent</relativePath> | |||||
</parent> | |||||
<properties> | |||||
<druid.starter.version>1.1.5</druid.starter.version> | |||||
</properties> | |||||
<dependencies> | |||||
<dependency> | |||||
<groupId>org.springframework.boot</groupId> | |||||
<artifactId>spring-boot-starter-data-jpa</artifactId> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>com.alibaba</groupId> | |||||
<artifactId>druid-spring-boot-starter</artifactId> | |||||
<version>${druid.starter.version}</version> | |||||
</dependency> | |||||
</dependencies> | |||||
<build> | |||||
<finalName>spring-boot-demo-jpa</finalName> | |||||
</build> | |||||
</project> | |||||
``` | |||||
### application.yml | |||||
```yml | |||||
server: | |||||
port: 8080 | |||||
context-path: /demo | |||||
spring: | |||||
datasource: | |||||
continue-on-error: true | |||||
druid: | |||||
url: jdbc:mysql://localhost:3306/spring-boot-demo?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false | |||||
username: root | |||||
password: root | |||||
driver-class-name: com.mysql.jdbc.Driver | |||||
# 连接池配置 | |||||
# 初始化大小,最小,最大 | |||||
initialSize: 5 | |||||
minIdle: 5 | |||||
maxActive: 20 | |||||
# 配置获取连接等待超时的时间 | |||||
maxWait: 60000 | |||||
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 | |||||
timeBetweenEvictionRunsMillis: 60000 | |||||
# 配置一个连接在池中最小生存的时间,单位是毫秒 | |||||
minEvictableIdleTimeMillis: 300000 | |||||
validationQuery: SELECT 1 FROM DUAL | |||||
testWhileIdle: true | |||||
testOnBorrow: false | |||||
testOnReturn: false | |||||
# 打开PSCache,并且指定每个连接上PSCache的大小 | |||||
poolPreparedStatements: true | |||||
maxPoolPreparedStatementPerConnectionSize: 20 | |||||
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙 | |||||
filters: stat,wall,log4j | |||||
# 监控配置 | |||||
web-stat-filter: | |||||
enabled: true | |||||
url-pattern: /* | |||||
exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*" | |||||
stat-view-servlet: | |||||
enabled: true | |||||
url-pattern: /sys/druid/* | |||||
reset-enable: fasle | |||||
login-username: xkcoding | |||||
login-password: 123456 | |||||
filter: | |||||
stat: | |||||
log-slow-sql: true | |||||
slow-sql-millis: 5000 | |||||
merge-sql: true | |||||
jpa: | |||||
hibernate: | |||||
ddl-auto: create-drop | |||||
show-sql: true | |||||
``` | |||||
### JpaUser.java | |||||
```java | |||||
@Entity | |||||
@Data | |||||
@DynamicUpdate | |||||
public class JpaUser { | |||||
@Id | |||||
@GeneratedValue(strategy = GenerationType.IDENTITY) | |||||
private Long id; | |||||
@Column(name = "name") | |||||
private String name; | |||||
@Column(name = "create_time") | |||||
private Date createTime; | |||||
} | |||||
``` | |||||
### JpaUserRepository.java | |||||
```java | |||||
public interface JpaUserRepository extends JpaRepository<JpaUser, Long> { | |||||
/** | |||||
* 自定义一个查询,HQL,根据姓名查询 | |||||
* | |||||
* @param name 名称 | |||||
* @return JpaUser | |||||
*/ | |||||
@Query("from JpaUser u where u.name like :name") | |||||
JpaUser findJpaUser(@Param("name") String name); | |||||
JpaUser findJpaUserByName(String name); | |||||
List<JpaUser> findJpaUsersByIdIn(List<Long> ids); | |||||
} | |||||
``` | |||||
### 其余代码 | |||||
详情请参见本demo。 |
@@ -0,0 +1,40 @@ | |||||
<?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> | |||||
<artifactId>spring-boot-demo-jpa</artifactId> | |||||
<version>0.0.1-SNAPSHOT</version> | |||||
<packaging>jar</packaging> | |||||
<name>spring-boot-demo-jpa</name> | |||||
<description>Demo project for Spring Boot</description> | |||||
<parent> | |||||
<groupId>com.xkcoding</groupId> | |||||
<artifactId>spring-boot-demo-parent</artifactId> | |||||
<version>0.0.1-SNAPSHOT</version> | |||||
<relativePath>../spring-boot-demo-parent</relativePath> | |||||
</parent> | |||||
<properties> | |||||
<druid.starter.version>1.1.5</druid.starter.version> | |||||
</properties> | |||||
<dependencies> | |||||
<dependency> | |||||
<groupId>org.springframework.boot</groupId> | |||||
<artifactId>spring-boot-starter-data-jpa</artifactId> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>com.alibaba</groupId> | |||||
<artifactId>druid-spring-boot-starter</artifactId> | |||||
<version>${druid.starter.version}</version> | |||||
</dependency> | |||||
</dependencies> | |||||
<build> | |||||
<finalName>spring-boot-demo-jpa</finalName> | |||||
</build> | |||||
</project> |
@@ -0,0 +1,12 @@ | |||||
package com.xkcoding.springbootdemojpa; | |||||
import org.springframework.boot.SpringApplication; | |||||
import org.springframework.boot.autoconfigure.SpringBootApplication; | |||||
@SpringBootApplication | |||||
public class SpringBootDemoJpaApplication { | |||||
public static void main(String[] args) { | |||||
SpringApplication.run(SpringBootDemoJpaApplication.class, args); | |||||
} | |||||
} |
@@ -0,0 +1,86 @@ | |||||
package com.xkcoding.springbootdemojpa.controller; | |||||
import com.google.common.collect.Lists; | |||||
import com.xkcoding.springbootdemojpa.entity.JpaUser; | |||||
import com.xkcoding.springbootdemojpa.service.JpaUserService; | |||||
import org.springframework.beans.factory.annotation.Autowired; | |||||
import org.springframework.data.domain.Page; | |||||
import org.springframework.data.domain.PageRequest; | |||||
import org.springframework.web.bind.annotation.*; | |||||
import java.util.Date; | |||||
import java.util.List; | |||||
@RestController | |||||
@RequestMapping("/user") | |||||
public class JpaUserController { | |||||
@Autowired | |||||
private JpaUserService jpaUserService; | |||||
@GetMapping("/{id}") | |||||
public JpaUser findById(@PathVariable Long id) { | |||||
return jpaUserService.findById(id); | |||||
} | |||||
@GetMapping({"", "/", "/index"}) | |||||
public List<JpaUser> findAll() { | |||||
return jpaUserService.findAll(); | |||||
} | |||||
@GetMapping("/save") | |||||
public JpaUser insert() { | |||||
JpaUser user = new JpaUser(); | |||||
user.setName("xkcoding"); | |||||
user.setCreateTime(new Date()); | |||||
return jpaUserService.insert(user); | |||||
} | |||||
@GetMapping("/update") | |||||
public JpaUser update() { | |||||
JpaUser user = jpaUserService.findById(1L); | |||||
user.setName("修改后的姓名"); | |||||
return jpaUserService.update(user); | |||||
} | |||||
@GetMapping("/delete/{id}") | |||||
public String delete(@PathVariable Integer id) { | |||||
if (id == null) { | |||||
return "Id 不能为空"; | |||||
} | |||||
JpaUser jpaUser = jpaUserService.findById(id.longValue()); | |||||
if (jpaUser == null) { | |||||
return "用户不存在"; | |||||
} | |||||
jpaUserService.delete(jpaUser); | |||||
return jpaUser.getName() + "删除成功"; | |||||
} | |||||
@GetMapping("/saveList") | |||||
public List<JpaUser> insertList() { | |||||
List<JpaUser> userList = Lists.newArrayList(); | |||||
for (int i = 0; i < 20; i++) { | |||||
JpaUser jpaUser = new JpaUser(); | |||||
jpaUser.setName("xkcoding" + i); | |||||
jpaUser.setCreateTime(new Date()); | |||||
userList.add(jpaUser); | |||||
} | |||||
return jpaUserService.insertList(userList); | |||||
} | |||||
@GetMapping("/find") | |||||
public JpaUser findJpaUser(@RequestParam String name) { | |||||
return jpaUserService.findJpaUser(name); | |||||
} | |||||
@GetMapping("/find/in") | |||||
public List<JpaUser> findJpaUsersByIdIn() { | |||||
List<Long> ids = Lists.newArrayList(1L, 2L, 3L); | |||||
return jpaUserService.findJpaUsersByIdIn(ids); | |||||
} | |||||
@GetMapping("/page") | |||||
public Page<JpaUser> findByPage(@RequestParam(defaultValue = "1") Integer pageNum, @RequestParam(defaultValue = "10") Integer pageSize) { | |||||
PageRequest pageRequest = new PageRequest(pageNum - 1, pageSize); | |||||
return jpaUserService.findByPage(pageRequest); | |||||
} | |||||
} |
@@ -0,0 +1,22 @@ | |||||
package com.xkcoding.springbootdemojpa.entity; | |||||
import lombok.Data; | |||||
import org.hibernate.annotations.DynamicUpdate; | |||||
import javax.persistence.*; | |||||
import java.util.Date; | |||||
@Entity | |||||
@Data | |||||
@DynamicUpdate | |||||
public class JpaUser { | |||||
@Id | |||||
@GeneratedValue(strategy = GenerationType.IDENTITY) | |||||
private Long id; | |||||
@Column(name = "name") | |||||
private String name; | |||||
@Column(name = "create_time") | |||||
private Date createTime; | |||||
} |
@@ -0,0 +1,25 @@ | |||||
package com.xkcoding.springbootdemojpa.repository; | |||||
import com.xkcoding.springbootdemojpa.entity.JpaUser; | |||||
import org.springframework.data.jpa.repository.JpaRepository; | |||||
import org.springframework.data.jpa.repository.Query; | |||||
import org.springframework.data.repository.query.Param; | |||||
import java.util.List; | |||||
public interface JpaUserRepository extends JpaRepository<JpaUser, Long> { | |||||
/** | |||||
* 自定义一个查询,HQL,根据姓名查询 | |||||
* | |||||
* @param name 名称 | |||||
* @return JpaUser | |||||
*/ | |||||
@Query("from JpaUser u where u.name like :name") | |||||
JpaUser findJpaUser(@Param("name") String name); | |||||
JpaUser findJpaUserByName(String name); | |||||
List<JpaUser> findJpaUsersByIdIn(List<Long> ids); | |||||
} |
@@ -0,0 +1,27 @@ | |||||
package com.xkcoding.springbootdemojpa.service; | |||||
import com.xkcoding.springbootdemojpa.entity.JpaUser; | |||||
import org.springframework.data.domain.Page; | |||||
import org.springframework.data.domain.Pageable; | |||||
import java.util.List; | |||||
public interface JpaUserService { | |||||
JpaUser findById(Long id); | |||||
List<JpaUser> findAll(); | |||||
JpaUser insert(JpaUser user); | |||||
JpaUser update(JpaUser user); | |||||
void delete(JpaUser user); | |||||
List<JpaUser> insertList(List<JpaUser> userList); | |||||
JpaUser findJpaUser(String name); | |||||
List<JpaUser> findJpaUsersByIdIn(List<Long> ids); | |||||
Page<JpaUser> findByPage(Pageable pageable); | |||||
} |
@@ -0,0 +1,62 @@ | |||||
package com.xkcoding.springbootdemojpa.service.impl; | |||||
import com.xkcoding.springbootdemojpa.entity.JpaUser; | |||||
import com.xkcoding.springbootdemojpa.repository.JpaUserRepository; | |||||
import com.xkcoding.springbootdemojpa.service.JpaUserService; | |||||
import org.springframework.beans.factory.annotation.Autowired; | |||||
import org.springframework.data.domain.Page; | |||||
import org.springframework.data.domain.Pageable; | |||||
import org.springframework.stereotype.Service; | |||||
import java.util.List; | |||||
@Service | |||||
public class JpaUserServiceImpl implements JpaUserService { | |||||
@Autowired | |||||
private JpaUserRepository jpaUserRepository; | |||||
@Override | |||||
public JpaUser findById(Long id) { | |||||
return jpaUserRepository.findOne(id); | |||||
} | |||||
@Override | |||||
public List<JpaUser> findAll() { | |||||
return jpaUserRepository.findAll(); | |||||
} | |||||
@Override | |||||
public JpaUser insert(JpaUser user) { | |||||
return jpaUserRepository.save(user); | |||||
} | |||||
@Override | |||||
public JpaUser update(JpaUser user) { | |||||
return jpaUserRepository.save(user); | |||||
} | |||||
@Override | |||||
public void delete(JpaUser user) { | |||||
jpaUserRepository.delete(user); | |||||
} | |||||
@Override | |||||
public List<JpaUser> insertList(List<JpaUser> userList) { | |||||
return jpaUserRepository.save(userList); | |||||
} | |||||
@Override | |||||
public JpaUser findJpaUser(String name) { | |||||
return jpaUserRepository.findJpaUser(name); | |||||
} | |||||
@Override | |||||
public List<JpaUser> findJpaUsersByIdIn(List<Long> ids) { | |||||
return jpaUserRepository.findJpaUsersByIdIn(ids); | |||||
} | |||||
@Override | |||||
public Page<JpaUser> findByPage(Pageable pageable) { | |||||
return jpaUserRepository.findAll(pageable); | |||||
} | |||||
} |
@@ -0,0 +1,51 @@ | |||||
server: | |||||
port: 8080 | |||||
context-path: /demo | |||||
spring: | |||||
datasource: | |||||
continue-on-error: true | |||||
druid: | |||||
url: jdbc:mysql://localhost:3306/spring-boot-demo?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false | |||||
username: root | |||||
password: root | |||||
driver-class-name: com.mysql.jdbc.Driver | |||||
# 连接池配置 | |||||
# 初始化大小,最小,最大 | |||||
initialSize: 5 | |||||
minIdle: 5 | |||||
maxActive: 20 | |||||
# 配置获取连接等待超时的时间 | |||||
maxWait: 60000 | |||||
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 | |||||
timeBetweenEvictionRunsMillis: 60000 | |||||
# 配置一个连接在池中最小生存的时间,单位是毫秒 | |||||
minEvictableIdleTimeMillis: 300000 | |||||
validationQuery: SELECT 1 FROM DUAL | |||||
testWhileIdle: true | |||||
testOnBorrow: false | |||||
testOnReturn: false | |||||
# 打开PSCache,并且指定每个连接上PSCache的大小 | |||||
poolPreparedStatements: true | |||||
maxPoolPreparedStatementPerConnectionSize: 20 | |||||
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙 | |||||
filters: stat,wall,log4j | |||||
# 监控配置 | |||||
web-stat-filter: | |||||
enabled: true | |||||
url-pattern: /* | |||||
exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*" | |||||
stat-view-servlet: | |||||
enabled: true | |||||
url-pattern: /sys/druid/* | |||||
reset-enable: fasle | |||||
login-username: xkcoding | |||||
login-password: 123456 | |||||
filter: | |||||
stat: | |||||
log-slow-sql: true | |||||
slow-sql-millis: 5000 | |||||
merge-sql: true | |||||
jpa: | |||||
hibernate: | |||||
ddl-auto: create-drop | |||||
show-sql: true |
@@ -0,0 +1,16 @@ | |||||
package com.xkcoding.springbootdemojpa; | |||||
import org.junit.Test; | |||||
import org.junit.runner.RunWith; | |||||
import org.springframework.boot.test.context.SpringBootTest; | |||||
import org.springframework.test.context.junit4.SpringRunner; | |||||
@RunWith(SpringRunner.class) | |||||
@SpringBootTest | |||||
public class SpringBootDemoJpaApplicationTests { | |||||
@Test | |||||
public void contextLoads() { | |||||
} | |||||
} |
@@ -16,6 +16,7 @@ | |||||
<module>../spring-boot-demo-properties</module> | <module>../spring-boot-demo-properties</module> | ||||
<module>../spring-boot-demo-actuator</module> | <module>../spring-boot-demo-actuator</module> | ||||
<module>../spring-boot-demo-logback</module> | <module>../spring-boot-demo-logback</module> | ||||
<module>../spring-boot-demo-jpa</module> | |||||
<module>../spring-boot-demo-mybatis</module> | <module>../spring-boot-demo-mybatis</module> | ||||
</modules> | </modules> | ||||
@@ -30,6 +31,10 @@ | |||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> | <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> | ||||
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> | <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> | ||||
<java.version>1.8</java.version> | <java.version>1.8</java.version> | ||||
<hutool.version>3.2.0</hutool.version> | |||||
<commons.lang3.version>3.5</commons.lang3.version> | |||||
<commons.collections.version>3.2.2</commons.collections.version> | |||||
<commons.codec.version>1.10</commons.codec.version> | |||||
</properties> | </properties> | ||||
<dependencies> | <dependencies> | ||||
@@ -53,9 +58,24 @@ | |||||
</dependency> | </dependency> | ||||
<!--工具类--> | <!--工具类--> | ||||
<dependency> | <dependency> | ||||
<groupId>org.apache.commons</groupId> | |||||
<artifactId>commons-lang3</artifactId> | |||||
<version>${commons.lang3.version}</version> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>commons-collections</groupId> | |||||
<artifactId>commons-collections</artifactId> | |||||
<version>${commons.collections.version}</version> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>commons-codec</groupId> | |||||
<artifactId>commons-codec</artifactId> | |||||
<version>${commons.codec.version}</version> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>com.xiaoleilu</groupId> | <groupId>com.xiaoleilu</groupId> | ||||
<artifactId>hutool-all</artifactId> | <artifactId>hutool-all</artifactId> | ||||
<version>3.1.2</version> | |||||
<version>${hutool.version}</version> | |||||
</dependency> | </dependency> | ||||
<dependency> | <dependency> | ||||
<groupId>com.google.guava</groupId> | <groupId>com.google.guava</groupId> | ||||