0
点赞
收藏
分享

微信扫一扫

Spring Data JPA的小使用

玉字璧 2022-04-14 阅读 195

前言:

最近看到一个项目有用到, Spring Data JPA, 今天就简单了解一下, jpa简单使用

这个是和Mybatis的一点对比:

1649666206122

简介:

之前有学Mybatis数据库ORM框架(Object Relational Mapping),也介绍了使用Spring Boot 的jdbcTemplate 操作数据库。其实Spring Boot 还有一个非常实用的数据操作框架:Spring Data JPA。

我们先来个小demo整合一下SpringBoot和SpringDataJPA

SpringBoot整合SpringDataJPA

依赖:

    <dependencies>
        <!--还是那句话, 包不要导重复了, 有些有包含关系-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

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

        <!--mysql-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        
        <!--正常web启动类-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--lombok包-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
            <groupId>javax.ws.rs</groupId>
            <artifactId>javax.ws.rs-api</artifactId>
            <version>2.0.1</version>
        </dependency>
    </dependencies>

application.yaml

spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/jpa
    username: root
    password: #数据库密码
    driver-class-name: com.mysql.cj.jdbc.Driver
  jpa:
    database: MYSQL
    database-platform: org.hibernate.dialect.MySQL57Dialect
    show-sql: true
    hibernate:
      #      ddl-auto: create
      ddl-auto: update
    open-in-view: false
#  jackson:
#    property-naming-strategy: CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES

上面的属性一些小解释:

jpa.hibernate.ddl-auto是hibernate的配置属性,其主要作用是:自动创建、更新、验证数据库表结构。该参数的几种配置如下:

以上我们完成了基本的配置工作,记下来看一下如何进行表与实体的映射,以及数据访问接口。

实体类Person

package com.feng.pojo;


import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.*;


/**
 * @return null
 * @author Ladidol
 * @description
 * @date 2022/4/13 19:42
 */
@Entity(name = "person")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Person {

    @Id//这里id不要导错了, import javax.persistence.Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "name", nullable = true, length = 20)
    private String name;

    @Column(name = "age", nullable = true, length = 4)
    private int age;

}

PersonRepository.java

package com.feng.Repository;

import com.feng.pojo.Person;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;


@Repository
public interface PersonRepository extends JpaRepository<Person, Long> {

    Person findByName(String name);

}

controller:

package com.feng.controller;

import com.feng.Repository.PersonRepository;
import com.feng.pojo.Person;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.jpa.repository.Query;
import org.springframework.web.bind.annotation.*;

import javax.ws.rs.QueryParam;

@RestController
@RequestMapping(value = "person")
public class PerconController {

    @Autowired
    private PersonRepository personRepository;

    @PostMapping(path = "addPerson")
    public void addPerson(@RequestBody Person person) {
        personRepository.save(person);
    }

    @DeleteMapping(path = "deletePerson")
    public void deletePerson(Long id) {
        personRepository.deleteById(id);
    }

}

数据库中原有数据:

image-20220413220451995

结果图:

添加用户:

image-20220413220704669

删除id等于1的ladidol

image-20220413220752303

上面使用的自带方法类:

SQL查询:

repository中声明相关方法:

    @Transactional //开启事务
    @Modifying //识别执行更新操作
    @Query(value = "select * from person where name = ?1",nativeQuery = true)
    Person findMyByName(String name);


    @Transactional //开启事务
    @Modifying //识别执行更新操作
    //利用原生的 SQL 进行查询操作.    ?1 表示第一个参数的占位符
    @Query(value = "select * from person  where name=?1", nativeQuery = true)
    public List<Person> findPersonByName(String name);

    //利用原生的 SQL 进行删除操作
    @Query(value = "delete from person where id=?1 ", nativeQuery = true)
    @Modifying
    @Transactional
    public int deletePersonById(int uid);

    //利用原生的 SQL 进行修改操作
    @Query(value = "update person set name=?1 where id=?2 ", nativeQuery = true)
    @Modifying
    @Transactional
    public int updatePersonName(String name,int id);

    //利用原生的 SQL 进行插入操作
    @Query(value = "insert into person(name,age) value(?1,?2)", nativeQuery = true)
    @Modifying
    @Transactional
    public int insertPerson(String name,int age);

    //利用原生的 SQL 实现姓名的模糊查询
    @Query(value=" SELECT * FROM person WHERE name LIKE %:name% ",nativeQuery=true)
    List<Person> queryBynameSQL(@Param(value = "name") String name);

controller中添加新方法:

一些简单的增删改查

    //原生 sql 的调用

    /**
     * @param name:
     * @return Object
     * @author Ladidol
     * @description 通过名字查询
     * @date 2022/4/13 22:50
     */
    @RequestMapping("/findPersonByName")
    public Object findStuByName(String name) {
        List<Person> person = personRepository.findPersonByName(name);
        return person;
    }


    /**
     * @param id:
     * @return Object
     * @author Ladidol
     * @description 通过id查询
     * @date 2022/4/13 22:50
     */
    @RequestMapping("/deletePersonById")
    public Object deleteStudentById(int id) {
        int i = personRepository.deletePersonById(id);
        Map<String,Object> map=new HashMap<String,Object>();
        if(i>0) {
            map.put("success", true);
        }else {
            map.put("success", false);
        }
        return map;
    }

    /**
     * @param name:
     * @param id:
     * @return Object
     * @author Ladidol
     * @description 通过id修改name
     * @date 2022/4/13 22:50
     */
    @RequestMapping("/updatePersonName")
    public Object updateStudentName(String name,int id) {
        int i = personRepository.updatePersonName(name,id);
        Map<String,Object> map=new HashMap<String,Object>();
        if(i>0) {
            map.put("success", true);
        }else {
            map.put("success", false);
        }
        return map;
    }


    /**
     * @param name:
     * @param age:
     * @return Object
     * @author Ladidol
     * @description 插入新的person
     * @date 2022/4/13 22:51
     */
    @RequestMapping("/insertPerson")
    public Object insertStudent(String name,int age) {
        int i = personRepository.insertPerson(name,age);
        Map<String,Object> map=new HashMap<String,Object>();
        if(i>0) {
            map.put("success", true);
        }else {
            map.put("success", false);
        }
        return map;
    }


    /**
     * @param keyword:
     * @return Object
     * @author Ladidol
     * @description 通过名字中的关键字查询列表
     * @date 2022/4/13 22:51
     */
    @RequestMapping("/queryBynameSQL")
    public Object queryBynameSQL(String keyword) {
        List<Person> person= personRepository.queryBynameSQL(keyword);
        return person;
    }


部分运行结果:

增:

image-20220413225732369

改:

查:

image-20220413225700015

最终数据库中:

image-20220413230435159

这只是一个小入门! 小小了解一下jpa.

jpa自动建表就很nice!

想了解jpql的可以戳这里

END:

参考链接:

链接1

链接2

这是一个神奇的字符串:

6L6T5LqG5L2g77yM6LWi5LqG5LiW55WM5Y+I6IO95aaC5L2V44CC
举报

相关推荐

0 条评论