spring-data-jpa 简单使用心得
对于总是使用mybatis的我,突发奇想的想使用spring-data-jpa搭一个小环境,这几天处处碰壁,现总结如下:
环境采用springboot
maven需要导入:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency>
application.yml简单配置:
spring: jpa: hibernate: ddl-auto: update show-sql: true database-platform: org.hibernate.dialect.MySQL5Dialect datasource: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/blog?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8 username: jmper password: jmper_ming tomcat: max-active: 100 max-idle: 200 initial-size: 20
下面具体使用jpa:
1 package com.jmper.blog.entity; 2 3 import lombok.Data; 4 5 import javax.persistence.*; 6 import java.io.Serializable; 7 import java.time.LocalDateTime; 8 9 /** 10 * 留言 11 * 12 * @author jmper 13 * @version 1.0 (createTime:2018-06-18 17:32:57) 14 */ 15 @Data 16 @Entity 17 @Table(name = "j_message") 18 public class Message implements Serializable { 19 @Id 20 @GeneratedValue(strategy = GenerationType.IDENTITY) 21 private Integer id; 22 @Column(name = "name",nullable = false,length = 10) 23 private String name; 24 @Column(name = "email",nullable = false,length = 30) 25 private String email; 26 @Column(name = "content",nullable = false,columnDefinition = "TEXT") 27 private String content; 28 @Column(name = "create_time",nullable = false,columnDefinition = "DATETIME") 29 private LocalDateTime createTime; 30 31 }
@Entity 标识这是一个orm实体类
@Table 设置映射表名
@Data lombok 注解
@Id标注在主键上,
@GeneratedValue 设置主键生成策略
JPA提供的四种标准用法为TABLE,SEQUENCE,IDENTITY,AUTO.
- TABLE:使用一个特定的数据库表格来保存主键。
- SEQUENCE:根据底层数据库的序列来生成主键,条件是数据库支持序列。
- IDENTITY:主键由数据库自动生成(主要是自动增长型)
- AUTO:主键由程序控制(也是默认的,在指定主键时,如果不指定主键生成策略,默认为AUTO)
请根据实际合理选择主键生成策略
Dao层开发:
1、Repository<T, ID> 父接口
2、CrudRepository<T, ID> extends Repository<T, ID> 增删改查接口
3、QueryByExampleExecutor 根据实例 查询4、PagingAndSortingRepository<T, ID> extends CrudRepository<T, ID> 分页接口
5、JpaRepository<T, ID> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> jpa子接口,包括所有父接口功能
平时采用直接实现JpaRepository接口
例如:
package com.jmper.blog.dao; import com.jmper.blog.entity.Message; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; /** * 留言 * * @author jmper * @version 1.0 (createTime: 2018-06-19 09:25:25) */ public interface MessageRepository extends JpaRepository<Message, Integer> { /** * 整体分页 * * @param pageable 分页 * @return 分页 */ @Override Page<Message> findAll(Pageable pageable); }
此接口中默认存在一套基础curd命令,同时也可以根据特殊的方法名解析成相应的sql语句
例如: findById, findByIdAndEmail 等
如果想自定义sql语句,可以采用@query注解
并利用HQL来编写sql语句,但是HQL不支持limit关键字,需要使用 Pageable参数进行分页处理
Pageable pageable = PageRequest.of(p-1, ps);
或者加上 排序
Sort sort=Sort.by(Sort.Direction.ASC,"field"); Pageable pageable = PageRequest.of(p-1, ps,sort);
也可以使用本地sql
@Query("select m from Message m where m.name=:name") List<Message> findMessagesByName(@Param("name") String name); @Query("select m from Message m where m.id=?1") List<Message> findMessagesById(Integer id,Pageable pageable); @Query(value = "select m.* from j_message m where m.id=?1",nativeQuery = true) List<Message> findMessagesByNativeId(Integer id,Pageable pageable);
需要注意的是:对于返回非Message 也就是,想要返回自定义对象类型(DTO)我采用的方法是hql+new,
因为jpa不支持自定义返回类型。
@Query(value = "select new com.jmper.blog.dto.MessageDto(m) from Message m where m.id=?1") List<MessageDto> findMessagesByNativeId(Integer id,Pageable pageable);