Spring Boot 使用 Spring Data JPA 操作数据库

1 配置

1.1 Maven 依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

1.2 配置属性文件 application.properties

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

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 实体类

@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 方法,可以直接调用

public interface UserDao extends JpaRepository<User, Long>{
    // 自定义方法
}

2.3 Service 层

注入 UserDao

@Service
public class UserService {
    @Resource
    private UserDao userDao;

}

3 查询方式

增、删、改操作要使用事务(在Service 层或 Dao 层相应方法上添加 @Transactional 注解),否则会报如下错:javax.persistence.TransactionRequiredException: Executing an update/delete query

3.1 直接调用接口 JpaRepository 的方法生成 SQL

// 保存用户信息
userDao.save(user);
// 查获取所有用户信息列表
userDao.findAll();

3.2 使用 @Query 注解自定义生成 SQL

/**
 * 在 UserDao 中添加自定义方法
 * User 为类名,将关联到 数据库表 tb_user
 */
@Query(value = "SELECT u FROM User u")
List<User> 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 中添加方法

/**
 * 符合规则的方法将自动生成 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

关键字举例转化为
AndfindByLastnameAndFirstname… where x.lastname = ?1 and x.firstname = ?2
OrfindByLastnameOrFirstname… where x.lastname = ?1 or x.firstname = ?2
Is,EqualsfindByFirstname,findByFirstnameIs,findByFirstnameEquals… where x.firstname = ?1
BetweenfindByStartDateBetween… where x.startDate between ?1 and ?2
LessThanfindByAgeLessThan… where x.age < ?1
LessThanEqualfindByAgeLessThanEqual… where x.age <= ?1
GreaterThanfindByAgeGreaterThan… where x.age > ?1
GreaterThanEqualfindByAgeGreaterThanEqual… where x.age >= ?1
AfterfindByStartDateAfter… where x.startDate > ?1
BeforefindByStartDateBefore… where x.startDate < ?1
IsNullfindByAgeIsNull… where x.age is null
IsNotNull,NotNullfindByAge(Is)NotNull… where x.age not null
LikefindByFirstnameLike… where x.firstname like ?1
NotLikefindByFirstnameNotLike… where x.firstname not like ?1
StartingWithfindByFirstnameStartingWith… where x.firstname like ?1 (parameter bound with appended %)
EndingWithfindByFirstnameEndingWith… where x.firstname like ?1 (parameter bound with prepended %)
ContainingfindByFirstnameContaining… where x.firstname like ?1 (parameter bound wrapped in %)
OrderByfindByAgeOrderByLastnameDesc… where x.age = ?1 order by x.lastname desc
NotfindByLastnameNot… where x.lastname <> ?1
InfindByAgeNotIn(Collection ages)… where x.age in ?1
NotInfindByAgeNotIn(Collection ages)… where x.age not in ?1
TruefindByActiveTrue()… where x.active = true
FalsefindByActiveFalse()… where x.active = false
IgnoreCasefindByFirstnameIgnoreCase… where UPPER(x.firstame) = UPPER(?1)

4 完整代码

GitHub:https://github.com/1332508387/boot-jpa

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值