欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring4整合Hibernate5詳細(xì)步驟

 更新時(shí)間:2017年04月28日 14:44:42   作者:GW_Cheng  
本篇文章主要介紹了Spring4整合Hibernate5詳細(xì)步驟,具有一定的參考價(jià)值,有興趣的同學(xué)可以了解一下

Spring與Hiberante整合

通過(guò)hibernate的學(xué)習(xí),我們知道,hibernate主要在hibernate.cfg.xml配置文件中

接下來(lái)我們看一下hibernate的一個(gè)配置文件

hibernate配置文件

hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
  "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
  "http://hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
  <session-factory>
    <!-- 指定連接數(shù)據(jù)庫(kù)所用的驅(qū)動(dòng) -->
    <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
    <!-- 指定連接數(shù)據(jù)庫(kù)的url,其中hibernate是本應(yīng)用連接的數(shù)據(jù)庫(kù)名 -->
    <property name="connection.url">jdbc:mysql://localhost/hibernate_test</property>
    <!-- 指定連接數(shù)據(jù)庫(kù)的用戶名 -->
    <property name="connection.username">root</property>
    <!-- 指定連接數(shù)據(jù)庫(kù)的密碼 -->
    <property name="connection.password">cheng</property>
    <!-- 指定連接池里最大連接數(shù) -->
    <property name="hibernate.c3p0.max_size">20</property>
    <!-- 指定連接池里最小連接數(shù) -->
    <property name="hibernate.c3p0.min_size">1</property>
    <!-- 指定連接池里連接的超時(shí)時(shí)長(zhǎng) -->
    <property name="hibernate.c3p0.timeout">5000</property>
    <!-- 指定連接池里最大緩存多少個(gè)Statement對(duì)象 -->
    <property name="hibernate.c3p0.max_statements">100</property>
    <property name="hibernate.c3p0.idle_test_period">3000</property>
    <property name="hibernate.c3p0.acquire_increment">2</property>
    <property name="hibernate.c3p0.validate">true</property>
    <!-- 指定數(shù)據(jù)庫(kù)方言 -->
    <property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
    <!-- 根據(jù)需要自動(dòng)創(chuàng)建數(shù)據(jù)表 -->
    <property name="hbm2ddl.auto">update</property><!--①-->
    <!-- 顯示Hibernate持久化操作所生成的SQL -->
    <property name="show_sql">true</property>
    <!-- 將SQL腳本進(jìn)行格式化后再輸出 -->
    <property name="hibernate.format_sql">true</property>
    <!-- 避免這個(gè)錯(cuò)誤信息Disabling contextual LOB creation as createClob() method threw error :java.lang.reflect.InvocationTargetException -->
    <property name="hibernate.temp.use_jdbc_metadata_defaults">false</property>
    <!-- 羅列所有持久化類的類名 -->
    <mapping class="com.wechat.entity.po.User"/>
    <mapping class="com.wechat.entity.po.Person"/>
  </session-factory>
</hibernate-configuration>

配置文件的作用

hibernate.cfg.xml文件的主要作用就是配置了一個(gè)session-factory

  1. 在session-factory中主要通過(guò)property配置一些數(shù)據(jù)庫(kù)的連接信息,我們知道,spring通常會(huì)將這種數(shù)據(jù)庫(kù)連接用dataSource來(lái)表示,這樣一來(lái),hibernate.cfg.xml文件中的所有跟數(shù)據(jù)庫(kù)連接的都可以干掉了,直接用spring的dataSource,而dataSource也可以用c3p0、dbcp等。
  2. 在session-factory中通過(guò)property除了配置一些數(shù)據(jù)庫(kù)的連接信息之外,還有一些hibernate的配置,比如方言、自動(dòng)創(chuàng)建表機(jī)制、格式化sql等,這些信息也需要配置起來(lái)。
  3. 還有最關(guān)鍵的一個(gè)持久化類所在路徑的配置

