Spring Data Jpa 三种查询方式
-
直接调用接口方法实现查询
上篇博文已具体体现 -
使用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));
}
}
- 使用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));
}
}
他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。