Spring Data JPA-自定义实现
JPA-自定义实现
常用实现
在springdata JPA 的使用过程我们通常是通过在接口中定义方法,
public interface BookCurdRepository extends CrudRepository <Book, Long>{
/**
* 通过书名查找书
* @param name
* @return
*/
Book findBookByName(String name);
}
其次复杂一点的就是通过@Query注解来实现
/**
* 更新名称和作者信息
* @param name
* @param author
* @param id
*/
@Transactional(rollbackFor = Exception.class)
@Modifying
@Query("update Book set name = ?1,author = ?2 where id = ?3")
void updateNameAndAuthorById(String name,String author,long id);
自定义实现
在大多数的情况瞎,这两种方式是可以满足我们的需求,但是如果存在更加复杂的需要呢?可能在这个时候我们会吐槽没有mybaties那么灵活了,在Jpa中也可以实现的,我们可以通过自定义的方式来进行实现
1、创建自定义的接口
public interface BookCustomRepository {
/**
* 查询所有书列表
* @return
*/
List<Book> listBook();
}
2、自定接口实现
@Repository
public class BookCustomRepositoryImpl implements BookCustomRepository {
@Autowired
private JdbcTemplate jdbcTemplate;
@Override
public List<Book> listBook() {
//在这里就可以自由发挥了,可以根据自己需求来实现
String sql = "select * from book";
BeanPropertyRowMapper<Book> rowMapper = new BeanPropertyRowMapper<>(Book.class);
List<Book> bookList = jdbcTemplate.query(sql, rowMapper);
return bookList;
}
}
3、继承自定接口
/**
* @Description:
* @Author: JackQ
* @CreateDate: 2020/6/22 11:06
*/
@Repository
public interface BookRepository extends org.springframework.data.repository.Repository<Book,Long>, BookCustomRepository {
/**
* 通过书名查找书
*
* @param name
* @return
*/
Book findBookByName(String name);
/**
* 更新名称和作者信息
* @param name
* @param author
* @param id
*/
@Transactional(rollbackFor = Exception.class)
@Modifying
@Query("update Book set name = ?1,author = ?2 where id = ?3")
void updateNameAndAuthorById(String name,String author,long id);
}
4、测试,在其他的地方就可以调用自定方法中的实现了
@Test
public void listBooks(){
List<Book> books = bookService.listBooks();
books.stream().forEach(book -> System.out.println(book.toString()));
}
//结果
//Book(id=1, name=平凡的世界, price=30.2, author=路遥)
//Book(id=2, name=人生, price=60.0, author=路遥)
//Book(id=3, name=情书, price=38.0, author=岩井俊二)
自定义实现优先级别
在一个repository中可能存在继承多个接口,那么就可能存在相同的实现方法;自定义 implementations 的优先级高于基本 implementation 和 repository 方面。如果两个片段提供相同的方法签名,则此 ordering 允许您覆盖 base repository 和 aspect 方法并解决歧义。 Repository 片段不限于在单个 repository 接口中使用。多个 repositories 可以使用片段接口,让您可以跨不同的 repositories 重用自定义。
interface CustomizedSave<T> {
<S extends T> S save(S entity);
}
class CustomizedSaveImpl<T> implements CustomizedSave<T> {
public <S extends T> S save(S entity) {
// Your custom implementation
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现