Spring整合Hibernate
1.导入Spring与Hibernate还有mysql数据库驱动的jar包。
2.编写db.properties文件如下,连接数据库要用到。
//数据库用户名
jdbc.user=root
//数据库密码
jdbc.password=123456
//数据库驱动
jdbc.driverClass=com.mysql.jdbc.Driver
//建立数据库连接
jdbc.jdbcUrl=jdbc:mysql://localhost:3306/spring
//默认数据库连接池大小
jdbc.initPoolSize=5
//连接池最大数量
jdbc.maxPoolSize=10
3.新建Hibernate配置文件hibernate.cfg.xml
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
//指定数据库使用的SQL方言
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
//控制台输出的SQL格式化
<property name="hibernate.format_sql">true</property>
/*
none:在Hibernate启动时,不会执行任何操作。
update:实体对应的表不存在则建立,如果实体中新增加了字段,会在相应的表中增加字段。
creat-only:在Hibernate启动时,对实体仅会执行建表语句,即使实体对应的实体表已经存在了,也会建立新的数据表。
drop:在Hibernate启动时,实体对应的表会执行删除语句,即使实体不存在对应的表,也会执行删除语句。
creat:在Hibernate启动时,对实体对应的表执行删除语句,然后再执行建表语句。
creat-drop:再Hibernate启动时实体对应的表执行删除语句,然后执行建表语句,再Hibernate关闭时实体对应的执行删除语句。
validate:对实体和对应的表进行校验。
*/
<property name="hbm2ddl.auto">update</property>
//true表示在控制台输出SQL语句
<property name="hibernate.show_sql">true</property>
</session-factory>
</hibernate-configuration>
4.建立Spring配置文件applicationContext.xml文件
//bean自动装配,自动扫描spring.hibernate包的基于注解的bean配置
<context:component-scan base-package="spring.hibernate"></context:component-scan>
//Spring加载外部文件,这里加载刚刚配置的数据库db.properties文件
<context:property-placeholder location="classpath:db.properties"></context:property-placeholder>
//使用c3p0连接数据库
<bean name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="user" value="${jdbc.user}"></property>
<property name="password" value="${jdbc.password}"></property>
<property name="driverClass" value="${jdbc.driverClass}"></property>
<property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
<property name="initialPoolSize" value="${jdbc.initPoolSize}"></property>
<property name="maxPoolSize" value="${jdbc.maxPoolSize}"></property>
</bean>
<!--配置hibernate在spring中SeesionFactory对象-->
<bean name="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="configLocation" value="classpath:hibernate.cfg.xml"></property>
//加载spring/hibernate/entities包下所有配置hbm.xml的实体类
<property name="mappingLocations" value="classpath:spring/hibernate/entities/*.hbm.xml"></property>
</bean>
<!--配置Spring的声明式事务-->
<!-- 1.配置事务管理器-->
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<!-- 2.配置事务属性-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="get*" read-only="true"/>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
<!-- 3.配置切点,并把事务联系起来-->
<aop:config>
<aop:pointcut id="txPointcut" expression="execution(* spring.hibernate.service.*.*(..))"></aop:pointcut>
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"></aop:advisor>
</aop:config>
5.测试
1).新建Book实体类
package spring.hibernate.entities;
public class Book {
private Integer id;
private String bookName;
private String isbn;
private int price;
private int stock;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public String getIsbn() {
return isbn;
}
public void setIsbn(String isbn) {
this.isbn = isbn;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public int getStock() {
return stock;
}
public void setStock(int stock) {
this.stock = stock;
}
@Override
public String toString() {
return "Book{" +
"id=" + id +
", bookName='" + bookName + '\'' +
", isbn='" + isbn + '\'' +
", price=" + price +
", stock=" + stock +
'}';
}
}
2).创建Book实体类的hbm.xml文件
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="spring.hibernate.entities.Account" table="SH_ACCOUNT">
<id name="id" type="java.lang.Integer">
<column name="ID"></column>
<generator class="native"></generator>
</id>
<property name="username" type="java.lang.String">
<column name="USER_NAME"></column>
</property>
<property name="balance" type="java.lang.Integer">
<column name="BALANCE"></column>
</property>
</class>
</hibernate-mapping>
3).创建BookShopService接口
package spring.hibernate.service;
public interface BookShopService {
public void purchase(String username,String isbn);
}
4).创建BookShopService接口实现类BookShopServiceImpl
package spring.hibernate.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import spring.hibernate.dao.BookShopDao;
@Service
public class BookShopServiceImpl implements BookShopService {
@Autowired
private BookShopDao bookShopDao;
@Override
public void purchase(String username, String isbn) {
int price = bookShopDao.findBookPriceByIsbn(isbn);
bookShopDao.updateBookStock(isbn);
bookShopDao.updateAccountBalance(username,price);
}
}
5).创建测试类
package spring.hibernate.test;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import spring.hibernate.entities.Book;
import javax.sql.DataSource;
public class SpringHibernaate {
public static void main(String[] args){
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
DataSource dataSource = (DataSource) ctx.getBean("dataSource");
Book book = new Book();
book.setBookName("java");
book.setIsbn("1001");
book.setPrice(100);
book.setStock(10);
SessionFactory sessionFactory = (SessionFactory) ctx.getBean("sessionFactory");
Session session = sessionFactory.openSession();
session.save(book);
}
}
运行结果:
整合完成。