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);
}


目录
相关文章
|
18天前
|
存储 SQL 关系型数据库
关系型数据库强大的查询功能
【5月更文挑战第9天】关系型数据库强大的查询功能
19 3
|
18天前
|
缓存 关系型数据库 数据库
关系型数据库高效查询和统计
【5月更文挑战第8天】关系型数据库高效查询和统计
55 7
|
2天前
|
SQL 关系型数据库 MySQL
mysql 数据库 增删改查 基本操作
mysql 数据库 增删改查 基本操作
|
2天前
|
SQL 运维 监控
关系型数据库查询日志分析
【5月更文挑战第21天】
7 2
|
4天前
|
SQL Java 数据库连接
MyBatis 查询数据库
MyBatis 查询数据库
|
5天前
|
SQL 缓存 监控
关系型数据库优化查询语句
【5月更文挑战第18天】
15 2
|
7天前
|
小程序 数据库
一分钟教你学会小程序云开发的数据库的增删改查
本文简要介绍了小程序云开发中数据库的增删改查操作。首先展示了查询代码,通过`wx.cloud.database().collection().get()`获取数据;接着演示添加数据,强调数据字段需与数据库匹配;然后说明删除数据需基于_id,通过`doc(id).remove()`执行;最后,更新数据同样依赖_id,使用`doc(id).update()`进行修改。
14 1
|
7天前
|
存储 NoSQL MongoDB
mongdb如何查询数据库表的创建时间
【5月更文挑战第22天】mongdb如何查询数据库表的创建时间
28 4
|
14天前
|
Cloud Native 关系型数据库 分布式数据库
云原生数据库PolarDB自定义权限策略参考
本文介绍了自定义权限策略,它是RAM访问控制体系中除系统策略外,用户可创建、更新和删除的权限策略。用户需维护策略版本更新,并将策略绑定到RAM身份以授予权限。策略支持版本控制和删除,但删除前需确保无引用。文章提供了相关操作文档链接,包括创建、修改、删除策略及管理引用记录和版本。此外,列举了PolarDB在MySQL、PostgreSQL和XScale版的自定义权限策略场景和示例,并提示用户在使用时需了解授权信息。
26 0
|
16天前
|
缓存 关系型数据库 MySQL
如何优化MySQL数据库查询性能
MySQL是一款常用的关系型数据库,但在实际使用过程中,由于数据量增加和查询操作复杂度增加,会导致查询性能下降。本文将介绍一些优化MySQL数据库查询性能的方法。