Spring data jpa零配置單獨使用

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

1. 引入依賴

??慣例,使用別人的東西,當然得引入別人的包,為了使用 Spring data jpa,我們首先引入Spring Framework,然后再引入Spring data jpa,當然了,使用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)標記 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ù)庫.標準的 Jpa 需要在 classpath 路徑下面配置 META-INF/persistence.xml 文件,在里面寫 orm 和 數(shù)據(jù)源,用戶名,密碼等.當然我們采用 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)的配置完成了,那是不是就應該啟動程序測試一下了呢,那當然是可以了,但是我們用的是 <b>Spring</b> 的東西,我們還得告訴人家,那些類是做什么用的,比如那個是它的 <b>Spring data jpa</b>應該掃描的對象啊之類的東西,所以啊,就引出了下面這個 <b>Spring</b> 的 <b>Java Config</b>類.

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

6. 啟動項目

??到最最關(guān)鍵的一步了就是啟動我們的項目了,大家都知道啟動Spring項目得啟動它的容器,因為我們是采用注解的方式進行的,所以我們啟動的時候得用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)用.我們應該把對數(shù)據(jù)庫的操作交給業(yè)務(wù)層來做,頂層只負責請求處理以及調(diào)用就可以了.對 Sprig zero cofig 配置以以及其中的日志等問題不了解的可以能看 Spring 零配置并解決Log日志

7. 總結(jié)

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末宪卿,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌芭碍,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,430評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件速勇,死亡現(xiàn)場離奇詭異廉白,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評論 3 398
  • 文/潘曉璐 我一進店門撮躁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來嗤军,“玉大人,你說我怎么就攤上這事∑釉颍” “怎么了撤蚊?”我有些...
    開封第一講書人閱讀 167,834評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長忘闻。 經(jīng)常有香客問我,道長硅蹦,這世上最難降的妖魔是什么饲宛? 我笑而不...
    開封第一講書人閱讀 59,543評論 1 296
  • 正文 為了忘掉前任久锥,我火速辦了婚禮,結(jié)果婚禮上青伤,老公的妹妹穿的比我還像新娘号杠。我一直安慰自己立帖,他們只是感情好哩簿,可當我...
    茶點故事閱讀 68,547評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般裹粤。 火紅的嫁衣襯著肌膚如雪终蒂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,196評論 1 308
  • 那天,我揣著相機與錄音拇泣,去河邊找鬼悉尾。 笑死,一個胖子當著我的面吹牛挫酿,可吹牛的內(nèi)容都是我干的构眯。 我是一名探鬼主播,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼早龟,長吁一口氣:“原來是場噩夢啊……” “哼惫霸!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起葱弟,我...
    開封第一講書人閱讀 39,671評論 0 276
  • 序言:老撾萬榮一對情侶失蹤壹店,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后芝加,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體硅卢,經(jīng)...
    沈念sama閱讀 46,221評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,303評論 3 340
  • 正文 我和宋清朗相戀三年藏杖,在試婚紗的時候發(fā)現(xiàn)自己被綠了将塑。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,444評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡蝌麸,死狀恐怖点寥,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情来吩,我是刑警寧澤敢辩,帶...
    沈念sama閱讀 36,134評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站弟疆,受9級特大地震影響戚长,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜怠苔,卻給世界環(huán)境...
    茶點故事閱讀 41,810評論 3 333
  • 文/蒙蒙 一同廉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧嘀略,春花似錦恤溶、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至讼育,卻和暖如春帐姻,著一層夾襖步出監(jiān)牢的瞬間稠集,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評論 1 272
  • 我被黑心中介騙來泰國打工饥瓷, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留剥纷,地道東北人。 一個月前我還...
    沈念sama閱讀 48,837評論 3 376
  • 正文 我出身青樓呢铆,卻偏偏與公主長得像晦鞋,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子棺克,可洞房花燭夜當晚...
    茶點故事閱讀 45,455評論 2 359

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