对于总是使用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);