當(dāng)不采用spring整合的時(shí)候,我們使用hibernate時(shí)主要是用hibernate從sessionFactory中去的session,然后用session來(lái)操作持久化對(duì)象,而sessionFactory來(lái)自于配置文件。像下面這樣:

  StandardServiceRegistry registry = null;
  SessionFactory sessionFactory = null;
  Session session = null;
  Transaction transaction = null;
  SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

  @Before
  public void init() {

    registry = new StandardServiceRegistryBuilder()
        .configure() // configures settings from hibernate.cfg.xml
        .build();
    sessionFactory = new MetadataSources( registry ).buildMetadata().buildSessionFactory();
    session = sessionFactory.openSession();
    //開始事務(wù)
    transaction = session.getTransaction();
    transaction.begin();
  }

  @Test
  public void testSaveUser() {
    User user = new User();
    user.setUsername("張學(xué)友");
    user.setPassword("jacky");
    user.setRegistDate(sdf.format(new Date()));
    File file = new File("D:"+File.separator+"ubuntu.png");
    String fileName = file.getName();
    String prefix=fileName.substring(fileName.lastIndexOf(".")+1);
    System.out.println(prefix);
    InputStream input = null;
    try {
      input = new FileInputStream(file);

    } catch (FileNotFoundException e) {
      e.printStackTrace();
    }

    Blob image = null;
    try {
      image = Hibernate.getLobCreator(session).createBlob(input,input.available());
    } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
    user.setUserPic(image);
    session.save(user);
  }

  @After 
  public void destroy(){
    transaction.commit();
    session.close();
    sessionFactory.close();
    StandardServiceRegistryBuilder.destroy( registry );
  }

Spring對(duì)hibernate的整合就是將上述三點(diǎn)通過(guò)spring配置起來(lái),而hibernate最關(guān)鍵的sessionFactroy就是spring的一個(gè)bean

這些理解了整合就簡(jiǎn)單了,

SessionFactoryBean

spring的sessionFactroy像下面這樣配置:

<!-- 加載配置文件 -->
  <context:property-placeholder location="classpath:jdbc.properties"
    file-encoding="utf-8" ignore-unresolvable="true" />

  <bean id="sessionFactory"
    class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="packagesToScan">
      <list>
        <!-- 可以加多個(gè)包 -->
        <value>com.wechat.entity.po</value>
      </list>
    </property>
    <property name="hibernateProperties">
      <props>
        <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop>
        <prop key="hibernate.dialect">${hibernate.dialect}</prop>
        <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
        <prop key="hibernate.format_sql">${hibernate.format_sql}</prop>
        <prop key="hibernate.temp.use_jdbc_metadata_defaults">false</prop>
      </props>
    </property>
  </bean>

通過(guò)bean的配置可以看出該bean就是hibernate的sessionFactroy

因?yàn)樗赶蛄薿rg.springframework.orm.hibernate5.LocalSessionFactoryBean

在這個(gè)bean中主要配置了上面說(shuō)的三點(diǎn):

  1. 數(shù)據(jù)源dataSource
  2. hibernate的配置,包括方言,輸出sql等
  3. 持久化類的位置,通過(guò)包進(jìn)行掃描

下面給出數(shù)據(jù)源dataSource的配置

dataSource

<!-- 配置數(shù)據(jù)源 -->
  <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
    destroy-method="close" p:driverClass="${jdbc.driverClassName}"
    p:jdbcUrl="${jdbc.url}" p:user="${jdbc.username}" p:password="${jdbc.password}"
    p:testConnectionOnCheckout="${jdbc.c3p0.testConnectionOnCheckout}"
    p:testConnectionOnCheckin="${jdbc.c3p0.testConnectionOnCheckin}"
    p:idleConnectionTestPeriod="${jdbc.c3p0.idleConnectionTestPeriod}"
    p:initialPoolSize="${jdbc.c3p0.initialPoolSize}" p:minPoolSize="${jdbc.c3p0.minPoolSize}"
    p:maxPoolSize="${jdbc.c3p0.maxPoolSize}" p:maxIdleTime="${jdbc.c3p0.maxIdleTime}" />

還有數(shù)據(jù)庫(kù)的連接信息

jdbc.properties

#-----------------------------------------------------
# 數(shù)據(jù)庫(kù)配置
#-----------------------------------------------------
#服務(wù)器地址
host=127.0.0.1
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://${host}:3306/hibernate_test
jdbc.username=root
jdbc.password=cheng

