资讯专栏INFORMATION COLUMN

SpringBoot2.0之三 优雅整合Spring Data JPA

ningwang / 3217人阅读

摘要:的配置后在其他低版本的中也有使用这种配置的,具体根据版本而定。等注解是的相关知识,后面的文章将详细讲述。

  在我们的实际开发的过程中,无论多复杂的业务逻辑到达持久层都回归到了“增删改查”的基本操作,可能会存在关联多张表的复杂sql,但是对于单表的“增删改查”也是不可避免的,大多数开发人员对于这个简单而繁琐的操作都比较烦恼。

  为了解决这种大量枯燥的简单数据库操作,大致的解决该问题的有三种方式
1、使用类似Hibernate的ORM框架,通过Hibernate完成java实体类和数据库之间的映射,完成简单的单表的“增删改查”

2、使用代码生成工具生成单表的“增删改查”代码,省去我们手动编写的过程(我将在后面的文章中给出可定制化生成代码方法,敬请关注!)

3、使用Spring-data-jpa这样的技术,它实现了模板Dao层,只需要在Dao,通过继承一个接口,就可轻松完成“增删改查”,具体使用方法如下:

一、在pom.xml文件中添加如下依赖


    org.springframework.boot
    spring-boot-starter-data-jpa

二、在application.yml文件中配置数据库信息和jpa信息(注意:不同的SpringBoot版本jpa配置的方法可能会有不同)

spring:    
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8
    username: root

    password: 123456

  jpa:
    hibernate:
      ddl-auto: update

  个人推荐使用yml格式的配置文件,看起来更加清晰简单(注意:每个配置属性的缩进是两个空格,这点一定要注意,不然会出现配置错误的情况,也可以在开发工具中安装相关的yml的插件方便查看)。

jpa的配置后 jpa.hibernate.ddl-auto= update,在其他低版本的SpringBoot中也有使用spring.jpa.properties.hibernate.hbm2ddl.auto=create-drop 这种配置的,具体根据版本而定。该配置的主要作用是:自动创建、更新、验证数据库结构

1、create:每次加载hibernate时都会删除上一次的生成的表,然后根据你的model类再重新来生成新表,哪怕两次没有任何改变也要这样执行,这就是导致数据库表数据丢失的一个重要原因(一般只会在第一次创建时使用)

2、create-drop:每次加载hibernate时根据model类生成表,但是sessionFactory一关闭,表就自动删除

3、update:最常用的属性,第一次加载hibernate时根据model类会自动建立起表的结构(前提是先建立好数据库),以后加载hibernate时根据model类自动更新表结构,即使表结构改变了但表中的行仍然存在不会删除以前的行。要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等应用第一次运行起来后才会

4、validate:每次加载hibernate时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值

三、创建实体

创建一个User类,配置好上面的信息后,启动项目,对应的数据库就会自动生成对应的表结构。@Table、@Entity、@Id等注解是jpa的相关知识,后面的文章将详细讲述。

@Table(name = "t_user")
@Entity
public class User {
    @Id
    @GeneratedValue

    private Long id;

    @Column
    private String name;//姓名
    
    @Column
    private Integer age;//年龄

     // .....
}

四、创建数据库访问Dao层

@Repository
public interface UserRepository  extends JpaRepository{

    /**
     * 根据年纪查询用户
     * @param age
     * @return
     */
    User findByAge(Integer age);

    /**
     * 根据年纪和姓名查询
     * @param name
     * @param age
     * @return
     */
    User findByNameAndAge(String name, Integer age);

    /**
     * 对于复杂查询可以使用@Query 编写sql
     * @param name
     * @return
     */
    @Query("from User u where u.name=:name")
    User findUser(@Param("name") String name);
    
}

  该Dao成继承了JpaRepository接口,指定了需要操作的实体对象和实体对象的主键类型,通过查看JpaRepository接口源码可以看到,里面已经封装了创建(save)、更新(save)、删除(delete)、查询(findAll、findOne)等基本操作的函数,使用起来非常方便了,但是还是会存在一些复杂的sql,spring-data-jpa还提供了一个非常方便的方式,通过实体属性来命名方法,它会根据命名来创建sql查询相关数据,对应更加复杂的语句,还可以用直接写sql来完成,具体例子如上所示。

五、单元测试
使用junit进行单元测试,代码如下

/**
 * 
 * @author 明天的地平线
 * 
 * SpringBoot 之前的版本配置单元测试类时使用       @SpringApplicationConfiguration(Application.class)
 * SpringBoot 1.5.9  改用@SpringBootTest(classes = Application.class)
 * 
 */
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = Application.class)
public class JpaTest {

