Spring Data Jpa 三种查询方式

Spring Data Jpa 三种查询方式

  1. 直接调用接口方法实现查询
    上篇博文已具体体现

  2. 使用jpql完成查询

CustomerDao接口代码

package cn.itcast.dao;

import cn.itcast.domain.Customer;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.transaction.annotation.Transactional;

import javax.persistence.Id;
import java.util.List;

/**
 * @author JiangDong
 * @date 2020/7/13 - 10:41
 * 符合Spring data jap 的dao层接口规范
 *
 * JpaRepository<操作的实体类类型, 实体类中主键属性的类型>
 *     *    封装了基本CRUD操作
 * JpaSpecificationExecutor<操作的实体类类型>
 *     *    封装了复杂查询(分页)
 */
public interface CustomerDao extends JpaRepository<Customer,Long>, JpaSpecificationExecutor<Customer> {

    /**
     * 案例:根据客户名称查询客户
     * jpql: from Customer where custName = ?
     *
     * 配置jpql语句,使用@query注解
     */
    @Query(value = "from Customer where custName = ?")
    public Customer findJpql(String custName);

    /**
     * 根据客户名称和客户id查询客户
     * jpql : from Customer where custName=? and custId=?
     *      对于多个占位符参数
     *       1. 占位符的位置 要和 方法的参数位置保持一致
     *       2. 也可以指定占位符位置 : ?索引的方式,指定此占位的取值来源
     *
     */
    @Query(value = "from Customer where custName=? and custId=?")
    public Customer findCustomerByCustNameAndId(String name,Long id);

    @Query(value = "from Customer where custName=?2 and custId=?1")
    public Customer findCustomerByCustNameAndId2(Long id,String name);


    /**
     * 使用jpql完成更新操作
     *      案例:根据id更新,客户的名称
     *      更新4号客户的名称,将名称改为奥特曼
     *    sql: update cst_customer set cust_name=? where cust_id=?
     *    jpql: update Customer set custName=? where custId = ?
     *
     *    @Query : 代表的是进行查询
     *      *声明此方法是用来进行更新操作的
     *    @Modifying : 代表更新操作
     *    @Transactional : 事务支持
     *
     */
    @Query(value = "update Customer set custName = ? where custId = ?")
    @Modifying
    public void updateCustomer(String custName,Long custId);

}

测试类代码

package cn.itcast.test;

import cn.itcast.dao.CustomerDao;
import cn.itcast.domain.Customer;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional;

import java.util.Arrays;
import java.util.List;

/**
 * @author JiangDong
 * @date 2020/7/14 - 10:33
 */
// 声明Spring提供的单元测试环境
@RunWith(SpringJUnit4ClassRunner.class)
// 指定spring容器的配置信息
@ContextConfiguration(locations = "classpath:applicationContext.xml")
public class JpqlTest {

    @Autowired
    private CustomerDao customerDao;

    /**
     * 根据名字查询
     */
    @Test
    public void testFindJpql(){
        Customer customer = customerDao.findJpql("黑马程序员");
        System.out.println(customer);
    }

    /**
     * 根据客户名称和客户id查询客户
     * jpql : from Customer where custName=? and custId=?
     */
    @Test
    public void testFindCustomerByCustNameAndId(){
        Customer customer = customerDao.findCustomerByCustNameAndId("IT黑马",5l);
        System.out.println(customer);
    }

    @Test
    public void testFindCustomerByCustNameAndId2(){
        Customer customer = customerDao.findCustomerByCustNameAndId2(5l,"IT黑马");
        System.out.println(customer);
    }

    /**
     * 使用jpql完成更新操作
     *      案例:根据id更新,客户的名称
     *      更新4号客户的名称,将名称改为奥特曼
     *    sql: update cst_customer set cust_name=? where cust_id=?
     *    jpql: update Customer set custName=? where custId = ?
     *
     *
     *    springDateJpa中使用jpql完成 更新/删除操作
     *      * 需要手动添加事务支持
     *      * 默认执行结束后,回滚
     *
     *    @Rollback 是否自动回滚 (true false)
     */
    @Test
    @Transactional
    @Rollback(value = false)
    public void testUpdateCustName(){
        customerDao.updateCustomer("马卡马卡",4l);

        System.out.println(customerDao.findOne(4l));
    }

}

  1. 使用sql形式完成查询

CustomerDao接口代码

/**
     * sql形式进行查询
     *      查询全部的客户
     *      sql: select * from cst_customer
     *
     *      @Query : 配置sql 查询
     *          value: sql语句
     *          nativeQuery : 查询方式
     *              true : sql查询
     *              false: jpql查询
     */
    @Query(value = "select * from cst_customer",nativeQuery = true)
    public List<Object[]> findSql();

    /**
     * sql形式查询
     *     根据用户名 模糊查询
     *     sql : select * from customer where cus_name like ?
     */
    @Query(value = "select * from cst_customer where cust_name like ?",nativeQuery = true)
    public  List<Object[]> findSqlByCusName(String cusName);

测试类代码

 /**
     *  测试sql查询  查询所有
     */
    @Test
    public void testFindSql(){
      List<Object[]> list =  customerDao.findSql();
        for (Object[] obj:list
             ) {
            System.out.println(Arrays.asList(obj));
        }
    }

    /**
     *  sql方式查询 根据用户名模糊查询
     */
    @Test
    public void findSqlByCusName(){
        List<Object[]> list = customerDao.findSqlByCusName("%黑马%");

        for (Object[] obj:list
             ) {
            System.out.println(Arrays.asList(obj));
        }
    }

他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值