Spring Data JPA基本增删改查和JPQL查询(含完整代码和视频连接) (3)

4.编写Dao接口

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 java.util.List; /** * 符合SpringDataJpa的dao层接口规范 * JpaRepository<操作的实体类类型,实体类中主键的类型> * *封装了基本CRUD操作 * JpaSpecificationExecutor<操作的实体类类型> * *封装了复杂查询(分页) */ public interface CustomerDao extends JpaRepository<Customer, Long>, JpaSpecificationExecutor<Customer> { /** * 案列:根据客户名称查询客户 * 使用jpql的形式查询 * 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 = ? * * 对于多个占位符参数 * 赋值的时候,默认的情况下,占位符的位置需要和方法参数中的位置保持一致 * * 可以指定占位符参数的位置 * ?索引的方式,指定此占位的取值来源 */ @Query(value = "from Customer where custName = ?2 and custId = ?1") public 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 public void updateCustomer(long custId, String custName); /** *使用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) public List<Object []> findSql(String name); /** * 方法名的约定 * findBy :查询 * 对象中的属性名(首字母大写):查询的条件 * CustName * *默认情况:使用等于的方式查询 * 特殊的查询方式 * * FindByCustName -- 根据客户名称查询 * * 在springdataJpa的运行阶段 * 会根据方法名称进行解析 findBy from xxx(实体类) * 属性名称 where custName = * 1.findBy + 属性名称(根据属性名称精选完成匹配的查询= * 2.findBy + 属性名称 + ”查询方式(Like | isnull)" * findByCustNameLike * 3.多条件查询 * findBy + 属性名称 + “查询方式” + “多条件的连接符(and | or)” + 属性名 + “查询方式" */ public Customer findByCustName(String custName); public List<Customer> findByCustNameLike(String custName); //使用客户名称模糊匹配和客户所属行业精准匹配的查询 public Customer findByCustNameLikeAndCustIndustry(String custName, String custIndustry); }

5.测试用例

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.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.transaction.annotation.Transactional; import java.util.List; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = "classpath:applicationContext.xml")//指定spring容器的配置信息 public class CustomerDaoTest { @Autowired private CustomerDao customerDao; /** * 根据id查询 */ @Test public void testFindOne(){ Customer customer = customerDao.findOne(3L); System.out.println(customer); } /** * sava : 保存或者更新 * 根据传递的对象是否存在主键id, * 如果没有id主键属性:保存 * 存在id主键属性,根据id查询数据,更新数据 */ @Test public void testSave() { Customer customer = new Customer(); customer.setCustName("黑马程序员"); customer.setCustLevel("vip"); customer.setCustIndustry("it教育"); customerDao.save(customer); } @Test public void testUpdate() { Customer customer = new Customer(); customer.setCustId(4l); customer.setCustName("黑马程序员很厉害"); customerDao.save(customer); } @Test public void testDelete() { customerDao.delete(3L); } @Test public void testFindAll() { List<Customer> list = customerDao.findAll(); for (Customer customer : list) { System.out.println(customer); } } /** * 测试统计查询:查询客户的总数量 * cont:统计总条数 */ @Test public void testCount() { long count = customerDao.count();//查询全部的客户数量 System.out.println(count); } /** * 测试:判断id为4的客户是否存在 * 1.可以查询一下id为4的客户 * 如果值为空,代表不存在,如果部位空,代表存在 * 2.判断数据库中id为4的客户的数量 * 如果数量为0,代表不存在,如果大于0,代表存在 */ @Test public void testExists() { boolean exists = customerDao.exists(4l); System.out.println("id为4的客户是否存在:" + exists); } /** * 根据id从数据库查询 * @Transactional:保证getOne正常运行 * * findOne: * em.find() :立即加载 * getOne: * em.getReference :延迟加载 * *返回的时客户的动态代理对象 * *什么时候用,什么时候查询 */ @Test @Transactional public void testGetOne() { Customer customer = customerDao.getOne(4l); System.out.println(customer); } }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwdpxf.html