首先导入Spring-hibernate相应的jar包
然后准备数据库连接的文件hibernate.properties还有jdbc.properties
hibernate.properties文件:进行hibernate方言和自动建表的配置
hibernate.dialect=org.hibernate.dialect.H2Dialect
hibernate.hbm2ddl.auto=create
jdbc.properties文件: 尽心hibernate连接数据库的配置
jdbc.driverClassName=org.h2.Driver
jdbc.url=jdbc:h2:tcp://localhost/D:/H2/h2/bin
jdbc.username=sa
jdbc.password=123456
创建实体类Customer映射到表中
package cn.qblank.entity;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity // 实体类将映射到数据表,不指定表名即为类名
//@Table
public class Customer {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String address;
private boolean vip;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public boolean isVip() {
return vip;
}
public void setVip(boolean vip) {
this.vip = vip;
}
@Override
public String toString() {
return "Customer [id=" + id + ", name=" + name + ", address=" + address + ", vip=" + vip + "]";
}
}
在dao层写一个CustomerDao接口
package cn.qblank.dao;
import cn.qblank.entity.Customer;
public interface CustomerDao {
void create(Customer customer);
void update(Customer customer);
Customer find(Long id);
void delete(Long id);
}
实现类CustomerDao实现接口,并实现其所有方法
package cn.qblank.dao.impl;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import cn.qblank.dao.CustomerDao;
import cn.qblank.entity.Customer;
@Repository
@Transactional
public class CustomerDaoImpl implements CustomerDao {
@Autowired
private SessionFactory sessionFactory;
@Override
public void create(Customer customer) {
System.out.println("create...");
Session session = sessionFactory.openSession();
// 增删改查
session.save(customer);
}
@Override
public void update(Customer customer) {
System.out.println("update...");
Session session = sessionFactory.openSession();
try {
session.getTransaction().begin();
// 增删改查
session.update(customer);
session.getTransaction().commit();
} catch (Exception ex) {
session.getTransaction().rollback();
} finally {
session.close();
}
}
@Override
public Customer find(Long id) {
return sessionFactory.getCurrentSession().get(Customer.class, id);
}
@Override
public void delete(Long id) {
System.out.println("删除");
Session session = sessionFactory.getCurrentSession();
Customer customer = new Customer();
customer.setId(id);
session.delete(customer);
}
}
创建Config类
package cn.qblank.test;
import javax.sql.DataSource;
import org.hibernate.SessionFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.orm.hibernate5.HibernateTransactionManager;
import org.springframework.orm.hibernate5.LocalSessionFactoryBean;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@Configuration //配置文件
@ComponentScan("cn.qblank.dao") //扫描dao层
@PropertySource("classpath:jdbc.properties") //引入外部属性文件到Enviroment
@EnableTransactionManagement
public class Config {
@Bean
public LocalSessionFactoryBean sessionFactory(DataSource dataSource) {
LocalSessionFactoryBean factoryBean = new LocalSessionFactoryBean();
factoryBean.setDataSource(dataSource);
factoryBean.setPackagesToScan("cn.qblank.entity"); // 自动扫描并注册实体类
return factoryBean;
}
@Bean // 依赖Environment
public DataSource dataSource(Environment env) {
DriverManagerDataSource ds = new DriverManagerDataSource();
// env.getProperty("someKey") 获得属性值
ds.setDriverClassName(env.getProperty("jdbc.driverClassName"));
ds.setUrl(env.getProperty("jdbc.url"));
ds.setUsername(env.getProperty("jdbc.username"));
ds.setPassword(env.getProperty("jdbc.password"));
return ds;
}
//创建事务管理类
@Bean
public PlatformTransactionManager transactionManager(SessionFactory sessionFactory){
HibernateTransactionManager transactionManager=new HibernateTransactionManager();
transactionManager.setSessionFactory(sessionFactory);
return transactionManager;
}
}
最后进行测试
package cn.qblank.test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import cn.qblank.dao.CustomerDao;
import cn.qblank.entity.Customer;
public class Main {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Config.class);
CustomerDao customerDao = context.getBean(CustomerDao.class);
Customer customer = new Customer();
customer.setName("赵六");
customer.setAddress("湖南长沙");
customer.setVip(true);
customerDao.create(customer);
// Customer customer = customerDao.find(1L);
// System.out.println(customer);
// customerDao.delete(3l);
context.close();
}
}
运行结果:
下面我们在dao层添加一个异常:
@Override
public void create(Customer customer){
System.out.println("create...");
Session session = sessionFactory.getCurrentSession();
// 增删改查
session.save(customer);
throw new RuntimeException("我叫异常");
}
然后测试:
package cn.qblank.test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import cn.qblank.dao.CustomerDao;
import cn.qblank.entity.Customer;
public class Main {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Config.class);
CustomerDao customerDao = context.getBean(CustomerDao.class);
Customer customer = new Customer();
customer.setName("麻雀");
customer.setAddress("湖南长沙");
customer.setVip(true);
customerDao.create(customer);
// Customer customer = customerDao.find(1L);
// System.out.println(customer);
// customerDao.delete(3l);
context.close();
}
}
可以看到出现错误,事务也成功回滚了