SpringDataJpa框架单元测试实现增删改查

使用工具

IDEA2018.2 MySQL5.6 JDK1.8

使用说明

需要在数据库中创建一个数据库,无需创建数据库表
SpringDtataJpa自动生成数据表

使用maven的pom.xml文件

<?xml version="1.0" encoding="UTF-8"?>

<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/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.7.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
  </parent>
  <groupId>com.ming</groupId>
  <artifactId>springbootjpatest</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>springbootjpatest</name>
  <description>Demo project for Spring Boot</description>

  <properties>
    <java.version>1.8</java.version>
  </properties>

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

    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>
</dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
    </plugins>
  </build>
</project>

环境搭建

在这里插入图片描述
在这里插入图片描述

代码示例

java目录

Student.java
package com.vvcat.gitee.bean;

import javax.persistence.*;

@Entity
@Table(name = "student")//数据库表明
public class Student {
    @Id//声明id为主键
    @GeneratedValue(strategy = GenerationType.IDENTITY)//声明自动增长
    @Column(name = "id")//声明数据库对应的字段
    private Integer id;
    @Column(name = "stuName")//声明数据库对应的字段
    //定义字段也是有讲究的,比如首字母小写,后边的驼峰,对应的数据库字段,遇到驼峰用下划线断开
    //比如实体类定义的userName,则数据库字段为user_name,
    //比如实体类定义的username,则数据库字段也为username
    private String stu_name;

    @Column(name = "age")//声明数据库对应的字段
    private Integer age;

    @Column(name = "sex")//声明数据库对应的字段
    private String sex;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getStu_name() {
        return stu_name;
    }

    public void setStu_name(String stu_name) {
        this.stu_name = stu_name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", stu_name='" + stu_name + '\'' +
                ", age=" + age +
                ", sex='" + sex + '\'' +
                '}';
    }

    public Student(String stu_name, Integer age, String sex) {
        this.stu_name = stu_name;
        this.age = age;
        this.sex = sex;
    }

    public Student() {
    }


}
IStuDao.java
package com.vvcat.gitee.dao;

import com.vvcat.gitee.bean.Student;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;


import java.util.List;

/**
 * @Author ꧁ʚVVcatɞ꧂
 * @Date 2019/10/23 14:13
 * @Version 1.0
 **/
public interface  IStuDao extends JpaRepository<Student, String> {

    //模糊查询姓名
    @Query("SELECT stu FROM Student stu WHERE stu_name LIKE ?1")
    List<Student> findByNameLike(String name);



}
IStudentDao.java
package com.vvcat.gitee.dao;

import com.vvcat.gitee.bean.Student;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * @Author ꧁ʚVVcatɞ꧂
 * @Date 2019/10/23 15:19
 * @Version 1.0
 **/
public interface IStudentDao extends JpaRepository<Student, Integer> {

    //查询数据库中全部的数据
    @Transactional //纳入事务管理
    @Modifying  // 对表进行修改操作 需要调用该注解
    @Query("SELECT stu FROM Student stu")
    // 注意表的大小写 要跟 IBaseDao<Student,Integer> 中的参数一致
    List<Student> findAll();

    //删除对应的ID信息
    @Transactional
    @Modifying  // 对表进行修改操作 需要调用该注解
    @Query("DELETE FROM Student WHERE id = ?1")
    // 注意表的大小写 要跟 IBaseDao<Student,Integer> 中的参数一致
    void testDeleteSql(@Param("id") Integer id);


}
App.java
package com.vvcat.gitee;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;


/**
 * Hello world!
 *
 */

@SpringBootApplication
public class App
{
    public static void main( String[] args )
    {
        SpringApplication.run(App.class, args);
    }
}

resources目录

hibernate:
ddl-auto: 参数

参数 描述
validate 项目启动表结构进行校验 如果不一致则报错
create 启动时删数据库中的表,然后创建,退出时不删除数据表
create-drop 启动时删数据库中的表,然后创建,退出时删除数据表 如果表不存在报错
update 最常用的属性,第一次加载hibernate时根据model类会自动建立起表的结构(前提是先建立好数据库),以后加载hibernate时根据 model类自动更新表结构,即使表结构改变了但表中的行仍然存在不会删除以前的行。
application.yml
server:
  port: 8080
  servlet:
    context-path: /
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/item?serverTimezone=UTC
    username: root
    password: 123456
  jpa:
    database: MySQL
    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect #mysql数据库固定配置
    show-sql: true #控制台打印sql
    hibernate:
      ddl-auto: update #update代表数据库没有表的话,会先创建表,有表的话就不创建了。

test目录

AppTest.java
package com.vvcat.gitee;


import com.vvcat.gitee.bean.Student;
import com.vvcat.gitee.dao.IStuDao;
import com.vvcat.gitee.dao.IStudentDao;
import org.junit.Test;
import org.junit.runner.RunWith;
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.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

