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);
posted @ 2018-06-25 10:57  小淘气儿  阅读(438)  评论(0编辑  收藏  举报