熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

Spring Data JPA初使用

2013-11-23 19:08:15  來源: Java核心技術 

  我們都知道Spring是一個非常優秀的JavaEE整合框架它盡可能的減少我們開發的工作量和難度
   
    在持久層的業務邏輯方面Spring開源組織又給我們帶來了同樣優秀的Spring Data JPA
   
    通常我們寫持久層都是先寫一個接口再寫接口對應的實現類在實現類中進行持久層的業務邏輯處理
   
    而現在Spring Data JPA幫助我們自動完成了持久層的業務邏輯處理我們要做的僅僅是聲明一個持久層接口
   
    下載開發所需要的發布包
   
    )springframeworkRELEASEwithdocszip
   
    下載地址framework
   
    )hibernatereleaseFinalzip
   
    下載地址
   
    )Spring Data JPA
   
    Spring Data JPA
   
    下載地址data/jpa
   
    Spring Data Commons
   
    下載地址data/commons
   
    )其他一些依賴包可以從 上查找下載
   
    新建一個Web項目 springdatajpa把相應的jar包放到/WebRoot/WEBINF/lib目錄下
   
    我也沒有挑選哪些是不需要的最後用到的jar如下
   
    antlrjarsfcglibjaraopalliancejarmonsloggingjaraspectjweaverRELEASEjarcommonslangjardomjjarhibernatecommonsannotationsFinaljarhibernatecoreFinaljarhibernateentitymanagerFinaljarhibernatejpaapiFinaljarjavassistGAjarjbossloggingGAjarjbosstransactionapi__specFinaljarlogjjarmysqlconnectorjavabinjarorgspringframeworkaopRELEASEjarorgspringframeworkasmRELEASEjarorgspringframeworkaspectsRELEASEjarorgspringframeworkbeansRELEASEjarorgntextRELEASEjarorgntextsupportRELEASEjarorgreRELEASEjarorgspringframeworkexpressionRELEASEjarorgspringframeworkinstrumentRELEASEjarorgspringframeworkinstrumenttomcatRELEASEjarorgspringframeworkjdbcRELEASEjarorgspringframeworkjmsRELEASEjarorgspringframeworkjsresourcesRELEASEjarorgspringframeworkormRELEASEjarorgspringframeworkoxmRELEASEjarorgspringframeworktestRELEASEjarorgspringframeworktransactionRELEASEjarorgspringframeworkwebRELEASEjarorgspringframeworkwebportletRELEASEjarorgspringframeworkwebservletRELEASEjarslfjapijarslfjlogjjarspringdatacommonscoreMjarspringdatajpaRELEASEjar
   
    在MySql數據庫中建立一個叫spring_data_jpa的數據庫
   
    create database spring_data_jpa default character set utf;


   
    JPA配置文件persistencexml
   
    )在src目錄下建立一個叫METAINF的文件夾
   
    )在METAINF文件夾下建立persistencexml文件
   
    persistencexml內容如下
   
    xml version= encoding=UTF?><persistence version= xmlns=
   
    xmlns:xsi=instance
   
    xsi:schemaLocation=
   
    __xsd>
   
    <persistenceunit name=myJPA transactiontype=RESOURCE_LOCAL>
   
    <provider>orghibernateejbHibernatePersistenceprovider>
   
    <properties>
   
    <property name=hibernatedialect value=orghibernatedialectMySQLDialect />
   
    <property name=nnectiondriver_class value=commysqljdbcDriver />
   
    <property name=nnectionusername value=root />
   
    <property name=nnectionpassword value=root />
   
    <property name=nnectionurl value=jdbc:mysql://localhost:/spring_data_jpa?useUnicode=true&characterEncoding=UTF />
   
    <property name=hibernatemax_fetch_depth value= />
   
    <property name=hibernatehbmddlauto value=update />
   
    <property name=hibernateshow_sql value=true />
   
    <property name=hibernateformat_sql value=true />
   
    <property name=javaxpersistencevalidationmode value=none/>
   
    properties>
   
    persistenceunit>
   
    persistence>
   
    Spring配置文件applicationContextxml
   
    在src目錄下建立applicationContextxml
   
    applicationContextxml內容如下
   
    xml version= encoding=UTF?>  <beans xmlns=
   
    xmlns:xsi=instance
   
    xmlns:context=
   
    xmlns:aop=
   
    xmlns:tx=
   
    xmlns:p=
   
    xmlns:cache=
   
    xmlns:jpa=
   
    xsi:schemaLocation=
   
    beansxsd
   
   
   
    contextxsd
   
   
   
    aopxsd
   
   
   
    txxsd
   
   
   
    cachexsd
   
   
   
    jpaxsd>
   
    <context:annotationconfig />
   
    <context:componentscan basepackage=cnluxhapp/>
   
    <bean id=entityManagerFactory class=orgspringframeworkormjpaLocalContainerEntityManagerFactoryBean>
   
    <property name=persistenceUnitName value=myJPA/>
   
    bean>
   
    <bean id=transactionManager class=orgspringframeworkormjpaJpaTransactionManager>
   
    <property name=entityManagerFactory ref=entityManagerFactory />
   
    bean>
   
    <tx:annotationdriven transactionmanager=transactionManager/>
   
    <jpa:repositories basepackage=cnluxhapprepository/>
   
    beans>
   


    webxml
   
    webxml內容如下
   
    xml version= encoding=UTF?><webapp version=
   
    xmlns=
   
    xmlns:xsi=instance
   
    xsi:schemaLocation=
   
    app__xsd>  <displayname>displayname>
   
    <contextparam>
   
    <paramname>webAppRootKeyparamname>
   
    <paramvalue>springdatajparootparamvalue>  contextparam>  <contextparam>
   
    <paramname>logjConfigLocationparamname>
   
    <paramvalue>classpath:logjpropertiesparamvalue>  contextparam>  <listener>
   
    <listenerclass>orgspringframeworkwebutilLogjConfigListenerlistenerclass>  listener>
   
    <filter>
   
    <filtername>characterEncodingFilterfiltername>
   
    <filterclass>orgspringframeworkwebfilterCharacterEncodingFilterfilterclass>
   
    <initparam>
   
    <paramname>encodingparamname>
   
    <paramvalue>UTFparamvalue>
   
    initparam>
   
    filter>  <filtermapping>
   
    <filtername>characterEncodingFilterfiltername>
   
    <urlpattern>/*urlpattern>  filtermapping>
   
    <contextparam>
   
    <paramname>contextConfigLocationparamname>
   
    <paramvalue>classpath:applicationContextxmlparamvalue>  contextparam>  <listener>
   
    <listenerclass>orgsprntextContextLoaderListenerlistenerclass>  listener>
   
    <listener>
   
    <listenerclass>orgspringframeworkwebutilIntrospectorCleanupListenerlistenerclass>
   
    listener>
   
    <welcomefilelist>
   
    <welcomefile>indexjspwelcomefile>  welcomefilelist>webapp>
   
    日志配置
   
    在src目錄下建立logjproperties文件
   
    logjproperties內容如下
   
    logjrootLogger=INFOCONSOLEFIapache=true # 應用於控制台 logjappenderCONSOLE=orgapachelogjConsoleAppender logjappenderThreshold=INFO logjappenderCONSOLETarget=Systemout logjappenderCONSOLElayout=orgapachelogjPatternLayout logjappenderCONSOLElayoutConversionPattern=[framework] %d %c %r [%t] %p %c %x %m%n #logjappenderCONSOLElayoutConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD] n%c[CATEGORY]%n%m[MESSAGE]%n%n #應用於文件 logjappenderFILE=orgapachelogjDailyRollingFileAppenderlogjappenderFILEFile=${springdatajparoot}/springdatajpalog logjappenderFILEAppend=true logjappenderFILElayout=orgapachelogjPatternLayout logjappenderFILElayoutConversionPattern=[framework] %d %c %r [%t] %p %c %x %m%n
   
    所有環境配完畢開始寫一個Spring Data JPA 的增刪改查
   
    )建立相應的包
   
    )領域模型實體類User
   
    package cnluxhappdomain;import javaxpersistenceEntity;import javaxpersistenceGeneratedValue;import javaxpersistenceId;import javaxpersistenceTable;/** * 用戶信息 * @author Luxh * */@Entity@Table(name=t_user)public class User {
   
    @Id
   
    @GeneratedValue
   
    private Integer id;
   
    //賬號
   
    private String account;
   
    //姓名
   
    private String name;
   
    //密碼
   
    private String password;
   
    //省略 getter和setter方法}
   
    )聲明持久層接口UserRepository
   
    讓UserRepository接口繼承CrudRepositoryT是領域實體ID是領域實體的主鍵類型CrudRepository實現了相應的增刪改查方法
   
    package cnluxhapprepository;import orgspringframeworkdatarepositoryCrudRepository;import cnluxhappdomainUser;/** * 用戶持久層接口 * @author Luxh * */public interface UserRepository extends CrudRepository{
   
    }
   
    不再需要持久層接口實現類


   
    )業務層
   
    一般多層架構是控制層調用業務層業務層再調用持久層所以這裡寫個業務層
   
    a業務層接口
   
    package cnluxhappservice;import cnluxhappdomainUser;/** * 用戶業務接口 * @author Luxh * */public interface UserService {
   
    /**
   
    * 保存用戶
   
    * @param user
   
    */
   
    void saveUser(User user)
   
    /**
   
    * 根據id查找用戶
   
    * @param id
   
    * @return
   
    */
   
    User findUserById(Integer id)
   
    /**
   
    * 更新用戶
   
    * @param user
   
    */
   
    void updateUser(User user)
   
    /**
   
    * 根據ID刪除用戶
   
    * @param id
   
    */
   
    void deleteUserById(Integer id)
   
    }
   
    b業務層接口實現類
   
    package cnluxhappservice;import orgspringframeworkbeansfactoryannotationAutowired;import orgspringframeworkstereotypeService;import orgspringframeworktransactionannotationTransactional;import cnluxhappdomainUser;import cnluxhapprepositoryUserRepository;/** * 用戶業務服務實現類 * @author Luxh * */@Service(userService)public class UserServiceImpl implements UserService{
   
    @Autowired
   
    private UserRepository userRepository;//注入UserRepository
   
    @Override
   
    @Transactional
   
    public void saveUser(User user) {
   
    userRepositorysave(user)
   
    }
   
    @Override
   
    @Transactional(readOnly=true)
   
    public User findUserById(Integer id) {
   
    return userRepositoryfindOne(id)
   
    }
   
    @Override
   
    @Transactional
   
    public void updateUser(User user) {
   
    userRepositorysave(user)
   
    }
   
    @Override
   
    @Transactional
   
    public void deleteUserById(Integer id) {
   
    userRepositorydelete(id)
   
    }}
   
    )編寫測試用例
   
    在執行測試的時候發現如下錯誤
   
    Caused by: javalangNoSuchMethodError: javaxpersistencespiPersistenceUnitInfogetValidationMode()Ljavax/persistence/ValidationMode;
   
    at orghibernateejbEnfigure(EjbConfigurationjava:
   
    at orghibernateejbHibernatePersistencecreateContainerEntityManagerFactory(HibernatePersistencejava:
   
    at orgspringframeworkormjpaLocalContainerEntityManagerFactoryBeancreateNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBeanjava:
   
    at orgspringframeworkormjpaAbstractEntityManagerFactoryBeanafterPropertiesSet(AbstractEntityManagerFactoryBeanjava:
   
    at orgspringframeworkbeansfactorysupportAbstractAutowireCapableBeanFactoryinvokeInitMethods(AbstractAutowireCapableBeanFactoryjava:
   
    at orgspringframeworkbeansfactorysupportAbstractAutowireCapableBeanFactoryinitializeBean(AbstractAutowireCapableBeanFactoryjava:
   
    … more


   
    網上說是新版本的Hibernate跟javaeejar裡面的JPA接口沖突了
   
    解決方法移除MyEclipse自帶的Java EE Libraries自己新建一個user libraries加入Java EE中的jsfapijarjsfimpljar和jstljar再加入Tomcat中自帶的
   
    servletapijar












  

  

  

  

  

  用servletapijar替換掉javaeejar就沒問題了


   
測試代碼
   
    package cnluxhapptest;import orgjunitAssert;import orgjunitTest;import orgjunitrunnerRunWith;import orgspringframeworkbeansfactoryannotationAutowired;import orgsprintextContextConfiguration;import orgsprintextjunitSpringJUnitClassRunner;import cnluxhappdomainUser;import cnluxhappserviceUserService;@RunWith(SpringJUnitClassRunnerclass)@ContextConfiguration({/applicationContextxml}) public class UserTest {
   
    @Autowired
   
    private UserService userService;
   
    //保存用戶
   
    @Test
   
    public void testSaveUser() {
   
    User user = new User()
   
    usersetAccount(LiHuai
   
    usersetName(李壞
   
    usersetPassword(
   
    userServicesaveUser(user)
   
    }
   
    //根據id查找用戶
   
    @Test
   
    public void testFindUserById() {
   
    Integer id = ;
   
    User user = userServicefindUserById(id)
   
    AssertassertEquals(李壞usergetName())
   
    }
   
    //更新用戶
   
    @Test
   
    public void testUpdateUser() {
   
    Integer id = ;
   
    User user = userServicefindUserById(id)
   
    usersetName(李尋歡
   
    userServiceupdateUser(user)
   
    }
   
    //根據id刪除用戶
   
    @Test
   
    public void testDeleteUserById() {
   
    Integer id = ;
   
    userServicedeleteUserById(id)
   
    }}
   
    使用Spring Data JPA相當的簡單我們只需要定義持久層的接口不需要編寫實現代碼
   
    步驟和注意點
   
    )在spring配置文件中添加倉庫接口的掃描路徑
   
    )編寫領域實體需要按照JPA規范
   
    )編寫倉庫Repository接口依靠Spring Data規范定義接口方法
   
    比如按照規范定義一個數據訪問接口方法  List findByName(String name)
   
    Spring Data JPA 就會自動轉化為 select u from User u where uname = ?
   
    可以使用的倉庫接口有
   
    Repository:
   
    是 Spring Data的一個核心接口它不提供任何方法開發者需要在自己定義的接口中聲明需要的方法
   
    CrudRepository:
   
    繼承Repository提供增刪改查方法可以直接調用
   
    PagingAndSortingRepository:
   
    繼承CrudRepository具有分頁查詢和排序功能
   
    JpaRepository:
   
    繼承PagingAndSortingRepository針對JPA技術提供的接口
   
    JpaSpecificationExecutor:
   
    可以執行原生SQL查詢


From:http://tw.wingwit.com/Article/program/Java/hx/201311/26344.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.