zoukankan      html  css  js  c++  java
  • 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);
    
  • 相关阅读:
    C#发送邮件的实现实例解析
    抄录一下别人的经验
    centos学习一
    关于百度地图API批量转换成坐标的方法
    js和PHP等脚本语言for循环和if语句里面定义变量的作用域
    关于js中去取数组中的重复字符串
    关于handler返回的数据处理
    通过定义任务委托的方法处理 action
    关于点击按钮图片左右切换的随笔
    关于网站内容分享到新浪微博等的代码
  • 原文地址:https://www.cnblogs.com/xiaotaoqi/p/9223330.html
Copyright © 2011-2022 走看看