# boot-jpa
**Repository Path**: li90hou/boot-jpa
## Basic Information
- **Project Name**: boot-jpa
- **Description**: Spring Boot 使用 Spring Data JPA 操作数据库
- **Primary Language**: Java
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2018-03-23
- **Last Updated**: 2020-12-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 1 配置
## 1.1 Maven 依赖
```java
org.springframework.boot
spring-boot-starter-data-jpa
```
## 1.2配置属性文件 application.properties
```java
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://hostname:3306/dbName?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
spring.datasource.username=youname
spring.datasource.password=youpassword
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
```
## *或使用 application.yml*
```java
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://hostname:3306/dbName?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
username: youname
password: youpassword
jpa:
hibernate:
ddl-auto: update
show-sql: true
```
# 2 编写类
## 2.1 实体类
```java
@Entity
@Table(name = "tb_user") // 数据库表名
public class User {
@Id // 主键
@GeneratedValue(strategy = GenerationType.AUTO) // 自增
private Long id;
private String username;
private String password;
// setter and getter
}
```
## 2.2 Dao 层
编写接口继承 JpaRepository 接口,此接口中提供了常用的 CRUD 方法,可以直接调用
```java
public interface UserDao extends JpaRepository{
// 自定义方法
}
```
## 2.3 Service 层
注入 UserDao
```java
@Service
public class UserService {
@Resource
private UserDao userDao;
}
```
# 3 查询方式
> 增、删、改操作要使用事务(在Service 层或 Dao 层相应方法上添加 @Transactional 注解),否则会报如下错:
> javax.persistence.TransactionRequiredException: Executing an update/delete query
## 3.1 直接调用接口 JpaRepository 的方法生成 SQL
```java
// 保存用户信息
userDao.save(user);
// 查获取所有用户信息列表
userDao.findAll();
```
## 3.2 使用 @Query 注解自定义生成 SQL
```java
/**
* 在 UserDao 中添加自定义方法
* User 为类名,将关联到 数据库表 tb_user
*/
@Query(value = "SELECT u FROM User u")
List listUser();
/**
* 对于增、删、改类型 SQL 需要添加 @Modifying
* ?1: 取方法参数列表中第一个参数的值,如果方法参数有多个,?1 ?2...
*/
@Modifying
@Query(value = "DELETE FROM User WHERE id = ?1")
int removeUserByMinId(Long id);
/**
* 多个参数
* ?1 -> id
* ?2 -> username
* ?3 -> newPasswd
*/
@Modifying
@Query(value = "UPDATE User SET password = ?3 WHERE id = ?1 OR username = ?2")
void updateUserPassword(Long id, String username, String newPasswd);
/**
* 使用命名参数,通过 ":param" 的形式引用
*/
@Modifying
@Query(value = "UPDATE User SET password = :pwd WHERE id = :id OR username = :name")
void updateUserPassword2(@Param("id") Long id,
@Param("name") String username,
@Param("pwd") String newPasswd);
/**
* 引用实体类属性
*/
@Modifying
@Query(value = "UPDATE User SET password = :#{#user.password} WHERE id = :#{#user.id} OR username = :#{#user.username}")
void updateUserPassword3(@Param("user") User user);
```
## 3.3 使用关键字创建查询生成 SQL
在 UserDao 中添加方法
```java
/**
* 符合规则的方法将自动生成 SQL
* <==> SELECT u FROM User u WHERE username = ?1
*/
User findByUsername(String username);
```
## *可用关键字如下表*
官方:https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.sample-app.finders.strategies
|关键字 |举例 |转化为 |
| :-------- | :--------| :-- |
| And | findByLastnameAndFirstname | … where x.lastname = ?1 and x.firstname = ?2 |
|Or|findByLastnameOrFirstname | … where x.lastname = ?1 or x.firstname = ?2|
|Is,Equals|findByFirstname,findByFirstnameIs,findByFirstnameEquals |… where x.firstname = ?1 |
|Between| findByStartDateBetween|… where x.startDate between ?1 and ?2 |
|LessThan|findByAgeLessThan |… where x.age < ?1 |
|LessThanEqual| findByAgeLessThanEqual|… where x.age <= ?1 |
|GreaterThan|findByAgeGreaterThan | … where x.age > ?1|
|GreaterThanEqual|findByAgeGreaterThanEqual | … where x.age >= ?1|
|After|findByStartDateAfter | … where x.startDate > ?1|
|Before|findByStartDateBefore | … where x.startDate < ?1|
|IsNull|findByAgeIsNull | … where x.age is null|
|IsNotNull,NotNull|findByAge(Is)NotNull | … where x.age not null|
|Like|findByFirstnameLike | … where x.firstname like ?1|
|NotLike|findByFirstnameNotLike | … where x.firstname not like ?1|
|StartingWith|findByFirstnameStartingWith | … where x.firstname like ?1 (parameter bound with appended %)|
|EndingWith|findByFirstnameEndingWith | … where x.firstname like ?1 (parameter bound with prepended %)|
|Containing|findByFirstnameContaining | … where x.firstname like ?1 (parameter bound wrapped in %)|
|OrderBy|findByAgeOrderByLastnameDesc | … where x.age = ?1 order by x.lastname desc|
|Not|findByLastnameNot | … where x.lastname <> ?1|
|In| findByAgeNotIn(Collection ages)| … where x.age in ?1|
|NotIn|findByAgeNotIn(Collection ages) | … where x.age not in ?1|
|True| findByActiveTrue()| … where x.active = true|
|False| findByActiveFalse()| … where x.active = false|
|IgnoreCase| findByFirstnameIgnoreCase| … where UPPER(x.firstame) = UPPER(?1)|