zoukankan      html  css  js  c++  java
  • springboot集成Spring Data JPA数据查询

    1、JPA介绍

    JPA(Java Persistence API)是Sun官方提出的Java持久化规范。它为Java开发人员提供了一种对象/关联映射工具来管理Java应用中的关系数据。它的出现主要是为了简化现有的持久化开发工作和整合ORM技术

    Spring data jpa是在JPA规范下提供了Repository层的实现。虽然ORM框架都实现了JPA规范,但是在不同的ORM框架之间切换仍然需要编写不同的代码,而通过使用Spring data jpa能够方便大家在不同的ORM框架之间进行切换而不要更改代码,使代码看上去更加优雅,并且spring data jpa 对Repository层封装的很好,也省去了不少的麻烦。

    2、springboot集成

      pom依赖:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>

      配置文件添加:

    #jpa配置
        jpa:
            database: mysql
            show-sql: true
            hibernate:
                ddl-auto: update
            properties:
                hibernate.format_sql: true
                hibernate.naming.physical-strategy: org.hibernate.config.model.naming.PhysicalNamingStrategyStandardImpl
                hibernate.cache.use_second_level_cache: false
                hibernate.search.default.directory_provider: filesystem
                hibernate.search.default.indexBase: ${user.dir}/indexes

    部分说明:

    hibernate.hbm2ddl.auto参数的作用主要用于:自动创建|更新|验证数据库表结构。
      create:每次加载hibernate时都会删除上一次的生成的表,然后根据你的model类再重新来生成新表,哪怕两次没有任何改变也要这样执行,这就是导致数据库表数据丢失的一个重要原因。
      create-drop :每次加载hibernate时根据model类生成表,但是sessionFactory一关闭,表就自动删除。
      update:最常用的属性,第一次加载hibernate时根据model类会自动建立起表的结构(前提是先建立好数据库),以后加载hibernate时根据 model类自动更新表结构,即使表结构改变了但表中的行仍然存在不会删除以前的行。要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等 应用第一次运行起来后才会。
      validate :每次加载hibernate时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。


    关键代码
    package com.example.springbootjpa.repository;
    
    import com.example.springbootjpa.domain.User;
    import org.springframework.data.jpa.repository.JpaRepository;
    import org.springframework.data.jpa.repository.Query;
    import org.springframework.data.repository.query.Param;
    
    import java.util.List;
    
    public interface UserRepository extends JpaRepository<User, Integer> {
    
        List<User> findAllBy();
    
        User findByUserId(Integer userId);
    
        //@Query 注解,并提供一个查询语句作为参数,Spring Data JPA 在创建代理对象时,便以提供的查询语句来实现其功能。
        @Query("from User where user_name = :username")
        User findUser(@Param("username") String name);
    }
    Spring Data JPA 在后台为持久层接口创建代理对象时,会解析方法名字,并实现相应的功能。除了通过方法名字以外,它还可以通过如下两种方式指定查询语句:
    Spring Data JPA 可以访问 JPA 命名查询语句。开发者只需要在定义命名查询语句时,为其指定一个符合给定格式的名字,Spring Data JPA 便会在创建代理对象时,使用该命名查询语句来实现其功能。

    测试代码:
    @Controller
    public class UserController {
    
        @Autowired
        private UserService userService;
    
        @GetMapping(value = "listUser")
        @ResponseBody
        public List<User> listUser() {
            User byUserId = userService.findByUserId(1);
            User fjw = userService.findUser("hzq");
            return userService.listUser();
        }
    }

    最终测试查询sql如下:
    Hibernate: 
        select
            user0_.user_id as user_id1_0_,
            user0_.user_name as user_nam2_0_ 
        from
            user user0_ 
        where
            user0_.user_id=?
    Hibernate: 
        select
            user0_.user_id as user_id1_0_,
            user0_.user_name as user_nam2_0_ 
        from
            user user0_ 
        where
            user_name=?
    Hibernate: 
        select
            user0_.user_id as user_id1_0_,
            user0_.user_name as user_nam2_0_ 
        from
            user user0_

    源码参照:springboot集成JPA

  • 相关阅读:
    BZOJ 4033: [HAOI2015]树上染色 (树形DP)
    BZOJ 1820: [JSOI2010]Express Service 快递服务 DP
    BZOJ 4664: Count 插块DP
    BZOJ 1899: [Zjoi2004]Lunch 午餐 DP
    BZOJ 4559 [JLoi2016]成绩比较 (DP+拉格朗日插值)
    BZOJ1485 [HNOI2009] 有趣的数列 (卡特兰数)
    BZOJ 2111 / Luogu P2606 [ZJOI2010]排列计数
    20190915模拟赛
    深海机器人问题
    太空飞行计划问题
  • 原文地址:https://www.cnblogs.com/kingsonfu/p/10391465.html
Copyright © 2011-2022 走看看