zoukankan      html  css  js  c++  java
  • 4,JPA

    一,什么是JPA

    JPA全称Java Persistence API.JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。

    JPA(Java Persistence API)是Sun官方提出的Java持久化规范。它为Java开发人员提供了一种对象/关系映射工具来管理Java应用中的关系数据。

    二,什么是Spring Data

    Spring Data是一个用于简化数据库访问,并支持云服务的开源框架。其主要目标是使得数据库的访问变得方便快捷,并支持map-reduce框架和云计算数据服务。此外,它还支持基于关系型数据库的数据服务,如Oracle RAC等。对于拥有海量数据的项目,可以用Spring Data来简化项目的开发,就如Spring Framework对JDBC、ORM的支持一样,Spring Data会让数据的访问变得更加方便。

    三,Spring Data JPA

    在Spring Data这个框架中Spring Data JPA只是这个框架中的一个模块,所以名称才叫Spring Data JPA。如果单独使用JPA开发,你会发现这个代码量和使用JDBC开发一样有点烦人,所以Spring Data JPA的出现就是为了简化JPA的写法,让你只需要编写一个接口继承一个类就能实现CRUD操作了。

    四,JPA/Hibernate 关系

    JPA是一种规范,而Hibernate是它的一种实现。除了Hibernate,还有EclipseLink(曾经的toplink),OpenJPA等可供选择,所以使用Jpa的一个好处是,可以更换实现而不必改动太多代码。

    五,使用步骤

    创建一个实体类

    package com.zh.jpa.demo.bean;
     
    import java.util.Date;
     
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
     
    import com.alibaba.fastjson.annotation.JSONField;
    //使用@Entity进行实体类的持久化操作,当JPA检测到我们的实体类当中有
    @Entity
    public class Persion {
        /**
         * 使用@Id指定主键
         * 使用代码@GeneratedValue(strategy=GenerationType.AUTO)
         * 指定主键的生成策略,mysql默认的是自增长。
         */
        @Id @GeneratedValue(strategy=GenerationType.AUTO)
        private int pid;
        private String pname;
        private int age;
        
        @JSONField(format="yyyy-MM-dd HH:mm")
        private Date date;
        
        /*省略get/set方法*/
    }

    (1)在pom.xml添加mysql,spring-data-jpa依赖;

    <!-- 添加MySQL数据库驱动依赖包. -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
     
    <!-- 添加Spring-data-jpa依赖. -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>

    (2)在application.properties文件中配置mysql连接配置文件;

    ########################################################
    ###datasource -- 指定mysql数据库连接信息.
    ########################################################
    spring.datasource.url = jdbc:mysql://192.168.23.129:3306/test1
    spring.datasource.username = root
    spring.datasource.password = 123456
    spring.datasource.driverClassName = com.mysql.jdbc.Driver
    spring.datasource.max-active=20
    spring.datasource.max-idle=8
    spring.datasource.min-idle=8
    spring.datasource.initial-size=10

    3)在application.properties文件中配置JPA配置信息;

    ########################################################
    ### Java Persistence Api --  Spring jpa的配置信息.
    ########################################################
    # Specify the DBMS
    spring.jpa.database = MYSQL
    # Show or not log for each sql query
    spring.jpa.show-sql = true
    # Hibernate ddl auto (create, create-drop, update)
    spring.jpa.hibernate.ddl-auto = update
    # Naming strategy
    #[org.hibernate.cfg.ImprovedNamingStrategy  #org.hibernate.cfg.DefaultNamingStrategy]
    spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy
    # stripped before adding them to the entity manager)
    spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect

    到这步后,右键菜单Run As-->Java Application spring-data-jpa会自动帮我们在数据库自动创建persion这张表

    (4)编写测试例子

    1)创建jpa repository类,操作持久化(CrudRepository)。

    package com.zh.jpa.demo.repository;
     
    import org.springframework.data.repository.CrudRepository;
     
    import com.zh.jpa.demo.bean.Persion;
     
    //CrudRepository第一个参数:实体类的名称
    //CrudRepository第二个参数:主键id类型
    public interface PersionRepository extends CrudRepository<Persion, Integer> {
     
    }

    2)创建PsersionService类。

    package com.zh.jpa.demo.service;
     
    import javax.annotation.Resource;
     
    import org.springframework.stereotype.Service;
    import org.springframework.transaction.annotation.Transactional;
     
    import com.zh.jpa.demo.bean.Persion;
    import com.zh.jpa.demo.repository.PersionRepository;
     
    @Service
    public class PsersionService {
        
        @Resource
        private PersionRepository pr;
        
        /**
         * save,update ,delete 方法需要绑定事务.
         * 使用@Transactional进行事务的绑定.
         */
        // 保存数据.
        @Transactional
        public void save(Persion p) {
            pr.save(p);
        }
     
        // 删除数据
        @Transactional
        public void delete(int id) {
            pr.delete(id);
        }
     
        // 查询数据.
        public Iterable<Persion> getAll() {
            Iterable<Persion> p = pr.findAll();
            return p;
        }
    }

    3)创建PersionController请求类。

    package com.zh.jpa.demo.controller;
     
    import javax.annotation.Resource;
     
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
     
    import com.zh.jpa.demo.bean.Persion;
    import com.zh.jpa.demo.service.PsersionService;
     
    @RestController
    @RequestMapping("/persion")
    public class PersionController {
        
        @Resource
        private PsersionService ps;
        
        @RequestMapping("/save")
        public String save(){
            Persion p = new Persion(1, "zender", 19);
            ps.save(p);
            return "save-OK";
        }
        @RequestMapping("/delete")
        public String delete(){
            ps.delete(1);
            return "delete-OK";
        }
        
        @RequestMapping("/getAll")
        public Iterable<Persion> getAll(){
            return ps.getAll();
        }
    }

    4)测试

    右键菜单Run As-->Java Application,

    向数据库插入一条数据:http://localhost:8080/persion/save

    删除数据:http://localhost:8080/persion/delete

    获取所有插入数据:http://localhost:8080/persion/getAll

    插入4条数据:

       

    六,Spring Boot JPA 步骤总结:

    1、需要添加相应的依赖包;

    2、需要在application.properties文件添加配置信息;

    3、需要创建一个实体类,比如Cat;

    4、需要创建一个接口继承CrudRepository;

    5、需要创建一个Service;

    6、需要创建一个Controller;

    7、代码测试;

    七,Spring Boot JPA接口介绍

    1,Repository接口

    Repository 接口是 Spring Data 的一个核心接口,它不提供任何方法,开发者需要在自己定义的接口中声明需要的方法 :

    public interface Repository<T, ID extends Serializable> { }

    有这么几点需要强调下:

    1. Repository是一个空接口,即是一个标记接口;

    2. 若我们定义的接口继承了Repository,则该接口会被IOC容器识别为一个Repository Bean纳入到IOC容器中,进而可以在该接口中定义满足一定规范的方法。

    3. 实际上也可以通过@RepositoryDefinition,注解来替代继承Repository接口。

    4. 查询方法以find | read | get开头;

    5. 涉及查询条件时,条件的属性用条件关键字连接,要注意的是条件属性以首字母大写。

    6.使用@Query注解可以自定义JPQL语句实现更灵活的查询。

    Repository:

    package com.zh.jpa.demo.repository;
     
    import org.springframework.data.jpa.repository.Query;
    import org.springframework.data.repository.Repository;
    import org.springframework.data.repository.query.Param;
     
    import com.zh.jpa.demo.bean.Persion;
     
    public interface PersionTwoRepository extends Repository<Persion, Integer> {
        /**
         * 查询方法 以 get | find | read 开头.
         */
        //根据name进行查询
        public Persion findBypname(String name);
        //根据id进行查询
        @Query("from Persion where pid=:cn")
        public Persion findMypid(@Param("cn")int id);
    }

    Service:

    package com.zh.jpa.demo.service;
     
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
     
    import com.zh.jpa.demo.bean.Persion;
    import com.zh.jpa.demo.repository.PersionTwoRepository;
    @Service
    public class PersionTwoService {
        @Autowired
        private PersionTwoRepository ptr;
        
        public Persion findByName(String name){
            return ptr.findBypname(name);
        }
        
        public Persion findByID(int id){
            return ptr.findMypid(id);
        }
    }

    Controller:

    package com.zh.jpa.demo.controller;
     
    import javax.annotation.Resource;
     
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
     
    import com.zh.jpa.demo.bean.Persion;
    import com.zh.jpa.demo.service.PersionTwoService;
     
    @RestController
    @RequestMapping("/persion2")
    public class PersionTwoController {
        @Resource
        private PersionTwoService pts;
        
        @RequestMapping("/findByName")
        public Persion findByName(String name){
            System.out.println(name);
            return pts.findByName(name);
        }
        
        @RequestMapping("/findByID")
        public Persion findByName(int id){
            System.out.println(id);
            return pts.findByID(id);
        }
    }

    根据name查询:

    根据id查询:

    表数据:

    2,CrudRepository接口

    CrudRepository 接口提供了最基本的对实体类的添删改查操作

    T save(T entity);

    保存单个实体   

    Iterable<T> save(Iterable<? extends T> entities);

    保存集合         

    T findOne(ID id);

    根据id查找实体          

    boolean exists(ID id);

    根据id判断实体是否存在          

    Iterable<T> findAll();

    查询所有实体,不用或慎用!          

    long count();

    查询实体数量          

    void delete(ID id);

    根据Id删除实体          

    void delete(T entity);

    删除一个实体   

    void delete(Iterable<? extends T> entities);

    删除一个实体的集合          

    void deleteAll();

    删除所有实体,不用或慎用!

    3,PagingAndSortingRepository接口

    该接口提供了分页与排序功能

    Iterable<T> findAll(Sort sort);

    排序

    Page<T> findAll(Pageable pageable);

    分页查询(含排序功能)

    PersionPageRepository:

    package com.zh.jpa.demo.repository;
     
    import org.springframework.data.repository.PagingAndSortingRepository;
     
    import com.zh.jpa.demo.bean.Persion;
     
    public interface PersionPageRepository extends PagingAndSortingRepository<Persion, Integer> {
     
    }

    PersionPageService:

    package com.zh.jpa.demo.service;
     
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
     
    import com.zh.jpa.demo.bean.Persion;
    import com.zh.jpa.demo.repository.PersionPageRepository;
     
    @Service
    public class PersionPageService {
        @Autowired
        private PersionPageRepository ppr;
        //分页查询
        public Iterable<Persion> pagePersion(int pageNumber,int pageSize){
            return ppr.findAll(new PageRequest(pageNumber, pageSize));
        }
    }

    PersionPageController:

    package com.zh.jpa.demo.controller;
     
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
     
    import com.zh.jpa.demo.bean.Persion;
    import com.zh.jpa.demo.service.PersionPageService;
     
    @RestController
    @RequestMapping("page")
    public class PersionPageController {
        @Autowired
        private PersionPageService pps;
        @RequestMapping("/pagePersion")
        public Iterable<Persion> pagePersion(int pageNumber, int pageSize){
            return pps.pagePersion(pageNumber, pageSize);
        }
    }

    分页查询:

    4,其他接口

    JpaRepository:查找所有实体,排序、查找所有实体,执行缓存与数据库同步

    JpaSpecificationExecutor:不属于Repository体系,实现一组 JPA Criteria 查询相关的方法,封装 JPA Criteria 查询条件。通常使用匿名内部类的方式来创建该接口的对象。

  • 相关阅读:
    centos7下redis6的安装
    Centos MySQL 5.7安装、升级教程
    Python之SSH-paramiko模块的使用
    Linux进程管理工具之Supervisor的使用
    Python-RPC框架之-ZeroRPC和SimpleXMLRPCServer
    Django入门--简单的form验证
    redis常用指令
    MySQL自增主键ID重新排序
    批量微博删除脚本
    解决springboot2.x集成redis节点故障redisTemplate报错redis Command timed out
  • 原文地址:https://www.cnblogs.com/Zender/p/7110934.html
Copyright © 2011-2022 走看看