jpa实现增删改查,分页,自定义查询,jpql查询

简介: jpa实现增删改查,分页,自定义查询,jpql查询

1.jpa实现增删改查,分页

配置文件application.properties

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/login?useUnicode=true&characterEncoding=utf-8
spring.datasource.username=root
spring.datasource.password=123456
#update:只创建一次,数据累加
#create:每次都重新创建一次,数据替换
spring.jpa.hibernate.ddl-auto=update

Pet类

//表明当前是一个实体类,自动创建表t_pet与之映射,若不加name,默认创建和实体类名称一样的表pet
@Entity(name = "t_pet")
public class Pet {
    //注解id,并设置主键--》自动增加
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    Integer id;
    // @Column标识是一个普通的字段
    @Column
    String pname;
    @Column
    String color;
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getPname() {
        return pname;
    }
    public void setPname(String pname) {
        this.pname = pname;
    }
    public String getColor() {
        return color;
    }
    public void setColor(String color) {
        this.color = color;
    }
}
public Pet() {
    }
    public Pet(Integer id, String pname, String color) {
        this.id = id;
        this.pname = pname;
        this.color = color;
    }
    @Override
    public String toString() {
        return "Pet{" +
                "id=" + id +
                ", pname='" + pname + '\'' +
                ", color='" + color + '\'' +
                '}';
    }

PetDao类

//JpaRepository<T,ID>
//T:表示具体操作的实体类,Pet
//ID:表示主键的类型,Integer
public interface PetDao extends JpaRepository<Pet,Integer> {
}

测试类

@SpringBootTest
class PetApplicationTests {
    //@Autowired和@Resource相同,都是表明一个对象
    @Resource
    PetDao petDao;
    /*
    save()方法:
        1.如果没有设置id,则进行一个insert添加操作
        2.如果设置id,
            1.根据指定的id先去查询,若查到指定id值存,进行一个update更新操作
            2.若没查到指定id,进行一个添加操作
     */
    @Test
    public void addPet(){
        System.out.println("添加成功");
        Pet pet = new Pet();
        //id自增,不需要设置
        pet.setPname("小狗");
        pet.setColor("白色");
        //完成添加操作
        petDao.save(pet);
    }
    @Test
    public void updatePet(){
        System.out.println("更新成功");
        Pet pet = new Pet();
        pet.setId(2);
        pet.setPname("小毛");
        pet.setColor("花色");
        //完成添加操作
        petDao.save(pet);
    }
    /*
        查询操作,根据id查询
        findById()是JpaRepository接口提供的
        查询到的内容封装到了Optional对象中
        get()方法是Optional对象中的,获得Pet对象
        查询的对象不存在,返回一个异常
     */
    @Test
    void selectPet(){
        Optional<Pet> optionalPet = petDao.findById(1);
        //调用Optional对象里的get()方法
        Pet pet = optionalPet.get();
        System.out.println(pet.getId()+"\t"+pet.getPname()+"\t"+pet.getColor());
    }
    //查找全部 findAll():
    /*
        findAll():没有指定参数,查询列表
                  可以指定参数,升序排序
     */
    @Test
    void findAllPet(){
        List<Pet> list = petDao.findAll();
        //有toString方法,可以直接输出pet对象
        for (Pet pet:list) {
            System.out.println(pet);
        }
    }
    //查找到的数据按pname升序排序
    @Test
    void findAllPets(){
        List<Pet> list = petDao.findAll(Sort.by("pname"));
        //有toString方法,可以直接输出pet对象
        for (Pet pet:list) {
            System.out.println(pet);
        }
    }
    //分页查询
    @Test
    void findPage(){
        /*
            of()方法:最多四个参数
                1.page:查询指定页数,从0开始
                2.size:当前页显示的记录数
                3.Direction.ASC:指定升序排序;DESC降序
                4.properties:指定哪个属性进行排序
         */
        Pageable pageable = PageRequest.of(1,2,Sort.Direction.ASC,"id");
        Page<Pet> pets = petDao.findAll(pageable);
        //获取元素的个数
        System.out.println("元素个数"+pets.getTotalElements());
        //获取页码总数
        System.out.println("总页数"+pets.getTotalPages());
        for (Pet pet : pets) {
            System.out.println(pet);
        }
    }
    //删除操作
    @Test
    void deletePet(){
        //法1.通过删除对象,先查询id,然后将传入的对象删除
        //Pet pet = new Pet();
        //pet.setId(1);
        //petDao.delete(pet);
        //法2.通过id删除
        petDao.deleteById(3);
        System.out.println("删除成功");
    }
}

2.自定义查询

PetDao接口

public interface PetDao extends JpaRepository<Pet,Integer> {
    /*
        自定义查询
        1、什么时候自定义查询
        JpaRepository接口当中提供的方法不能正常满足实际业务需求,此时我们需要一个自定义查询
        2.方法定义注意事项
        方法的返回值是根据实际的业务需求定义:List Pet
        方法的名称必须满足规范findByXxx,findBy固定开始,Xxx属性名称
        参数列表根据需求来定义
     */
    //定义通过pname查询
    List<Pet> findByPname(String pname);
    //定义通过color查询
    List<Pet> findByColor(String color);
    //定义通过pname和color联合查询
    List<Pet> findByPnameAndColor(String pname,String color);
    //根据id查询,查询id在一个范围内的Pet对象
    List<Pet> findByIdBetweenOrderById(Integer minId,Integer maxId);
    //去测试类中调用
}

测试类