    @Autowired
    private UserRepository userRepository;
    
    /**
     * 新增用户
     * @throws Exception
     */
    @Test
    public void testAddUser() throws Exception {
        User user = new User();
        user.setName("zhangsan");
        user.setAge(12);
        userRepository.save(user);
        
        User user2 = new User();
        user2.setName("lishi");
        user2.setAge(22);
        userRepository.save(user2);
    }
    
    /**
     * 删除用户(根据对象删除时,必须要有ID属性)
     * @throws Exception
     */
    @Test
    public void testDelUser() throws Exception {
        User user = new User();
        user.setId(1L);
        user.setName("zhangsan");
        user.setAge(12);
        userRepository.delete(user);
    }
    
    /**
     * 修改用户信息
     * @throws Exception
     */
    @Test
    public void testUpdUser() throws Exception {
        User user = new User();
        user.setId(2L);
        user.setName("zhangsan11");
        user.setAge(122);
        userRepository.save(user);
    }
    
    /**
     * 查询用户
     * @throws Exception
     */
    @Test
    public void testQueryUser() throws Exception {
        User user = userRepository.findByAge(22);
        System.out.println(user.getName());
        
        User user2 = userRepository.findByNameAndAge("lishi", 22);
        System.out.println(user2.getName());
        
        User user3 = userRepository.findUser("zhangsan11");
        System.out.println(user3.getName());
    }
    
    /**
     * 查询所有用户
     * @throws Exception
     */
    @Test
    public void testQueryUserList() throws Exception {
        List list = userRepository.findAll();
        for (User user : list) {
            System.out.println(user.getName());
        }
    }
    

}

数据库数据如下:

  本文主要以SpringBoot整合jpa为主,Spring-data-jpa的内容远比以上内容丰富和强大,例如分页排序、对原生sql的支持等,后续将对此内容进行专门讲解,感兴趣的小伙伴可以关注我的博客和微信公众号。

Git代码地址:https://gitee.com/Somta/Sprin...
原文地址:http://somta.com.cn/#/blog/vi...

本文由明天的地平线创作,如想了解更多更详细的内容,请关注一下公众号,公众号内将进行最新最实时的更新!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/69754.html

相关文章

  • SpringBoot2.0之五 优雅整合SpringBoot2.0+MyBatis+druid+Pa

    摘要:当禁用时,所有关联对象都会即时加载。不同的驱动在这方便表现不同。参考驱动文档或充分测试两种方法来决定所使用的驱动。需要适合的驱动。系统默认值是设置字段和类是否支持驼峰命名的属性。   上篇文章我们介绍了SpringBoot和MyBatis的整合,可以说非常简单快捷的就搭建了一个web项目,但是在一个真正的企业级项目中,可能我们还需要更多的更加完善的框架才能开始真正的开发,比如连接池、分...

    hatlonely 评论0 收藏0
  • 基于 SpringBoot2.0+优雅整合 SpringBoot+Mybatis

    摘要:基于最新的,是你学习的最佳指南。驱动程序通过自动注册,手动加载类通常是不必要。由于加上了注解,如果转账中途出了意外和的钱都不会改变。三的方式项目结构相比于注解的方式主要有以下几点改变,非常容易实现。公众号多篇文章被各大技术社区转载。 Github 地址:https://github.com/Snailclimb/springboot-integration-examples(Sprin...

    gghyoo 评论0 收藏0
  • 我就是不看好jpa

    摘要:要是紧急排查个问题,妈蛋虽然有很多好处,比如和底层的无关。你的公司如果有,是不允许你乱用的。 知乎看到问题《SpringBoot开发使用Mybatis还是Spring Data JPA??》,顺手一答,讨论激烈。我实在搞不懂spring data jpa为啥选了hibernate作为它的实现,是Gavin King的裙带关系么?DAO层搞来搞去,从jdbc到hibernate,从top...

    NusterCache 评论0 收藏0
  • Spring Boot 中 crud如何优雅的实现-附代码

    摘要:以下内容基于如果你使用的也是相同的技术栈可以继续往下阅读,如果不是可以当作参考。编写的四种方式裸写最简单最粗暴也是使用最多的一种方式,在写的多了之后可以用生成工具生成。 导读 在目前接触过的项目中大多数的项目都会涉及到: crud相关的操作, 哪如何优雅的编写crud操作呢?带着这个问题,我们发现项目中大量的操作多是 创建实体 、删除实例、 修改实体、 查询单个实体、 分页查询多个实体...

    wing324 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<