技术标签: spring data jpa jpa 全局接口
好,现在我要搭一个项目,我想定义一个BaseDao,然后直接让其他模块的dao直接继承我这个BaseDao,BaseDao有通用的方法也有spring data jpa提供的便捷方法
那就新建一个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的方法和自己定义的一些通用方法了,如果你还想在自己模块再定义一些方法,那参考
http://blog.csdn.net/yingxiake/article/details/51017699
然后我们就这么写
public interface TaskDao extends BaseDao<Task,Long>,TaskDaoCustom<Task, Long>{
}
然后,毕竟有一些东西,框架还是帮我们不了啊,太复杂的业务,想自己写操作数据库,想自己写sql原生语句,那咋办啊,亲,那就只能利用EntityManager了,利用jpa api直接自己干了,下次看看怎么用EntityManager自己干活了
文章浏览阅读5.4k次,点赞4次,收藏15次。[@ TOC]一、MiniBatch的演进思路1、MiniBatch版本Flink 1.9.0 SQL(Blink Planner) 性能优化中一项重要的改进就是升级了微批模型,即 MiniBatch(也称作MicroBatch或MiniBatch2.0),在支持高吞吐场景发挥了重要作用。MiniBatch与早期的MiniBatch1.0在微批的触发机制略有不同。原理同样是缓存一定的数据后..._flink mini-batch
文章浏览阅读808次,点赞6次,收藏6次。导入依赖<dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.1.6</version></dependency>Controllerimport java.text.ParseException;import org.springframework._easyexcel 对接multipartfile
文章浏览阅读2.7k次,点赞27次,收藏42次。一文清晰了解英飞凌TC3xx系列的架构和组成部分,适用于正在使用EDSADC功能的人们。_dsadc
文章浏览阅读1.2k次。通过调用wmic命令获取硬盘序列号,wmic命令很强大。Demo:/** * 2019年3月13日下午3:48:22 */package testReadDiskInfo;import java.io.IOException;import java.util.ArrayList;import java.util.HashMap;import java.util.List;..._java 硬盘物理序列号
文章浏览阅读2.2k次。本文采用CenOS 6 32位,JDK1.7进行编译 (1)安装编译库yum install cmake lzo-devel zlib-devel gcc gcc-c++ autoconf automake libtool ncurses-devel openssl-devel libXtst(2)安装mavenwget http://repos.fedorapeople.org/repos/dc_32位linux系统 编译hadoop
文章浏览阅读422次。BIND(Berkeley internet Name Daemon)也叫做NAMED,是现今互联网上使用最为广泛的DNS 服务器程序,本项目旨在更简单的维护我们内部的dns系统。环境:数据库: mysql5.6应用: bind-9.11.2环境: python3.8 , django30x01 安装数据库bash sql 建库语句use mysqlcreate database bind9; -..._使用web管理bind
文章浏览阅读890次。cron 表达式的格式 Quartz Cron 表达式支持到七个域 名称 是否必须 允许值 特殊字符 秒 是 0-59 ..._cron表达式 下午5点30
文章浏览阅读1.8k次。今天在操作数据库时,需要将字符串转换成Decimal类型。代码如下:selectcast('0.12'asdecimal(18,2));selectconvert(decimal(18,2),'0.12');当需要将科学计数法的数字字符串转换成Decimal时,这2种写法都报错:Msg 8114, Level 16, State 5, Line 1Erro..._mssql 字符串转decimal 精度问题
文章浏览阅读553次。soul源码解读(十八)resilience4j插件使用resilience4jresilience4j插件是网关用来对流量进行限流与熔断的可选选择之一。resilience4j为网关熔断限流提供能力。插件使用1.启动 admin,打开 resilience4j 插件开关2.在 bootstrap 项目的 pom 文件引入 resilience4j 插件的相关依赖,启动 bootstrap <!-- soul resilience4j plugin start--> <_resilience4j timeoutduration含义
文章浏览阅读367次,点赞5次,收藏3次。16、mysql的innodb如何定位锁问题,mysql如何减少主从复制延迟?2、在工作中,运维人员经常需要跟运营人员打交道,请问运营人员是做什么工作的?6、Squid、Varinsh和Nginx有什么区别,工作中你怎么选择?5、LVS、Nginx、HAproxy有什么区别?9、讲述一下Tomcat8005、8009、8080三个端口的含义?索引默认位置:/opt/splunk/var/lib/splunk。7、Tomcat和Resin有什么区别,工作中你怎么选择?15、讲述一下LVS三种模式的工作过程?_splunk部署、配置、优化
文章浏览阅读1.5k次。学习自动驾驶,入手PreScan 仿真软件。 从此开启学习_prescan2021与matlab版本
文章浏览阅读1.9w次,点赞43次,收藏421次。linux内核相关视频解析:5个方面分析linux内核架构,让你对内核不再陌生90分钟了解Linux内存架构,numa的优势,slab的实现,vmalloc的原理手把手带你实现一个Linux内核文件系统简介作用是将应用层序的请求传递给硬件,并充当底层驱动程序,对系统中的各种设备和组件进行寻址。目前支持模块的动态装卸(裁剪)。Linux内核就是基于这个策略实现的。Linux进程1.采用层次结构,每个进程都依赖于一个父进程。内核启动init程序作为第一个进程。该进程负责进一步的系统初始化操作。init_linux内核基本原理