基于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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。