SpringBoot实现的JPA封装了JPA的特性,只需要写接口即可,但是有的时候约定的写法不符合我们的开发要求,没有很好的灵活性,这就需要我们自己去定义一下方法实现自己的封装Repository。
借鉴网上配置:
文章一:http://blog.youkuaiyun.com/u011659172/article/details/51537602
文章二:http://blog.youkuaiyun.com/xiao_xuwen/article/details/53579353
- 添加所需要的依赖包
<!-- spring-data-jpa程序的启动项依赖,底层为hibernate实现,若不使用此框架则可以依赖其他的orm框架 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- web程序的启动项依赖,通过此依赖可引入内嵌的tomcat等web必须的jars -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- mysql依赖,使用spring-data-jpa需要指定一个数据库方言,用于连接数据库,即mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
- 定义BaseRepository接口实现JPARepository接口
package com.demo.dao;
import java.io.Serializable;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.repository.NoRepositoryBean;
/**
* @author
*
*/
@NoRepositoryBean
public interface BaseRepository<T, ID extends Serializable> extends JpaRepository<T,ID>{
public HashMap<String, Object> sqlQuery(String queryString, String countSql, Map<String, ?> values, int offset, int limit, String countName, String rowsName);
public List<T> sqlQuery(String queryString, Map<String, ?> values);
public List<T> sqlQuery(String queryString, Object ... values);
public HashMap<String, Object> retrieve(String queryString, String countHql, Map<String, ?> values, int offset, int limit, String countName, String rowsName);
}
- 定义BaseRepository的实现类,所有的DAO实现BaseRepository接口后,具体的实现方法由该实现类去操作。
package com.demo.dao;
import java.io.Serializable;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.springframework.data.jpa.repository.support.SimpleJpaRepository;
import org.springframework.util.Assert;
/**
* dao的封装类.
*
* <pre>
* 封装一些涉及到原生sql的增删改查分页等功能
* </pre>
*
* @author xxx
* @since 1.0
*
*/
public class BaseRepositoryImpl<T, ID extends Serializable> extends SimpleJpaRepository<T, ID> implements BaseRepository<T, ID> {
//父类没有不带参数的构造方法,这里手动构造父类
public BaseRepositoryImpl(Class<T> domainClass, EntityManager entityManager) {
super(domainClass, entityManager);
System.out.printl