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

 package com.jmper.blog.entity;

 import lombok.Data;

 import javax.persistence.*;
import java.io.Serializable;
import java.time.LocalDateTime; /**
* 留言
*
* @author jmper
* @version 1.0 (createTime:2018-06-18 17:32:57)
*/
@Data
@Entity
@Table(name = "j_message")
public class Message implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(name = "name",nullable = false,length = 10)
private String name;
@Column(name = "email",nullable = false,length = 30)
private String email;
@Column(name = "content",nullable = false,columnDefinition = "TEXT")
private String content;
@Column(name = "create_time",nullable = false,columnDefinition = "DATETIME")
private LocalDateTime createTime; }

@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);

spring-data-jpa 简单使用心得的更多相关文章

  1. Spring Data JPA 简单查询--接口方法

    一.接口方法整理速查 下表针对于简单查询,即JpaRepository接口(继承了CrudRepository接口.PagingAndSortingRepository接口)中的可访问方法进行整理.( ...

  2. JAVA入门[20]-Spring Data JPA简单示例

    Spring 对 JPA 的支持已经非常强大,开发者只需关心核心业务逻辑的实现代码,无需过多关注 EntityManager 的创建.事务处理等 JPA 相关的处理.Spring Data JPA更是 ...

  3. Spring Data JPA简单使用

    用Spring Data JPA操作数据库 这份教程教你用Spring Data JPA从关系数据库mysql中存储和提取数据.总结来自https://spring.io/guides/gs/acce ...

  4. spring data jpa 简单使用

    通过解析方法名创建查询 通过前面的例子,读者基本上对解析方法名创建查询的方式有了一个大致的了解,这也是 Spring Data JPA 吸引开发者的一个很重要的因素.该功能其实并非 Spring Da ...

  5. Spring Data JPA简单查询接口方法速查

    下表针对于简单查询,即JpaRepository接口(继承了CrudRepository接口.PagingAndSortingRepository接口)中的可访问方法进行整理.(1)先按照功能进行分类 ...

  6. Spring Data Jpa简单了解

    原文来源:http://www.cnblogs.com/xuyuanjia/p/5707681.html 以下是自己简单整理原有文章,其实就是在原来文章基础上化重点以及可能会有所删减的方式进行整理,需 ...

  7. Spring Data JPA 简单查询--方法定义规则

    一.常用规则速查 1  And 并且2  Or  或3  Is,Equals 等于4  Between  两者之间5  LessThan 小于6  LessThanEqual   小于等于7  Gre ...

  8. Spring Data JPA 简单查询

    一.常用规则速查 1  And 并且2  Or  或3  Is,Equals 等于4  Between  两者之间5  LessThan 小于6  LessThanEqual   小于等于7  Gre ...

  9. Spring Data Jpa 简单使用事务

    对于两张表,需要顺序操作,必须全部表均操作成功才可,否则两张表不操作. 例如,现在有device,collectionpoint两张表,向两张表顺序执行insert操作 SQL如下 INSERT IN ...

  10. 【jpa】spring data jpa 配置使用

    1.spring data jpa 简单介绍 jpa是用于对象持久化的API,jpa是一种规范,而其他的ORM框架(hibernate,topLink等)是其实现,所以jpa可以使用不同的实现方式,修 ...

随机推荐

  1. Restframework中常见API的编写方式

    1.框架一(继承APIView) 这里的第一部分使用骨架请参考我的博客(第三篇),它采用了restframework中最基础的办法(APIView)实现了相关请求,以下的框架都是基于它的 2.框架二( ...

  2. 对象API

    遍历对象里的每个元素 var obj ={ a:32, b:12, c :342 } for (const key of obj){ if(obj.hasOwnProperty(key)){ cons ...

  3. 2018 Wannafly summer camp Day2--Utawarerumono

    Utawarerumono 描述 题目描述: 算术是为数不多的会让久远感到棘手的事情.通常她会找哈克帮忙,但是哈克已经被她派去买东西了.于是她向你寻求帮助. 给出一个关于变量x,y的不定方程ax+by ...

  4. 编译安装GCC

    下载GCC包 http://mirror.hust.edu.cn/gnu/gcc/ 解压 .tar.gzcd gcc-4.9.4./contrib/download_prerequisites #下载 ...

  5. 用 jQuery 实现表单验证(转载)

    jQuery 官方 API 地址: http://api.jquery.com/ 在线引用 jQuery:http://code.jquery.com/ ——选自<锋利的jQuery>(第 ...

  6. Python的Bottle框架中实现最基本的get和post的方法的教程

    这篇文章主要介绍了Python的Bottle框架中实现最基本的get和post的方法的教程,Bottle框架在Python开发者中的人气很高,需要的朋友可以参考下 1.GET方式: # -*- cod ...

  7. Volatile的详解

    volatile关键字修饰的共享变量主要有两个特点:1.保证了不同线程访问的内存可见性    2.禁止重排序 在说内存可见性和有序性之前,我们有必要看一下Java的内存模型(注意和JVM内存模型的区分 ...

  8. 数据分析处理库Pandas——时间

    时间戳 向后推的时间戳 备注:五天后的时间. 指定日期和时间 时间的Series结构 按要求显示时间(开始时间,时间间隔,时间个数) 转换为时间格式,并设置时间列为索引列 方法一 方法二 筛选显示 方 ...

  9. PyCharm使用秘籍视频

    PyCharm使用视频上传至企鹅群公告 需要自行添加群获取

  10. 函数名前加 & 符号的深入理解 C++

    #include <iostream> using namespace std; int& test_str() { ; return a; //通过返回 a 的地址来进行 值的返 ...