@@ -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-actuator</module> | |||
<module>../spring-boot-demo-logback</module> | |||
<module>../spring-boot-demo-jpa</module> | |||
<module>../spring-boot-demo-mybatis</module> | |||
</modules> | |||
@@ -30,6 +31,10 @@ | |||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> | |||
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> | |||
<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> | |||
<dependencies> | |||
@@ -52,10 +57,25 @@ | |||
<artifactId>mysql-connector-java</artifactId> | |||
</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> | |||
<artifactId>hutool-all</artifactId> | |||
<version>3.1.2</version> | |||
<version>${hutool.version}</version> | |||
</dependency> | |||
<dependency> | |||
<groupId>com.google.guava</groupId> | |||