SpringBoot整合JPA访问数据库

1. 什么是JPA

JPA (Java Persistence API) 是 Sun 官方提出的 Java 持久化规范

为 Java 开发人员提供了一种对象/关系映射工具来管理 Java 应用中的关系数据
JPA的出现主要是为了简化现有的持久化开发工作和整合 ORM 技术
具有易于使用,伸缩性强等优点
在这里插入图片描述

Spring Boot JPA

Sprng Boot Jpa 是 Spring 基于 ORM 框架、Jpa 规范的基础上封装的一套 Jpa 应用框架
它提供了包括增删改查等在内的常用功能,且易于扩展
可使开发者用极简的代码即可实现对数据的访问和操作

2. 搭建开发环境

我这里使用的是IntelliJ IDEA 2019.3.2版本,也是目前最新版

1.这个按照自己的要求填写

在这里插入图片描述

2.这里勾选JPA和mysql

在这里插入图片描述

3.选择好路劲自己创建就好了

在这里插入图片描述

4.编写application.properties或者application.yml

+++++++++

spring.datasource.url=jdbc:mysql://localhost:3306/lijie
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sq1=true
5.编写数据库已有的实体类

比如:我数据库中有个pub_user表在这里插入图片描述
实体类就这样编写:
在这里插入图片描述

import javax.persistence.*;
import java.io.Serializable;
import java.time.LocalDate;
import java.time.LocalDateTime;

/**
 * 用户信息表实体类
 *
 * @author LiJie
 * @since 1.0
 * @version 2020-02-08 LiJie
 */
@Entity
@Table(name="pub_user")
public class UserVO implements Serializable {

    
    /** 用户编号 **/
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)	//代表主键
    @Column(name="user_id")
	private Integer userId;
    
    /** 用户名称 **/
    @Column(name="user_name")
    private String userName;
    
    /** 用户帐号 **/
    @Column(name="account")
	private String account;

	........地下省略很多属性及get和set方法。
6.编写dao层访问数据库

DAO 只需要继承 JpaRepository 接口,几乎可以不用写方法, JpaRepository已经包含通用的CRUD操作,类似MyBatis-Plus
在这里插入图片描述

3. 测试增删改查

我这里是使用了SpringBootTest来进行模拟开发环境
在这里插入图片描述

package com.lijie;

import com.lijie.dao.UserJpaRepository;
import com.lijie.model.UserVO;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;

import java.awt.print.Pageable;
import java.util.List;

@SpringBootTest
class SpringbootJpaApplicationTests {

    @Autowired
    UserJpaRepository userJpaRepository;

    @Test
    void contextLoads() {//测试查询全部
        List<UserVO> list=userJpaRepository.findAll();
        for (UserVO user:list ) {
            System.out.println(user.getUserName());
        }
    }

    @Test
    void contextLoads1() {//测试添加
        UserVO userVO = new UserVO();
        userVO.setUserName("问问问问");
        userVO.setAccount("sadassa");
        userVO.setPassword("123456");
        userJpaRepository.save(userVO);
    }

    @Test
    void contextLoads2() {//测试修改
        UserVO userVO = new UserVO();
        userVO.setUserId(9);
        userVO.setUserName("wwwwww");
        userVO.setAccount("sadassa");
        userVO.setPassword("123456");
        userJpaRepository.save(userVO);
    }

    @Test
    void contextLoads3() {//测试删除
        UserVO userVO = new UserVO();
        userVO.setUserId(9);
        //按照对象删除
        userJpaRepository.delete(userVO);
        //按照id删除
        userJpaRepository.deleteById(9);
    }

    @Test
    void contextLoads4() {//测试按照id查询
        UserVO uservo=userJpaRepository.findById(9).get();
        System.out.println(uservo.getUserName());
    }


    /**
     * Spring Boot Jpa 已经帮我们实现了分页的功能,在查询的方法中,需要传入参数Pageable
     * Pageable 是 Spring 封装的分页实现类,使用的时候需要传入页数、每页条数和排序规则
     * 当查询中有多个参数的时候,Pageable建议做为最后一个参数传入
     */
    @Test
    void testPage() {//测试分页查询
        Pageable pageable = PageRequest.of(0,2,new Sort(Sort.Direction.DESC,"userId"));
        Page<UserVO> userPage = userJpaRepository.findAll(pageable);
        for (UserVO user:userPage.getContent()) {
            System.out.println(user.getUserName());
        }
    }
}

4. 自定义简单查询

JPA有一个特别有尿性的功能非常赞,就是可以根据方法名来自动的生成 SQL查询(自定义简单查询),比如findByUsrName(String usrName) 会自动生成一个以 usrName 为参数的查询方法

在dao层添加

在这里插入图片描述

测试

在这里插入图片描述

5. 自定义SQL查询

虽然大部分的 SQL 都可以根据解析方法名的方式来实现,但是由于某些原因我们需要使用自定义的 SQL 来查询

在查询方法上面使用@Query注解
在这里插入图片描述
JPL中使用实体类名和属性名
?1对应方法第一个参数,?2对应第二个参数,以此类推



涉及到删除和修改在需要加上@Modifying,也可以根据需要添加 @Transactional对事物的支持,查询超时的设置等
在这里插入图片描述

发布了40 篇原创文章 · 获赞 47 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43122090/article/details/104442888