/** * 符合SpringData的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 = ?") Customer findJpql(String custName); /** * 案例:根据客户名称和客户id查询客户 * jpql:from Customer where custName = ? and custId = ? * * 可以指定占位符参数的位置 * ? 索引的方式,指定此占位的取值来源 */ @Query(value = "from Customer where custName = ?2 and custId = ?1") Customer findCustNameAndId(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 * * 当前执行的是一个更新操作 */ @Query(value = "update Customer set custName = ?2 where custId = ?1") @Modifying void updateCustomer(long custId,String name); /** * 使用sql的形式查询: * 查询全部的客户 * sql:select * from cst_customer * Query:配置sql查询 * value : sql语句 * nativeQuery : 查询方式 * true : sql查询 * false : jpql查询 * * @return */ //@Query(value = "select * from cst_customer",nativeQuery = true) @Query(value = "select * from cst_customer where cust_name like ?1",nativeQuery = true) List<Object []> findSql(String name); /** * 通过方法名称规则查询 * 是对jpql查询更深入的一层封装 * 我们只需要按照SpringDataJpa提供的方法名称规则定义方法,不需要再去配置jpql语句,完成查询 * * findBy开头:代表查询 * 对象中属性的名称(首字母大写) * * 含义:根据属性名称进行查询 * * findByCustName -- 根据客户名称查询 * * 在springDataJpa的运行阶段 * 会根据方法名进行解析 findBy from xxx(实体类) * 属性名称 where custName = * * 默认情况 : 使用等于的方式查询 * 特殊的查询方式 * * 1. findBy + 属性名称(根据属性名称进行完成匹配的查询) * 2. findBy + 属性名称 + ”查询方式(Like | is null)“ * findByCustNameLike * 3.多条件查询 * findBy + 属性名 + ”查询方式" + “多条件的连接符(and | or)” + 属性名 + “查询方式” */ Customer findByCustName(String name); List<Customer> findByCustNameLike(String custName); //使用客户名称模糊匹配和客户所属行业精准匹配的查询 Customer findByCustNameLikeAndCustIndustry(String name,String custIndustry);}
package com.cedric.test;import com.cedric.dao.CustomerDao;import com.cedric.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;@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(locations = "classpath:applicationContext.xml")public class JpqlTest { @Autowired private CustomerDao customerDao; @Test public void testFindJPQL(){ Customer customer = customerDao.findJpql("京东"); System.out.println(customer); } @Test public void testFindCustNameAndId(){ Customer customer = customerDao.findCustNameAndId(3l,"京东"); System.out.println(customer); } /** * 测试jpql更新操作 * * springDataJpa中使用jpql完成 更新/删除操作 * * 需要手动添加事务的支持 * * 默认会执行结束之后,回滚事务 * * @Rollback : 设置是否自动回滚 */ @Test @Transactional // 添加事务的支持 @Rollback(value = false) public void testUpdateCustomer(){ customerDao.updateCustomer(4l,"农夫山泉"); } // 测试sql查询 @Test public void testFindSql(){ List<Object[]> list = customerDao.findSql("阿里%"); for (Object[] obj : list){ System.out.println(Arrays.toString(obj)); } } @Test public void testNaming(){ Customer customer = customerDao.findByCustName("京东"); System.out.println(customer); } // 测试方法命名规则的查询 @Test public void testByCustNameLike(){ List<Customer> list = customerDao.findByCustNameLike("阿里%"); for (Customer customer : list){ System.out.println(customer); } } @Test public void testFindByNameLikeAndCustIndustry(){ Customer customer = customerDao.findByCustNameLikeAndCustIndustry("阿里%", "电商"); System.out.println(customer); }}