首先我们来看单纯的使用Hibernate时管理数据源:
在类路径下创建一个hibernate.cfg.xml
写入数据源的信息:
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">toor</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql:///test_hibernate_spring</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<property name="hbm2ddl.auto">update</property>
<!-- C3P0 连接池的配置 -->
<property name="connection.provider_class">
org.hibernate.connection.C3P0ConnectionProvider
</property>
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.max_size">10</property>
<property name="hibernate.c3p0.max_statements">50</property>
<property name="hibernate.c3p0.timeout">3600</property>
<property name="hibernate.c3p0.idle_test_period">120</property>
<property name="hibernate.c3p0.acquire_increment">2</property>
<!--c3p0配置结束 -->
<!-- session要从当前线程中产生-->
<property name="current_session_context_class">thread</property>
<mapping resource="domain/Person.hbm.xml" />
</session-factory>
</hibernate-configuration>
如上是hibernate的最简单的数据源配置。此处不进行过多解释。
hibernate的简单使用:
Configuration configuration = new Configuration().configure();
SessionFactory sessionFactory = configuration.buildSessionFactory();
sessionFactory = configuration.buildSessionFactory();
//从当前线程中(ThreadLocal)中,把session提取出来如果没有就使用openSession()
Session session = sessionFactory.getCurrentSession();
//hibernate的所以操作都必须在事务中
Transaction transaction = session.beginTransaction();
Person p = new Person();
p.setName("111111111111111");
p.setDescription("2222222222222");
session.save(p);
transaction.commit();
如上就是hibernate的简单使用过程。现在我们来看Spring与和hibernate的整合:
spring与hibernate的整合目的就是为了让 IOC 容器来管理 Hibernate 的核心接口SessionFactory以及让 Hibernate 使用上 Spring 的声明式事务来进行事务操作.
但在Spring整合Hibernate时。处理数据源有两种方法:
1)依然使用Hibernate的hibernate.cfg.xml来写数据源信息,在spring配置文件中使用DI把这个文件注入给SessionFactory接口
2)摒弃掉hibernate.cfg.xml,而将所有的数据源配置信息写在spring的配置文件中.下面详细介绍这两种方法:
方法一:
hibernate的配置文件hibernate.cfg.xml保持如上信息不变并把hibernate.cfg.xml文件注入给spring提供的LocalSessionFactoryBean:
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<!-- 导入hibernate配置文件-->
<property name="configLocation">
<value>classpath:hibernate.cfg.xml</value>
</property>
</bean>
spring中使用hibernate则不需要直接通过hinernate来完成,而是通过spring提供的HibernateTemplate类来完成
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>
spring来管理事务:
<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>
<!-- 事务的注解解析器 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
在代码中使用:
操作将由hibernateTemplate来完成
@Resource(name="hibernateTemplate")
private HibernateTemplate hibernateTemplate;
@Transactional
public void savePerson(){
Person person = new Person();
person.setUsername("666");
person.setPassword("6666");
hibernateTemplate.save(person);
}
方法二:
不需要hibernate.cfg.xml来完成Spring与hibernate的整合:
此时给类LocalSessionFactoryBean注入的不是configLocation这个文件而是一个dateSource除此之外还注入数据库的方言,hbm.xml文件等信息。至于其他的如hibernateTemplate的注入,配置事务管理器,事务的注解解析器 等于上述一摸一样:
代码详情:
<!--导入c3p0的信息在次xml文件中就可以使用导入文件的信息-->
<context:property-placeholder location="classpath:c3p0DB.properties"/>
<!-- 配置 C3P0 数据源 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="user" value="${jdbc.user}"></property>
<property name="password" value="${jdbc.password}"></property>
<property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
<property name="driverClass" value="${jdbc.driverClass}"></property>
<property name="initialPoolSize" value="${jdbc.initPoolSize}"></property>
<property name="maxPoolSize" value="${jdbc.maxPoolSize}"></property>
</bean>
<!--注入datasource给sessionFactory以及数据库的方言和hbm.xml-->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<!-- 导入映射文件所在的路径 -->
<property name="mappingDirectoryLocations">
<list>
<value>classpath:domain <!--加载这个路径下的所有.hbm.xml-->
</value>
</list>
</property>
<!-- Hibernate其他配置 方言 等-->
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
<prop key="hbm2ddl.auto">update</prop>
</props>
</property>
</bean>
我们看到上述代码中在导入c3p0连接池信息的时候我们使用了:
<context:property-placeholder location="classpath:c3p0DB.properties"/>
除了这种方法还有:
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<value>classpath:c3p0DB.properties</value>
</property>
</bean>
这两种方法都可以完成把外部properties数据导入进来.然后通过${key}来访问此properties文件中的值。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/36016.html