#-----------------------------------------------------
# 適用于c3p0的配置
#-----------------------------------------------------
#-----------------------------------------------------
# c3p0反空閑設(shè)置,防止8小時(shí)失效問(wèn)題28800
#-----------------------------------------------------
#idleConnectionTestPeriod要小于MySQL的wait_timeout
jdbc.c3p0.testConnectionOnCheckout=false
jdbc.c3p0.testConnectionOnCheckin=true
jdbc.c3p0.idleConnectionTestPeriod=3600
#-----------------------------------------------------
# c3p0連接池配置
#-----------------------------------------------------
#initialPoolSize, minPoolSize, maxPoolSize define the number of Connections that will be pooled.
#Please ensure that minPoolSize <= maxPoolSize.
#Unreasonable values of initialPoolSize will be ignored, and minPoolSize will be used instead.
jdbc.c3p0.initialPoolSize=10
jdbc.c3p0.minPoolSize=10
jdbc.c3p0.maxPoolSize=100
#maxIdleTime defines how many seconds a Connection should be permitted to go unused before being culled from the pool.
jdbc.c3p0.maxIdleTime=3600
#-----------------------------------------------------
# hibernate連接池配置
#-----------------------------------------------------
hibernate.connection.driverClass=com.mysql.jdbc.Driver
hibernate.connection.url=jdbc:mysql://${host}:3306/${dbName}
hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
hibernate.show_sql=true
hibernate.format_sql=true
hibernate.hbm2ddl.auto=update

配置完這些還有spring強(qiáng)大的事務(wù)管理

<!-- 配置Hibernate事務(wù)管理器 -->
  <bean id="transactionManager"
    class="org.springframework.orm.hibernate5.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
  </bean>

  <!-- 配置事務(wù)異常封裝 -->
  <bean id="persistenceExceptionTranslationPostProcessor"
    class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />

  <!-- 基于數(shù)據(jù)源的事務(wù)管理器 -->
  <!-- <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" 
    p:dataSource-ref="dataSource" /> -->

  <!-- 配合<tx:advice>和<aop:advisor>完成了事務(wù)切面的定義 -->
  <!-- 使用強(qiáng)大的切點(diǎn)表達(dá)式是語(yǔ)言輕松定義目標(biāo)方法 -->
  <aop:config proxy-target-class="true">
    <!-- 通過(guò)aop定義事務(wù)增強(qiáng)切面 -->
    <aop:pointcut expression=" execution(* com.wechat.service..*(..))"
      id="serviceMethod" />
    <!-- 引用事務(wù)增強(qiáng) -->
    <aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethod" />
  </aop:config>
  <!-- 事務(wù)增強(qiáng) -->
  <tx:advice id="txAdvice" transaction-manager="transactionManager">
    <!-- 事務(wù)屬性定義 -->
    <tx:attributes>
      <tx:method name="*" />
    </tx:attributes>
  </tx:advice>

好了,這些配置好之后就可以使用在spring中配置的sessionFactroy了

UserDao

package com.wechat.dao;

import java.util.List;

import com.wechat.entity.po.User;

public interface UserDao {
  // 得到所有用戶
  public List<User> getAllUser();

  // 檢測(cè)用戶名是否存在
  public boolean isExists(String username);

}

實(shí)現(xiàn)類

package com.wechat.dao.impl;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import com.wechat.dao.UserDao;
import com.wechat.entity.po.User;
@Repository
public class UserDaoImpl implements UserDao {
  //注入sessionFactory
  @Autowired
  private SessionFactory sessionFactory;

  @SuppressWarnings("unchecked")
  @Override
  public List<User> getAllUser() {
    List<User> userList = new ArrayList<User>();
    String hsql="from User";
    Session session = sessionFactory.getCurrentSession();
    Query query = session.createQuery(hsql);
    userList = query.list();
    return userList;
  }

  @Override
  public boolean isExists(String username) {
    Query query = sessionFactory.openSession()
        .createQuery("from User u where u.username = :username").setParameter("username", username);
    System.out.println(query.list().size());
    return query.list().size()>0?true:false;
  }

}

UserService

package com.wechat.service.user;

import java.util.List;

import com.wechat.entity.po.User;

public interface UserService {
  public List<User> getAllUser();
  public boolean isExists(String username);

}

實(shí)現(xiàn)類

package com.wechat.service.user.impl;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

import com.wechat.dao.UserDao;
import com.wechat.entity.po.User;
import com.wechat.service.user.UserService;
@Service
public class UserServiceImpl implements UserService {
  @Autowired
  private UserDao userDao;
  @Override
  public List<User> getAllUser() {
    return userDao.getAllUser();
  }
  @Override
  @Cacheable(cacheNames="isExists", key="#username")
  public boolean isExists(String username) {
    return userDao.isExists(username);
  }

}

因?yàn)槭聞?wù)管理是配置在service層,所以用service來(lái)測(cè)試

測(cè)試

package com.wechat.dao;

