spring data jpa 定义全局接口BaseDao
2016-03-30 18:08
381 查看
好,现在我要搭一个项目,我想定义一个BaseDao,然后直接让其他模块的dao直接继承我这个BaseDao,BaseDao有通用的方法也有spring data jpa提供的便捷方法
那就新建一个BaseDao呗,这个BaseDao应该是继承JpaRepository,JpaSpecificationExecutor因为我们想用spring data jpa,然后你再定义自己一些常用方法,例如myMethod
接下来应该就是实现了
继承于SimpleJpaRepository不单可以让我们获取操作数据库的EntityManager ,还可以实现JpaRepository,JpaSpecificationExecutor的方法,这样我们就可以只写我们自己方法的实现
接下来再定义下factory,他的作用是将我们的basedao的实现类扔给factorybean
然后再定义一个factorybean,接到factory之后,把factory扔了spring data jpa
spring data jpa来接了,在配置文件配置自己定义的FactoryBean,这样就可以直接使用你的baseDao了
然后下次我们要用,就这样子用
在service层,你就可以用spring data jpa的方法和自己定义的一些通用方法了,如果你还想在自己模块再定义一些方法,那参考
/article/9701585.html
然后我们就这么写
然后,毕竟有一些东西,框架还是帮我们不了啊,太复杂的业务,想自己写操作数据库,想自己写sql原生语句,那咋办啊,亲,那就只能利用EntityManager了,利用jpa api直接自己干了,下次看看怎么用EntityManager自己干活了
那就新建一个BaseDao呗,这个BaseDao应该是继承JpaRepository,JpaSpecificationExecutor因为我们想用spring data jpa,然后你再定义自己一些常用方法,例如myMethod
@NoRepositoryBean public interface BaseDao<T,ID extends Serializable> extends JpaRepository<T, ID>,JpaSpecificationExecutor<T> { void myMethod(); }
接下来应该就是实现了
public class BaseDaoImpl<T,ID extends Serializable> extends SimpleJpaRepository<T, ID> implements BaseDao<T,ID>{ private final EntityManager em; public BaseDaoImpl(Class<T> domainClass, EntityManager em) { super(domainClass, em); this.em = em; } @Override public void myMethod() { } }
继承于SimpleJpaRepository不单可以让我们获取操作数据库的EntityManager ,还可以实现JpaRepository,JpaSpecificationExecutor的方法,这样我们就可以只写我们自己方法的实现
接下来再定义下factory,他的作用是将我们的basedao的实现类扔给factorybean
public class BaseDaoFactory<S, ID extends Serializable> extends JpaRepositoryFactory { public BaseDaoFactory(EntityManager entityManager) { super(entityManager); } @SuppressWarnings({ "rawtypes", "unchecked", "hiding" }) @Override protected <T, ID extends Serializable> SimpleJpaRepository<?, ?> getTargetRepository(RepositoryMetadata metadata, EntityManager entityManager) { // TODO Auto-generated method stub return new BaseDaoImpl(metadata.getDomainType(), entityManager); } @Override protected Class<?> getRepositoryBaseClass(RepositoryMetadata metadata) { // TODO Auto-generated method stub return BaseDao.class; } }
然后再定义一个factorybean,接到factory之后,把factory扔了spring data jpa
public class BaseDaoFactoryBean<R extends JpaRepository<S, ID>, S, ID extends Serializable> extends JpaRepositoryFactoryBean<R, S, ID> { @SuppressWarnings("rawtypes") @Override protected RepositoryFactorySupport createRepositoryFactory(EntityManager entityManager) { // TODO Auto-generated method stub return new BaseDaoFactory(entityManager); } }
spring data jpa来接了,在配置文件配置自己定义的FactoryBean,这样就可以直接使用你的baseDao了
<jpa:repositories base-package="com.liuxg.**.dao" repository-impl-postfix="Impl" query-lookup-strategy = "create-if-not-found" factory-class="com.liuxg.base.dao.BaseDaoFactoryBean" entity-manager-factory-ref="entityManagerFactory" transaction-manager-ref="transactionManager" > </jpa:repositories>
然后下次我们要用,就这样子用
public interface TaskDao extends BaseDao<Task,Long>{ }
在service层,你就可以用spring data jpa的方法和自己定义的一些通用方法了,如果你还想在自己模块再定义一些方法,那参考
/article/9701585.html
然后我们就这么写
public interface TaskDao extends BaseDao<Task,Long>,TaskDaoCustom<Task, Long>{ }
然后,毕竟有一些东西,框架还是帮我们不了啊,太复杂的业务,想自己写操作数据库,想自己写sql原生语句,那咋办啊,亲,那就只能利用EntityManager了,利用jpa api直接自己干了,下次看看怎么用EntityManager自己干活了