本文共 6297 字,大约阅读时间需要 20 分钟。
首先导入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 // 实体类将映射到数据表,不指定表名即为类名//@Tablepublic 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@Transactionalpublic 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@EnableTransactionManagementpublic 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层添加一个异常:
@Overridepublic 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(); }}
可以看到出现错误,事务也成功回滚了