Spring data jpa零配置單獨使用

??有時候在項目中,我們并不是每個項目都是 Web 項目,我們也許只是對接一下接口或者單純的操作一下數(shù)據(jù)庫而已,但是如果直接使用 Jdbc 進(jìn)行又比較麻煩,這時候就比較懷念使用 Spring 進(jìn)行 Web 開發(fā)的日子,操作數(shù)據(jù)庫不能更簡單了.還要 Spring 的項目基本都可以單獨拿來使用,這樣我們就不必為了一個簡單的數(shù)據(jù)操作引入一些不必要的東西,Spring data jpa 就剛好滿足了操作數(shù)據(jù)庫的需求,而且 Jpa 可以為我們的程序帶來很好的移植性,訪問不同的數(shù)據(jù)庫僅僅是需要修改一下數(shù)據(jù)連接就可以完善搞定.下面我們就以 Mysql 為例,對一個 User 對象進(jìn)行操作.

1. 引入依賴

??慣例,使用別人的東西,當(dāng)然得引入別人的包,為了使用 Spring data jpa,我們首先引入Spring Framework,然后再引入Spring data jpa,當(dāng)然了,使用MySql數(shù)據(jù)庫,我們了得引入它的數(shù)據(jù)庫連接.除此之外還得引入一些其它東西,比如Hibernate這樣的 Orm 框架,還有一些日志相關(guān)的東西,些片省略...

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <spring.version>4.3.5.RELEASE</spring.version>
    <spring-data-jpa.version>1.11.1.RELEASE</spring-data-jpa.version>
    <spring-data-commons-core.version>1.4.1.RELEASE</spring-data-commons-core.version>
    <hibernate.version>5.2.9.Final</hibernate.version>
    <mysql.conn.version>5.1.27</mysql.conn.version>
</properties>

<dependencies>
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-test -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.springframework.data/spring-data-jpa -->
    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-jpa</artifactId>
        <version>${spring-data-jpa.version}</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core -->
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>${hibernate.version}</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>${mysql.conn.version}</version>
    </dependency>
</dependencies>

特別注意的地方需要說明一下:

  • 引入Hibernate框架的時候,只引入核心版本就可以了,不用引入Hibernaet entitymanager,因為高版本的 core 帶了 entitymanager,而且 Maven 倉庫里面已經(jīng)標(biāo)記 entitymanager 過時了;
  • 引入 Spring 的時候,需要引入 4.3.X 及其以上的版本,不然運行的時候會報錯,其中的類 MethodClassKey.java 找不到,因為該類是 4.3 以后才引入的.

2. 創(chuàng)建實體

實體就是一個單獨的 User,實現(xiàn)對它CRUD操作就 Okay了.

@Entity
@Table
public class User implements Serializable {
    
    private static final long serialVersionUID = -2407677666514147913L;

    @Id
    @GeneratedValue
    private Long id;

    @Column(unique = true)
    private String userName;
    
    private String password;
}

上面就是一個很簡單的實體對象了,它實現(xiàn)了序例化接口,僅擁有三個屬性,而其中一個還是主鍵.

3. 創(chuàng)建Respository對象

??因為我們使用的是 Spring data jpa,它給我們提供了一系列的操作,我們實現(xiàn)它的接口,并按它的規(guī)則定義接口里面的方法就可以實現(xiàn)數(shù)據(jù)庫的CRUD操作.

@Repository
public interface UserRep extends JpaRepository<User, Long>{
    
    public User findByUserName(String userName);
}
// 不能更簡單

4. 數(shù)據(jù)庫配置

??為了示例的簡單,我們跳過邏輯業(yè)務(wù)層的定義,直接配置數(shù)據(jù)庫相關(guān)的操作,運行程序的時候操作調(diào)用 Repository 操作數(shù)據(jù)庫.標(biāo)準(zhǔn)的 Jpa 需要在 classpath 路徑下面配置 META-INF/persistence.xml 文件,在里面寫 orm 和 數(shù)據(jù)源,用戶名,密碼等.當(dāng)然我們采用 zero confgi ,這些東西,通通都不要了,只需要創(chuàng)建一個類,把它指定為配置文件就 OK 了.

