• Spring Boot 初体验(5)Spring Data JPA


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

    Spring Data JPA: 可以极大的简化JPA的写法,可以在几乎不用写实现的情况下,实现对数据的访问和操作。除了CRUD外,还包括如分页、排序等一些常用的功能。

    Spring Data是一个开源框架,在这个框架中Spring Data JPA只是这个框架中的一个模块,所以名称才叫Spring Data JPA。

    Spring Data JPA的出现让你只需要编写一个接口继承一个类就能实现CRUD操作了

    Spring Data 的一个核心接口为我们提供了常用的接口,在这节我们就来简单介绍下。

        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. 涉及查询条件时,条件的属性用条件关键字连接,要注意的是条件属性以首字母大写。[下面代码中的findByDname方法]

    6.使用@Query注解可以自定义JPQL语句实现更灵活的查询。【类似与hibernate的HQL语句】

    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();//删除所有实体,不用或慎用!   

    PagingAndSortingRepository接口

    该接口提供了分页与排序功能 --Iterable<T> findAll(Sort sort); //排序

    --Page<T> findAll(Pageable pageable); //分页查询(含排序功能)

    其他接口:

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

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

    自定义 Repository:可以自己定义一个MyRepository接口。

    一:添加数据库驱动依赖   Spring Data JPA依赖

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>SpringBoot_001</groupId>
        <artifactId>SpringBoot_001</artifactId>
        <packaging>war</packaging>
        <version>0.0.1-SNAPSHOT</version>
        <name>SpringBoot_001 Maven Webapp</name>
        <url>http://maven.apache.org</url>
        <!-- 继承父包 -->
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>1.4.1.RELEASE</version>
        </parent>
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <java.version>1.7</java.version>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.hibernate</groupId><!--解决只引用spring-boot-starter-web时启动缺少JPA 
                    validator的Bug -->
                <artifactId>hibernate-validator</artifactId>
                <version>5.3.0.Final</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
            <dependency><!-- fastjson依赖 -->
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>1.2.47</version>
            </dependency>
            <dependency><!-- devtools依赖 -->
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-devtools</artifactId>
                <optional>true</optional>
                <scope>true</scope>
            </dependency>
    
    
            <dependency><!-- oracle依赖 -->
                <groupId>com.oracle</groupId>
                <artifactId>ojdbc7</artifactId>
                <version>12.1.0.2</version>
            </dependency>
            <dependency><!-- data jpa配置信息 -->
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-jpa</artifactId>
            </dependency>
    
        </dependencies>
        <build>
            <finalName>SpringBoot_001</finalName>
    
            <plugins>
                <plugin><!-- devtools构建依赖 -->
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <!-- <configuration> 如果devtools不起作用,加上此项配置 <fork>true</fork> </configuration> -->
                </plugin>
            </plugins>
    
        </build>
    </project>
    View Code

    二:在application.properties文件中   配置数据库连接配置信息以及JPA配置信息

    ########################################################
    ###datasource
    ########################################################
    spring.datasource.url = jdbc:oracle:thin:@127.0.0.1:1521/orcl
    spring.datasource.username = bookshop
    spring.datasource.password = bookshop
    spring.datasource.driverClassName = oracle.jdbc.driver.OracleDriver
    spring.datasource.max-active=20
    spring.datasource.max-idle=8
    spring.datasource.min-idle=8
    spring.datasource.initial-size=10
    ########################################################
    ### Java Persistence Api
    ########################################################
    # Specify the DBMS
    spring.jpa.database = ORACLE
    # 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.OracleDialect
    View Code

    (1) 创建实体类。

    package com.mt.dog.entity;
    
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    
    import org.hibernate.annotations.GenericGenerator;
    
    /**
     * 
     * @ClassName: Dog
     * @Description: 实体
     * @author Comsys-MoTing
     * @date 2018年10月24日 下午10:17:33
     *
     */
    @Entity
    public class Dog
    {
        @Id
        @GeneratedValue(generator = "id")
        @GenericGenerator(name = "id", strategy = "native")
        private Long id;
        
        private String dname;
        
        private int age;
        
        public Long getId()
        {
            return id;
        }
        
        public void setId(Long id)
        {
            this.id = id;
        }
        
        public String getDname()
        {
            return dname;
        }
        
        public void setDname(String dname)
        {
            this.dname = dname;
        }
        
        public int getAge()
        {
            return age;
        }
        
        public void setAge(int age)
        {
            this.age = age;
        }
        
    }
    View Code

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

    package com.mt.dog.repository;
    
    import org.springframework.data.jpa.repository.Query;
    import org.springframework.data.repository.CrudRepository;
    import org.springframework.data.repository.query.Param;
    
    import com.mt.dog.entity.Dog;
    
    /**
     * 涉及查询条件时,条件的属性用条件关键字连接,要注意的是条件属性以首字母大写。
     * @ClassName: DogRepository
     * @Description: Dog的Repository层(相当于DAO层)继承CrudRepository 此处不应加注解后面可以直接使用
     * @author Comsys-MoTing
     * @date 2018年10月24日 下午10:19:58
     *
     */
    public interface DogRepository extends CrudRepository<Dog, Long> {
    
        @Query("from Dog where dname=:nn")
        public Dog getByDname(@Param("nn") String bname);
    
    }
    View Code

    (3) 创建service类。

    package com.mt.dog.service;
    
    import java.util.List;
    
    import javax.annotation.Resource;
    
    import org.springframework.stereotype.Service;
    import org.springframework.transaction.annotation.Transactional;
    
    import com.mt.dog.entity.Dog;
    import com.mt.dog.repository.DogRepository;
    
    /**
     * 
     * @ClassName: DogService
     * @Description:
     * @author Comsys-MoTing
     * @date 2018年10月24日 下午10:22:04
     *
     */
    @Service
    @Transactional
    public class DogService {
        @Resource
        private DogRepository dogRepository;
    
        public Dog findById(Long id) {
            return dogRepository.findOne(id);
        }
    
        public Dog findByName(String bname) {
            return dogRepository.getByDname(bname);
        }
    
        public List<Dog> findAll() {
            return (List<Dog>) dogRepository.findAll();
        }
    
        public String deleteDog(Long id) {
            dogRepository.delete(id);
            return "delete ok";
        }
    
        public String saveDog() {
            Dog dog = new Dog();
            dog.setAge(45);
            dog.setDname("tt" + Math.random() * 10000);
            dogRepository.save(dog);
            return "save ok";
        }
    }
    View Code

    (4) 创建restful请求类。

    package com.mt.dog.controller;
    
    import java.util.List;
    
    import javax.annotation.Resource;
    
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    import com.mt.dog.entity.Dog;
    import com.mt.dog.service.DogService;
    
    @RestController
    public class DogController {
        @Resource
        private DogService dogService;
    
        @RequestMapping("/findByID")
        public Dog findById(Long id) {
            return dogService.findById(id);
        }
    
        @RequestMapping("/findByDname")
        public Dog findByDname(String dname) {
            return dogService.findByName(dname);
        }
    
        @RequestMapping("/findAll")
        public List<Dog> findAll() {
            return dogService.findAll();
        }
    
        @RequestMapping("/deleteDog")
        public String deleteDog(Long id) {
            dogService.deleteDog(id);
            return "delete ok";
        }
    
        @RequestMapping("/saveDog")
        public String saveDog() {
            dogService.saveDog();
            return "save ok";
        }
    }
    View Code

    (5) 测试;

    一个走投无路的庄稼汉
  • 相关阅读:
    [CareerCup] 1.4 Replace Spaces 替换空格
    [CareerCup] 1.3 Permutation String 字符串的排列
    Android @1x,@2x,@3x 资源文件自动分包工具
    Android 使用xml实现边框阴影,背景渐变效果(附有RGB颜色查询对照表)
    Android中快速实现自定义字体!
    Android AS升级3.1 编译报错:The SourceSet 'instrumentTest' is not recognized by the Android Gradle Plugin.
    Android getRunningTasks和getRunningAppProcesses失效
    Android 实现朋友圈有图片和视频
    Android 仿微信朋友圈拍小视频上传到服务器
    Android setUserVisibleHint-- fragment真正的onResume和onPause方法
  • 原文地址:https://www.cnblogs.com/kuangyefeige/p/9846916.html
Copyright © 2020-2023  润新知