Spring-Data-JPA 一日游

如题,就是折腾了一天JPA,记录一下一些非常常用的方法,免得以后忘了

 

配置文件(SpringBoot)

spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/mysql?useUnicode=true&characterEncoding=utf8
spring.datasource.username=username
spring.datasource.password=password

spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true

其中

spring.jpa.hibernate.ddl-auto=update 是指没有就升级,有就新增,从表到数据都是同理

spring.jpa.show-sql=true 是显示SQL到控制台

另外URL中的

useUnicode=true&characterEncoding=utf8 是用来显示中文


 

 

 

Entity

@EntityListeners(AuditingEntityListener.class)
@Entity
public class BlogComment {
    @Id
    @GeneratedValue
    private Integer id;
    private Integer cardId;
    private String name;
    private String message;
    @CreatedDate
    private Date createdDate;
}

其中

@Id 会把ID设为主键

@GeneratedValue 主键自增长

 

如果需要实现自动生成createdDate 或者LastModifiedDate 需要以下内容

@EntityListeners(AuditingEntityListener.class) 和 @CreatedDate搭配

还需要在启动类前面加 @EnableJpaAuditing​ 才能生效

另外@LastModifiedDate​与之同理

 

而@Entity是必选项

与另一个类搭配使用 JpaRepository

 

搭配过后有3种用法

1 空白的JpaRepository

public interface BlogCommentRepository extends JpaRepository<BlogComment, Integer> {

}

这样可以使用基本款

 

例如 save findAll  findById

 

2 自定义的实现方式 可以解锁高级用法

public interface BlogCommentRepository extends JpaRepository<BlogComment, Integer> {
    Long countAllByCardId(Integer cardId);
    List<BlogComment> findAllByCardIdOrderByIdDesc(Integer cardId);
}

这里全靠名字来生成最终的sql语句,所以不需要写一句sql

例如

countAllByCardId 是计数器 返回指定CardId的数据有几条

findAllByCardIdOrderByIdDesc 是只查询所有数据 通过指定CardId 另外按照id排序 倒序

还可以同idea的自动补全

 

 

3 自己写SQL

参考

https://blog.csdn.net/chemmuxin1993/article/details/52839795

https://blog.csdn.net/zhuzhu81/article/details/77745400

分为两种情况

select

@Query("select u from User u where u.sex=:sex")
public List<User> getUsersBySex(@Param("sex") String sex);


@Query("select u from User u where u.sex=?1")
public List<User> getUsersBySex(String sex);

这里还分为两种传参方式

第一种的 “@Param("sex")” 与SQL中的 :sex 对应

第二种 ?1 就是第一个参数

 

insert / update

@Transactional
@Modifying(clearAutomatically = true)
@Query("update BlogPageInfo set read_count = read_count + 1 where card_id = ?1")
Integer addCountById(Integer cardId);

这里的巨坑就是注解

@Transactional  首先必须加事务 否则炸

@Modifying(clearAutomatically = true) 然后必须加这条 否则执行一次就炸,这条意思是执行完成后自动清理实体类

 

还有个隐藏巨坑是表名 必须是类名,不可以是真的表名

例如 正确的是 BlogPageInfo  错误的是 blog_page_info

原因是jpa和hibernate有一腿,hibernate就是这么玩的,所以jpa也得这么玩。。。

 

 

 

 

赠人玫瑰 手留余香
nginx + tomcat 实现二级域名
SS客户端教程
立即登录, 发表评论.
没有帐号? 立即注册
0 条评论