springDataJpa可以不用写SQL语句就可以实现dao层的功能,只要按照规定的方法写方法名即可。当然,你也可以去写SQL语句,这样更灵活一些。
实体
@Entity
@Table(name = "cst_customer")
public class Customer {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="cust_id")
private Long custId;
@Column(name="cust_address")
private String custAddress;
@Column(name="cust_industry")
private String custIndustry;
@Column(name="cust_level")
private String custLevel;
@Column(name="cust_name")
private String custName;
@Column(name="cust_phone")
private String custPhone;
@Column(name="cust_source")
private String custSource;
get\set...
}
在dao中继承两个接口,并写上相应泛型。JpaRepository<实体类,主键类型>,JpaSpecificationExecutor<实体类>
public interface CustomerDao extends JpaRepository<Customer, Long>, JpaSpecificationExecutor<Customer> {}
这样就可以实现简单的增删改查了
public class CustomerTest {
@Autowired
private CustomerDao customerDao;
@Test
public void testFindOne(){
Customer customer = customerDao.findOne(110L);
System.out.println(customer);
}
@Test
public void testSave(){
Customer customer=new Customer();
customer.setCustId(2L);
customer.setCustName("北京尚学堂");
customerDao.save(customer);
}
@Test
public void testDelete(){
customerDao.delete(110L);
}
@Test
public void testCount(){
long count = customerDao.count();
System.out.println(count);
}
}
这些简单的增删改查肯定是不能满足我们的,这个时候还可以定制hql,一种面向对象的查询,对象相当于表,属性相当于列名
在CustomerDao接口里添加接口方法
@Query(value = "from Customer where custName= ?")
public Customer findJpql(String custName);
/**
* 根据客户id和客户名称查询客户
* from Customer where custName =? and custId=?
*/
@Query(value = "from Customer where custName =? and custId=?")
public Customer findCustNameAndId(String name,Long id);
/**
* 根据id更新客户的名称
* update Customer set custName=? where custId=?
*/
@Query(value = "update Customer set custName=?2 where custId=?1")
@Modifying
public void updateCustomer(long custId,String custName);
我们还可以写原生的SQL,只需要在后面写上nativeQuery=true
@Query(value = "select * from cst_customer where cust_name like ?",nativeQuery = true)
public List<Object[]> findSql(String name);
我们还可以不写SQL和HQL,按照规定的方法来写方法名,来实现复杂的查询
查询: findBy+对象中的属性名,首字母大写,默认精准匹配
public Customer findByCustName(String name);
如果是模糊的方式
findBy+属性名称+查询方式
public List<Customer> findByCustNameLike(String name);
如果是多条件
findBy+属性名+查询方式+多条件的链接符+属性名+查询方式
public List<Customer> findByCustNameLikeAndCustAddress(String custName,String custAddress);