import java.util.List;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.wechat.entity.po.User;
import com.wechat.service.user.UserService;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:spring/spring-core.xml" })
public class UserServiceTest {
  @Autowired
  private UserService userService;

  @Test
  public void test() {
    List<User> userList = userService.getAllUser();
    for(User user:userList){
      System.out.println(user.getUsername());
    }

  }

}

輸入結(jié)果

Hibernate: 
  select
    user0_.userid as userid1_2_,
    user0_.password as password2_2_,
    user0_.registDate as registDa3_2_,
    user0_.userPic as userPic4_2_,
    user0_.username as username5_2_ 
  from
    user_info user0_
程高偉
張學(xué)友

數(shù)據(jù)庫(kù)表

好了Spring整合hibernate就寫到這里。

項(xiàng)目地址:https://github.com/peer44/testwechat

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java 八種基本類型和基本類型封裝類

    Java 八種基本類型和基本類型封裝類

    八種基本數(shù)據(jù)類型分別是:int、short、float、double、long、boolean、byte、char;下面跟隨腳本之家小編一起學(xué)習(xí)java八種基本類型和基本類型封裝類
    2017-09-09
  • SpringBoot中Elasticsearch的連接配置原理與使用詳解

    SpringBoot中Elasticsearch的連接配置原理與使用詳解

    Elasticsearch是一種開源的分布式搜索和數(shù)據(jù)分析引擎,它可用于全文搜索、結(jié)構(gòu)化搜索、分析等應(yīng)用場(chǎng)景,本文主要介紹了SpringBoot中Elasticsearch的連接配置原理與使用詳解,感興趣的可以了解一下
    2023-09-09
  • 使用gRPC微服務(wù)的內(nèi)部通信優(yōu)化

    使用gRPC微服務(wù)的內(nèi)部通信優(yōu)化

    這篇文章主要為大家介紹了微服務(wù)優(yōu)化之使用gRPC做微服務(wù)的內(nèi)部通信,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-03-03
  • Java連接數(shù)據(jù)庫(kù)oracle中文亂碼解決方案

    Java連接數(shù)據(jù)庫(kù)oracle中文亂碼解決方案

    這篇文章主要介紹了Java連接數(shù)據(jù)庫(kù)oracle中文亂碼解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • response文件流輸出文件名中文不顯示的解決

    response文件流輸出文件名中文不顯示的解決

    這篇文章主要介紹了response文件流輸出文件名中文不顯示的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Java?Spring?Boot請(qǐng)求方式與請(qǐng)求映射過(guò)程分析

    Java?Spring?Boot請(qǐng)求方式與請(qǐng)求映射過(guò)程分析

    這篇文章主要介紹了Java?Spring?Boot請(qǐng)求方式與請(qǐng)求映射過(guò)程分析,Spring?Boot支持Rest風(fēng)格:使用HTTP請(qǐng)求方式的動(dòng)詞來(lái)表示對(duì)資源的操作
    2022-06-06
  • 詳解SpringBoot和Mybatis配置多數(shù)據(jù)源

    詳解SpringBoot和Mybatis配置多數(shù)據(jù)源

    本篇文章主要介紹了詳解SpringBoot和Mybatis配置多數(shù)據(jù)源,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-05-05
  • MyBatis框架之mybatis逆向工程自動(dòng)生成代碼

    MyBatis框架之mybatis逆向工程自動(dòng)生成代碼

    Mybatis屬于半自動(dòng)ORM,在使用這個(gè)框架中,工作量最大的就是書寫Mapping的映射文件,由于手動(dòng)書寫很容易出錯(cuò),我們可以利用Mybatis-Generator來(lái)幫我們自動(dòng)生成文件。本文主要給大家介紹mybatis逆向工程自動(dòng)生成代碼,感興趣的朋友一起學(xué)習(xí)吧
    2016-04-04
  • 微信企業(yè)號(hào) 根據(jù)錯(cuò)誤碼返回錯(cuò)誤信息類封裝

    微信企業(yè)號(hào) 根據(jù)錯(cuò)誤碼返回錯(cuò)誤信息類封裝

    這篇文章主要介紹了微信企業(yè)號(hào) 根據(jù)錯(cuò)誤碼返回錯(cuò)誤信息類封裝的相關(guān)資料,需要的朋友可以參考下
    2016-10-10
  • java實(shí)現(xiàn)簡(jiǎn)單銀行家算法

    java實(shí)現(xiàn)簡(jiǎn)單銀行家算法

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡(jiǎn)單銀行家算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-12-12

最新評(píng)論