@Configuration
@EnableTransactionManagement
public class PersistenceJPAConfig {

    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
        LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
        em.setDataSource(dataSource());
        // 把 package names 修改為你的 User 類所在的包名就可以了
        em.setPackagesToScan(new String[]{"package names"});
        JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        em.setJpaVendorAdapter(vendorAdapter);
        em.setJpaProperties(additionalProperties());
        return em;
    }
    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/數(shù)據(jù)庫名");
        dataSource.setUsername("用戶名");
        dataSource.setPassword("密碼");
        return dataSource;
    }
    @Bean
    public PlatformTransactionManager transactionManager(
            EntityManagerFactory emf) {
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(emf);
        return transactionManager;
    }
    @Bean
    public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
        return new PersistenceExceptionTranslationPostProcessor();
    }

    Properties additionalProperties() {
        Properties properties = new Properties();
        properties.setProperty("hibernate.hbm2ddl.auto", "create-drop");
        properties.setProperty("hibernate.dialect",
                "org.hibernate.dialect.MySQL5Dialect");
        return properties;
    }
}

為什么要有這個文件,因為 <b>Spring data jpa</b> 就是這樣規(guī)定的,關(guān)鍵點在于返回的那個 <b>transactionManager</b>,它就是 <b>Jpa</b>操作數(shù)據(jù)庫的東西,也就是 <b>entitymanager</b>,所以才有了這個配置文件,以及里面的一些附加的東西,不然程序怎么知道你的數(shù)據(jù)以及密碼呢?

5. Spring配置

上面的數(shù)據(jù)庫相關(guān)的配置完成了,那是不是就應(yīng)該啟動程序測試一下了呢,那當(dāng)然是可以了,但是我們用的是 <b>Spring</b> 的東西,我們還得告訴人家,那些類是做什么用的,比如那個是它的 <b>Spring data jpa</b>應(yīng)該掃描的對象啊之類的東西,所以啊,就引出了下面這個 <b>Spring</b> 的 <b>Java Config</b>類.

@Configuration
@ComponentScan(basePackages = {"Spring需要掃描的包名"})
@EnableJpaRepositories(basePackages = {"定義的Jpa Respository所在的包位置"})
public class AppConfig {
    // ...
}

6. 啟動項目

??到最最關(guān)鍵的一步了就是啟動我們的項目了,大家都知道啟動Spring項目得啟動它的容器,因為我們是采用注解的方式進(jìn)行的,所以我們啟動的時候得用AnnotationConfigApplicationContext 這個類來啟動.

@ComponentScan(basePackageClasses = {AppConfig.class,PersistenceJPAConfig.class})
public class App {
private static final Logger log = LoggerFactory.getLogger(App.class);

    public static void main(String[] args) {
        log.debug("Start spring ....");
        @SuppressWarnings("resource")
        ApplicationContext context = new AnnotationConfigApplicationContext(App.class);
        UserRep userRep = context.getBean(UserRep.class);
        User user = new User();
        user.setUserName("UserName");
        user.setPassword("password");
        System.out.println(userRep.save(user).getId());
    }
}

如此整個工作就算完成了,但是這兒跨層級調(diào)用.我們應(yīng)該把對數(shù)據(jù)庫的操作交給業(yè)務(wù)層來做,頂層只負(fù)責(zé)請求處理以及調(diào)用就可以了.對 Sprig zero cofig 配置以以及其中的日志等問題不了解的可以能看 Spring 零配置并解決Log日志

7. 總結(jié)

因為本例以最簡單的方式來說明這個問題,其中有的地方比較精簡,詳細(xì)內(nèi)容我已經(jīng)放在 GitHub,大家可以 <b>Git</b> 下來看,寫得不好的地方還請多多指點.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,835評論 6 534
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,676評論 3 419
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,730評論 0 380
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,118評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 71,873評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,266評論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,330評論 3 443
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,482評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,036評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,846評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,025評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,575評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,279評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,684評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,953評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,751評論 3 394
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,016評論 2 375

推薦閱讀更多精彩內(nèi)容