首先使用 spring data jpa ,DAO接口需要继承JpaRepository
和JpaSpecificationExecutor
两个接口
操作数据库常用的两个注解@Query
和@Modifying
@Query
- 此注解用在接口方法上用来声明方法将进行查询
value
:查询需要执行的JPQL
语句或者SQL
语句nativeQuery
:是否使用本地查询 值:fasel
(使用jpql查询) |true
(使用本地查询:sql查询)
/**
* 根据占位符:位置 进行查询
* ?为占位符 1为索引,对应参数的位置
* 占位符的索引从1开始,并不是从0开始
* 一般2个参数以下建议使用
* @param userName
* @return
*/
@Query(value = "from UserDemo where userName like ?1")
UserDemo findByUserName(String userName);
/**
* 根据占位符:参数名称 进行查询
* 「@Param」注解中的值对应jpql中占位符参数名称,顺序并不影响查询
* p1、p2 表示两个参数,建议在项目中见名知意
* @param p1
* @param p2
* @return
*/
@Query(value = "from UserDemo where userAge = :userAge and userName = :userName")
UserDemo findByUserNameAndUserAge(@Param("userName") String p1, @Param("userAge") int p2);
@Modifying
- 此注解和
@Query
联合使用在接口方法上,声明此方法用来更新 - 需要调用方法的时候手动添加事务支持
- 默认在执行结束之后,回滚事务,需要设置自动回滚
@Rollback
:是否自动回滚,取值范围:false
|true
/**
* 更新操作
* sql:update user_demo set user_age = ? where user_name = ?
* jpql:update UserDemo set userAge = ?1 where userName = ?2
*
* * spring data jpa 在执行更新、删除操作注意
* 1、需要调用方法的时候手动添加事务支持
* 2、默认在执行结束之后,回滚事务,需要设置自动回滚
* @Rollback:是否自动回滚,取值范围:false|true
*
* @param age
* @param name
*/
@Query(value = "update UserDemo set userAge = ?1 where userName = ?2")
@Modifying
@Rollback(value = false)
void updateAgeByName(int age, String name);
使用sql的形式进行查询
/*
使用sql的形式进行查询:查询全部
sql:select * from user_demo
Query:配置sql查询
value:sql语句
nativeQuery:查询方式
true:使用本地 sql 查询
false:使用jpql查询
*/
@Query(value = "select * from user_demo", nativeQuery = true)
List<UserDemo> findBySql();
@Query(nativeQuery = true, value = "select * from user_demo where id = :id")
UserDemo findByUserId(@Param("id") Integer id);
方法名称规则查询
- 对jpql查询更加深入一层封装的查询方式,只需要按照springdatajpa提供的方法名称规则定义方法忙不需要配置jqpl语句,就可以完成查询
- 关键字(例如:findBy)+属性名称(属性名称的首字母大写)+查询条件(首字母大写)。
- 返回结果根据使用情况而定
其他查询前缀可以参考:org.springframework.data.util.Streamable
private static final String QUERY_PATTERN = "find|read|get|query|stream";
private static final String COUNT_PATTERN = "count";
private static final String EXISTS_PATTERN = "exists";
private static final String DELETE_PATTERN = "delete|remove";
带有LIKE
的查询,注意参数中的%
需要手动添加