基于springboot2集成jpa,创建dao的案例
springboot中集成jpa需要再pom文件中添加jpa的jar包,使用springboot的话iju不用自己规定版本号了,自动管理依赖版本即可。
org.springframework.boot spring-boot-starter-data-jpa
然后我们再添加hibernate和oracle的jar包,同样自动管理版本。
org.hibernate hibernate-core com.oracle ojdbc6 11.2.0.4.0
然后我们在配置文件中添加jpa和链接数据库的信息。
spring.datasource.driver-class-name=oracle.jdbc.OracleDriver spring.datasource.url=jdbc:oracle:thin:@DESKTOP-46DMVCH:1521:orcl spring.datasource.password=**** spring.datasource.username=**** spring.mvc.date-format=yyyy-MM-ddHH:mm:ss spring.jpa.database=oracle spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true spring.datasource.log-abandoned=true spring.datasource.remove-abandoned=true spring.datasource.remove-abandoned-timeout=200
添加完成之后我们开始创建jpa使用的公共Repository,创建一个接口。这里的接口可以直接继承JpaRepository,或者可以继承别的Repository.注意要加上@NoRepositoryBean注解,告诉Spring数据:不要创建该接口实例。
当我们在下面使用dao的时候再进行创建实例
@NoRepositoryBean publicinterfaceBaseRepositoryextendsJpaRepository { }
现在我们创建好了这基础的Repository如果有自己想封装的公用方法的话就可以添加到这个接口中,进行约束。
当我们创建dao接口的时候,直接继承这个基础的Repository;继承之后这个dao再spring中默认识别为一个Repository。
publicinterfaceTbUserDaoextendsBaseRepository{ }
下面我们就可以直接再service中注入这个dao。
@Service
publicclassUserService{
@Resource
privateTbUserDaouserDao;
}
现在我们看一下JpaRepository源码,其中继承了PagingAndSortingRepository和QueryByExampleExecutor,也就是里面直接有了各种查询的方法,并且在这两个基础上添加了保存和删除的方法。
@NoRepositoryBean publicinterfaceJpaRepositoryextendsPagingAndSortingRepository ,QueryByExampleExecutor { /* *(non-Javadoc) *@seeorg.springframework.data.repository.CrudRepository#findAll() */ List findAll(); /* *(non-Javadoc) *@seeorg.springframework.data.repository.PagingAndSortingRepository#findAll(org.springframework.data.domain.Sort) */ List findAll(Sortsort); /* *(non-Javadoc) *@seeorg.springframework.data.repository.CrudRepository#findAll(java.lang.Iterable) */ List findAllById(Iterable ids); /* *(non-Javadoc) *@seeorg.springframework.data.repository.CrudRepository#save(java.lang.Iterable) */ List saveAll(Iterableentities); /** *Flushesallpendingchangestothedatabase. */ voidflush(); /** *Savesanentityandflusheschangesinstantly. * *@paramentity *@returnthesavedentity */SsaveAndFlush(Sentity); /** *Deletesthegivenentitiesinabatchwhichmeansitwillcreateasingle{@linkQuery}.Assumethatwewillclear *the{@linkjavax.persistence.EntityManager}afterthecall. * *@paramentities */ voiddeleteInBatch(Iterable entities); /** *Deletesallentitiesinabatchcall. */ voiddeleteAllInBatch(); /** *Returnsareferencetotheentitywiththegivenidentifier. * *@paramidmustnotbe{@literalnull}. *@returnareferencetotheentitywiththegivenidentifier. *@seeEntityManager#getReference(Class,Object) *@throwsjavax.persistence.EntityNotFoundExceptionifnoentityexistsforgiven{@codeid}. */ TgetOne(IDid); /* *(non-Javadoc) *@seeorg.springframework.data.repository.query.QueryByExampleExecutor#findAll(org.springframework.data.domain.Example) */ @Override List findAll(Exampleexample); /* *(non-Javadoc) *@seeorg.springframework.data.repository.query.QueryByExampleExecutor#findAll(org.springframework.data.domain.Example,org.springframework.data.domain.Sort) */ @OverrideList findAll(Exampleexample,Sortsort); }
我们再看Jpa继承的两个接口中的代码,PagingAndSortingRepository是继承了CrudRepository的,这个CrudRepository中同样有删除保存查询等方法,是比较全的,但是如果我们直接使用这个CrudRepository的话里面的查询是没有分页的方法。
而PagingAndSortingRepository是在基础上新加了分页查询的方法。
所以我们没有直接使用CrudRepository
@NoRepositoryBean publicinterfacePagingAndSortingRepositoryextendsCrudRepository { Iterable findAll(Sortvar1); Page findAll(Pageablevar1); }
会有疑问的是我们这里的接口为什么可以直接注入。
因为当我们运行项目的时候,spring识别这个dao是一个Repository会自动为这个接口创建一个接口名+Impl的实现类,如下例子中的就是生成TbUserDaoImpl的实现类。
这个我们可以在EnableJpaRepositories注解源码中可以看到。
里面的repositoryImplementationPostfix()方法是定义repository接口生成的实现类后缀是什么,springboot默认帮我们定义成了Impl。
我们也可以在springboot启动类上面使用这个注解自己定义这个值。
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import(JpaRepositoriesRegistrar.class)
public@interfaceEnableJpaRepositories{
/**
*Aliasforthe{@link#basePackages()}attribute.Allowsformoreconciseannotationdeclarationse.g.:
*{@code@EnableJpaRepositories("org.my.pkg")}insteadof{@code@EnableJpaRepositories(basePackages="org.my.pkg")}.
*/
String[]value()default{};
/**
*Basepackagestoscanforannotatedcomponents.{@link#value()}isanaliasfor(andmutuallyexclusivewith)this
*attribute.Use{@link#basePackageClasses()}foratype-safealternativetoString-basedpackagenames.
*/
String[]basePackages()default{};
/**
*Type-safealternativeto{@link#basePackages()}forspecifyingthepackagestoscanforannotatedcomponents.The
*packageofeachclassspecifiedwillbescanned.Considercreatingaspecialno-opmarkerclassorinterfacein
*eachpackagethatservesnopurposeotherthanbeingreferencedbythisattribute.
*/
Class>[]basePackageClasses()default{};
/**
*Specifieswhichtypesareeligibleforcomponentscanning.Furthernarrowsthesetofcandidatecomponentsfrom
*everythingin{@link#basePackages()}toeverythinginthebasepackagesthatmatchesthegivenfilterorfilters.
*/
Filter[]includeFilters()default{};
/**
*Specifieswhichtypesarenoteligibleforcomponentscanning.
*/
Filter[]excludeFilters()default{};
/**
*Returnsthepostfixtobeusedwhenlookingupcustomrepositoryimplementations.Defaultsto{@literalImpl}.So
*forarepositorynamed{@codePersonRepository}thecorrespondingimplementationclasswillbelookedupscanning
*for{@codePersonRepositoryImpl}.
*
*@return
*/
StringrepositoryImplementationPostfix()default"Impl";
/**
*ConfiguresthelocationofwheretofindtheSpringDatanamedqueriespropertiesfile.Willdefaultto
*{@codeMETA-INF/jpa-named-queries.properties}.
*
*@return
*/
StringnamedQueriesLocation()default"";
/**
*Returnsthekeyofthe{@linkQueryLookupStrategy}tobeusedforlookupqueriesforquerymethods.Defaultsto
*{@linkKey#CREATE_IF_NOT_FOUND}.
*
*@return
*/
KeyqueryLookupStrategy()defaultKey.CREATE_IF_NOT_FOUND;
/**
*Returnsthe{@linkFactoryBean}classtobeusedforeachrepositoryinstance.Defaultsto
*{@linkJpaRepositoryFactoryBean}.
*
*@return
*/
Class>repositoryFactoryBeanClass()defaultJpaRepositoryFactoryBean.class;
/**
*Configuretherepositorybaseclasstobeusedtocreaterepositoryproxiesforthisparticularconfiguration.
*
*@return
*@since1.9
*/
Class>repositoryBaseClass()defaultDefaultRepositoryBaseClass.class;
//JPAspecificconfiguration
/**
*Configuresthenameofthe{@linkEntityManagerFactory}beandefinitiontobeusedtocreaterepositories
*discoveredthroughthisannotation.Defaultsto{@codeentityManagerFactory}.
*
*@return
*/
StringentityManagerFactoryRef()default"entityManagerFactory";
/**
*Configuresthenameofthe{@linkPlatformTransactionManager}beandefinitiontobeusedtocreaterepositories
*discoveredthroughthisannotation.Defaultsto{@codetransactionManager}.
*
*@return
*/
StringtransactionManagerRef()default"transactionManager";
/**
*Configureswhethernestedrepository-interfaces(e.g.definedasinnerclasses)shouldbediscoveredbythe
*repositoriesinfrastructure.
*/
booleanconsiderNestedRepositories()defaultfalse;
/**
*ConfigureswhethertoenabledefaulttransactionsforSpringDataJPArepositories.Defaultsto{@literaltrue}.If
*disabled,repositoriesmustbeusedbehindafacadethat'sconfiguringtransactions(e.g.usingSpring'sannotation
*driventransactionfacilities)orrepositorymethodshavetobeusedtodemarcatetransactions.
*
*@returnwhethertoenabledefaulttransactions,defaultsto{@literaltrue}.
*/
booleanenableDefaultTransactions()defaulttrue;
}
以上为个人经验,希望能给大家一个参考,也希望大家多多支持毛票票。如有错误或未考虑完全的地方,望不吝赐教。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。