/**
 * Unit test for simple App.
 */
@RunWith(SpringRunner.class)
@SpringBootTest
public class AppTest
{
    @Autowired
    private IStuDao stuDao;

    @Autowired
    private IStudentDao studentDao;

    /**
     * 增加方法
     */
    @Test
    public void testAdd(){
        Student student = new Student();
        student.setStu_name("vvcat");
        student.setAge(18);
        student.setSex("男");
        stuDao.save(student);
    }

    /**
     * 批量增加
     */
    @Test
    public void testAddList(){
        List<Student> stuList = new ArrayList<>();
        for(int i=0 ; i < 10 ;i++){
            Student stu = new Student();
            stu.setStu_name("VVcat" + i);
            stu.setAge(i);
            stu.setSex("男");
            stuList.add(stu);
        }
        stuDao.saveAll(stuList);
    }

    /**
     * 通过主键查找
     */
    @Test
    public void testFindById(){
        Optional<Student> optionalStudent = studentDao.findById(1);
        Student stu = optionalStudent.get();
        System.out.println(stu);
    }


    /**
     * 查询所有 如果想通过条件查询,可以根据上边的方式查询。
     */
    @Test
    public void testFindAll(){
        List<Student> stuList = stuDao.findAll();
        for(Student stu : stuList){
            System.out.println(stu);
        }
    }

   /**
     * 分页排序查询
     * page,第几页,从0开始,默认为第0页
     * size,每一页的大小,默认为20
     * sort,排序相关的信息,例如sort=firstname&sort=lastname,desc表示在按firstname正序排列基础上按lastname倒序排列
     */
    @Test
    public void testPage(){
        //排序
        Sort sort = new Sort(Sort.Direction.DESC,"id");  //  //排序条件  id倒序排序
        //分页
        Pageable pageable = PageRequest.of(0,2,sort);
        // page:index是0开始的,不是从1开始的
        Page<Student> page = stuDao.findAll(pageable);
        //当前页结果,(0)页
        List<Student> stuList = page.getContent();
        //按照每页2条数据,一共有的页数
        int totalPages = page.getTotalPages();
        //总共有多少条数据
        long totalElements = page.getTotalElements();
        //第0页的数据
        for (Student list :stuList) {
            System.out.println(list);
        }
        //查询的当前第几页
        int number = page.getNumber();
        //查询的当前页面的记录数
        int numberOfElements = page.getNumberOfElements();
        System.out.println(
                "一共有" + totalPages + "页\n" + "总共有" + totalElements + "条数据"+ "\n"
                + "查询的当前第" + number + 1 + "页"+ "\n"
                + "查询的当前页面的记录数:"+ numberOfElements
        );

        //遍历每页的数据
//        for (int i = 0; i < page.getTotalPages(); i++) {
//            PageRequest page1 = PageRequest.of(i, 2, sort);
//            Page<Student> page2 = studentDao.findAll(page1);
//            List<Student> stuList2 = page2.getContent();
//            for (Student list :stuList2) {
//                System.out.println(list);
//            }
//        }

    }

    /**
     * 通用修改方法,先根据主键查找,然后在修改提交
     * 也可以通过sql直接修改.需要在IUserDao接口中定义,这里不再演示。
     */
    @Test
    public void testUpdate(){
        Optional<Student> stuOptional = studentDao.findById(1);
        Student stu = stuOptional.get();
        stu.setStu_name("springDataJpa");
        //主键存在为修改,不存在为新增
        stuDao.save(stu);
    }

    /**
     *  查询其中一个进行删除
     * */
    @Test
    public void testDelete(){
        Optional<Student> stuOptional = studentDao.findById(11);
        Student stu = stuOptional.get();
        stuDao.delete(stu);
    }

    /**
     * 通过主键删除
     * 也可以通过sql直接删除.需要在IUserDao接口中定义
     */
    @Test
    public void testDeleteID(){
        studentDao.testDeleteSql(10);
    }

    /**
     * 通过自定义数据库语句进行模拟查询
     */
    @Test
    public void findByNameSql() {
        List<Student> byNameSql = stuDao.findByNameLike("zhangsan%");
        for (Student list :byNameSql) {
            System.out.println(list);
        }
    }



    /**
     * 通过自定义数据库语句进行模拟查询
     */

    @Test
    public void findNameSql() {
        List<Student> byNameSql = stuDao.findByNameLike("zhangsan%");
        for (Student list :byNameSql) {
            System.out.print("id:" + list.getId() + ",");
            System.out.print("name:" + list.getStu_name() + ",");
            System.out.print("age:" + list.getAge() + ",");
            System.out.println("sex:" + list.getSex() );
        }



    }



}

猜你喜欢

转载自blog.csdn.net/qq_44989881/article/details/102702027
今日推荐