SpringBoot整合Hibernate
编写配置文件
1 <!--配置读取properties文件-->
2 <context:property-placeholder location="classpath:jdbc.properties"/>
3 <!--配置c3p0数据库连接池-->
4 <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
5 <property name="jdbcUrl" value="${jdbc.url}" />
6 <property name="driverClass" value="${jdbc.driver.class}" />
7 <property name="user" value="${jdbc.username}" />
8 <property name="password" value="${jdbc.password}" />
9 </bean>
10 <!--配置Hibernate的SessionFactory-->
11 <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
12 <property name="dataSource" ref="dataSource" />
13 <!--hibernateProperties属性:显示sql语句,开启正向工程等等-->
14 <property name="hibernateProperties">
15 <props>
16 <!--显示当前执行的sql语句-->
17 <prop key="hibernate.show_sql">true</prop>
18 <!--开启正向工程-->
19 <prop key="hibernate.hbm2ddl.auto">update</prop>
20 </props>
21 </property>
22 <!--扫面实体所在的包-->
23 <property name="packageToScan">
24 <list>
25 <value>io.guangsoft.pojo</value>
26 </list>
27 </property>
28 </bean>
29 <!--配置hibernate事物管理器-->
30 <bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
31 <property name="sessionFactory" ref="sessionFactory" />
32 </bean>
33 <!--配置开启注解事物处理-->
34 <tx:annotation-driven transaction-manager="transactionManager" />
35 <!--配置springIOC的注解扫描-->
36 <context:component-scan base-package="io.guangsoft" />
37 <!--配置HibernateTemplate对象-->
38 <bean id="hibernateTemplate" class="org.springframework.orm.hibernate5.HibernateTemplate">
39 <property name="sessionFactory" ref="sessionFactory" />
40 </bean>
编写实体类
1 @Entity
2 @Table(name="t_user")
3 public class User implements Serializable {
4 @Id
5 @GeneratedValue(strategy=GenerationType.IDENTITY)
6 @Column(name="id")
7 private Integer id;
8 @Column(name="username")
9 private String username;
10 //...set、get方法
11 }
dao层编写
1 @Repository
2 public class UserDaoImpl implements UserDao {
3 @Autowired
4 private HibernateTemplate hibernateTemplate;
5 @Override
6 public void insertUser(User user) {
7 this.hibernateTemplate.save(user);
8 }
9 @Override
10 public void updateUser(User user) {
11 this.hibernateTemplate.update(user);
12 }
13 @Override
14 public void deleteUser(User user) {
15 this.hibernateTemplate.delect(user);
16 }
17 @Override
18 public User selectUserById(Integer id) {
19 return this.hibernateTemplate.get(User.class, id);
20 }
21 }
测试代码
1 @RunWith(SpringJUnit4ClassRunner.class)
2 @ContextConfiguration("classpath:applicationContext.xml")
3 public class UserDaoImplTest {
4 @Autowired
5 private UserDao userDao;
6 @Test
7 @Transactional//测试类对事物提交方式默认是回滚
8 @Rollback(false)//取消自动回滚
9 public void testInsertUser() {
10 User user = new User();
11 user.setUsername("呵呵");
12 this.userDao.insertUser(user);
13 }
14 @Test
15 @Transactional
16 @Rollback
17 public void testUpdateUser() {
18 //...
19 }
20 }
使用HQL,Hibernate Query Language,HQL的语法就是将原来sql语句中的字段名称换成对象与属性的名称。
1 @Override
2 public List<User> selectUserByName(String username) {
3 //getCurrentSession:当前session必须要有事物边界,且只能处理唯一的一个事务,当事务提交或者回滚后session自动失效
4 //openSession:每次都会打开一个新的session,加入每次使用多次,则获得的是不同session对象,使用完毕后我们需要手动调用close方法关闭session。
5 Session session = this.hibernateTemplate.getSessionFactory().getCurrentSession();
6 Query queryTemp = session.createQuery("from User where username = :uname");
7 Query query = queryTemp.setString("uname", username);
8 return queryTemp.list();
9 }
QBC查询:query by criteria
1 public List<User> selectUserByNameUseCriteria(String username) {
2 Session session = this.hibernateTeamplate.getSessionFactory().getCurrentSession();
3 Criteria criteria = session.createCriteria(User.class);
4 criteria.add(Restrictions.eq("username", username));
5 return criteria.list();
6 }