//自定义查找
    @Test
    void findPname(){
        //通过pname查询
        List<Pet> list = petDao.findByPname("松鼠");
        System.out.println(list);
        //通过color查询
        List<Pet> listColor = petDao.findByColor("花色");
        System.out.println(listColor);
        //定义通过pname和color联合查询
        List<Pet> byPnameAndColor = petDao.findByPnameAndColor("兔兔", "花色");
        System.out.println(byPnameAndColor);
        //查询id:1-4之间的
        List<Pet> byIdBetweenOrderById = petDao.findByIdBetweenOrderById(1, 4);
        System.out.println(byIdBetweenOrderById);
    }

3.jpql查询

PetDao接口

//jpql查询
   /*
        sql查询:select * from t_pet
        jpql查询:from pet.domain.Pet
                select pet from pet.domain.Pet pet(别名)
     */
    //@Query(value = "from pet.domain.Pet")
    @Query("select A from pet.domain.Pet A")
    List<Pet> loadPetsList();

测试类

//jpql查询
    @Test
    void jpqlFind(){
        List<Pet> pets = petDao.loadPetsList();
        System.out.println(pets);
   }

2.查询pname和color

PetDao接口

/*
        //1、查询的数据封装到了Object[]中,而不是Pet
        sql:select pname,name from t_pet
        spql:select pname,color from pet.domain.Pet
     */
    @Query("select pname,color from pet.domain.Pet")
    List<Object[]> loadPetsList2();

测试类

@Test
    void test(){
        List<Object[]> objects = petDao.loadPetsList2();
        for (Object[] object : objects) {
            System.out.println(Arrays.toString(object));
        }
    }

—》查询的数据封装到Pet

//2.查询的数据封装到Pet
@Query("select new pet.domain.Pet(id,pname,color) from pet.domain.Pet pet")
List<Pet> loadPetsList3();
测试类
@Test
void test1(){
    List<Pet> pets = petDao.loadPetsList3();
    System.out.println(pets);
}


目录
相关文章
|
27天前
|
SQL 关系型数据库 MySQL
轻松入门MySQL:视图之美,简化查询、提升效率的数据库利器(14)
轻松入门MySQL:视图之美,简化查询、提升效率的数据库利器(14)
|
27天前
|
关系型数据库 MySQL 数据库
轻松入门MySQL:精准查询,巧用WHERE与HAVING,数据库查询如虎添翼(7)
轻松入门MySQL:精准查询,巧用WHERE与HAVING,数据库查询如虎添翼(7)
|
2月前
|
SQL 缓存 PHP
PHP技术探究:优化数据库查询效率的实用方法
本文将深入探讨PHP中优化数据库查询效率的实用方法,包括索引优化、SQL语句优化以及缓存机制的应用。通过合理的优化策略和技巧,可以显著提升系统性能,提高用户体验,是PHP开发者不容忽视的重要议题。
|
2月前
|
SQL 数据库 C#
C# .NET面试系列十一:数据库SQL查询(附建表语句)
#### 第1题 用一条 SQL 语句 查询出每门课都大于80 分的学生姓名 建表语句: ```sql create table tableA ( name varchar(10), kecheng varchar(10), fenshu int(11) ) DEFAULT CHARSET = 'utf8'; ``` 插入数据 ```sql insert into tableA values ('张三', '语文', 81); insert into tableA values ('张三', '数学', 75); insert into tableA values ('李四',
68 2
C# .NET面试系列十一:数据库SQL查询(附建表语句)
|
2月前
|
SQL 存储 JSON
阿里云数据库 SelectDB 内核 Apache Doris 2.1.0 版本发布:开箱盲测性能大幅优化,复杂查询性能提升 100%
亲爱的社区小伙伴们,Apache Doris 2.1.0 版本已于 2024 年 3 月 8 日正式发布,新版本开箱盲测性能大幅优化,在复杂查询性能方面提升100%,新增Arrow Flight接口加速数据读取千倍,支持半结构化数据类型与分析函数。异步多表物化视图优化查询并助力仓库分层建模。引入自增列、自动分区等存储优化,提升实时写入效率。Workload Group 资源隔离强化及运行时监控功能升级,保障多负载场景下的稳定性。新版本已经上线,欢迎大家下载使用!
阿里云数据库 SelectDB 内核 Apache Doris 2.1.0 版本发布:开箱盲测性能大幅优化,复杂查询性能提升 100%
|
2月前
|
存储 NoSQL Redis
【Redis】利用Redis List实现数据库分页快速查询
【Redis】利用Redis List实现数据库分页快速查询
119 0
|
1天前
|
API 数据库 Python
Python web框架fastapi数据库操作ORM(二)增删改查逻辑实现方法
Python web框架fastapi数据库操作ORM(二)增删改查逻辑实现方法
|
1天前
|
安全 数据管理 数据库
数据管理DMS产品使用合集之要将某个DMS实例中的特定数据库授权给某个用户进行查询,操作步骤是怎样的
阿里云数据管理DMS提供了全面的数据管理、数据库运维、数据安全、数据迁移与同步等功能,助力企业高效、安全地进行数据库管理和运维工作。以下是DMS产品使用合集的详细介绍。
|
1天前
|
关系型数据库 数据库 开发者
关系型数据库查询避免SELECT *
有时候你可能会遇到需要选择表中的所有列的情况,但这应该是例外而不是常态。在大多数情况下,你应该尽量避免使用 `SELECT *`。
6 1
|
2天前
|
SQL 分布式计算 关系型数据库
云原生数据仓库产品使用合集之可以把ADB MySQL湖仓版数据库做成页面查询的数据库吗
阿里云AnalyticDB提供了全面的数据导入、查询分析、数据管理、运维监控等功能,并通过扩展功能支持与AI平台集成、跨地域复制与联邦查询等高级应用场景,为企业构建实时、高效、可扩展的数据仓库解决方案。以下是对AnalyticDB产品使用合集的概述,包括数据导入、查询分析、数据管理、运维监控、扩展功能等方面。