一、Hibernate简介
在很多场景下,我们不需要使用JdbcTemplate直接操作SQL语句,这时候可以用ORM工具来节省数大量的的代码和开发时间。ORM工具能够把注意力从容易出错的SQL代码转向如何实现应用程序的真正需求。
Spring对ORM框架的支持提供了与这些框架的集成点以及一些附加的服务:
- 支持集成Spring声明式事务;
- 透明的异常处理;
- 线程安全的、轻量级的模板类;
- DAO支持类;
- 资源管理。
Hibernate是在开发者社区很流行的开源ORM框架。
二、Spring+Hibernate实例
1.创建数据库表
mysql新建数据库store,然后执行如下sql:
2.代码结构
我用的IDE是IdeaIU,通过maven构建项目,通过xml配置spring。完成后的代码结构为:
3.创建实体类Category
1
2
3
4
5
6
7
8
9
10
11
|
class
Category{
private
int
cateId;
private
String cateName;
//次数省略get,set方法<br>
@Override
public
String toString() {
return
"id="
+cateId+
" name="
+cateName;
}
}
|
4.修改pom.xml,引入相关依赖。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>
4.12
</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>
4.3
.
5
.Final</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>
5.1
.
30
</version>
</dependency>
</dependencies>
|
5.配置applicationContext.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
<?xml version=
"1.0"
encoding=
"UTF-8"
?>
<beans xmlns:xsi=
"http://www.w3.org/2001/XMLSchema-instance"
xmlns=
"http://www.springframework.org/schema/beans"
xmlns:tx=
"http://www.springframework.org/schema/tx"
xsi:schemaLocation=
"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"
>
<bean id=
"dataSource"
class
=
"org.springframework.jdbc.datasource.DriverManagerDataSource"
>
<property name=
"driverClassName"
value=
"com.mysql.jdbc.Driver"
></property>
<property name=
"url"
value=
"jdbc:mysql://localhost:3306/store"
></property>
<property name=
"username"
value=
"root"
></property>
<property name=
"password"
value=
"root"
></property>
</bean>
<bean id=
"sessionFactory"
class
=
"org.springframework.orm.hibernate4.LocalSessionFactoryBean"
>
<property name=
"dataSource"
ref=
"dataSource"
/>
<property name=
"configLocation"
value=
"classpath:hibernate/hibernate.cfg.xml"
/>
</bean>
<tx:annotation-driven/>
<bean id=
"transactionManager"
class
=
"org.springframework.orm.hibernate4.HibernateTransactionManager"
>
<property name=
"sessionFactory"
ref=
"sessionFactory"
/>
</bean>
<bean id=
"categoryDao"
class
=
"CategoryDao"
>
<constructor-arg ref=
"sessionFactory"
></constructor-arg>
</bean>
</beans>
|
dataSource没什么特别的,就不在解释了。看下其他几点:
①hibernate sessionFactory:
使用Hibernate所需的主要接口是org.hibernate.Session,Session接口提供了CRUD等最基本的数据访问功能。通过Hibernate的Session接口,应用程序的Repository能够满足所有的持久化需求。而获取Hibernate Session对象的标准方式是借助于Hibernate SessionFactory接口的实现类。
在sessionFactory配置主要设置了两个属性:dataSource设置了数据连接,configLocation设置了hibernate配置文件的路径。
②事务
要是数据库操作支持事务,需要配置<tx:annotation-driven/>和transactionManager。
6.hibernate配置
①hibernate.cfg.xml
1
2
3
4
5
6
7
8
9
10
11
|
<?xml version=
'1.0'
encoding=
'utf-8'
?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"
>
<hibernate-configuration>
<session-factory>
<property name=
"dialect"
>org.hibernate.dialect.MySQLDialect</property>
<property name=
"show_sql"
>
true
</property>
<mapping resource=
"hibernate/Category.hbm.xml"
/>
</session-factory>
</hibernate-configuration>
|
②Category.hbm.xml
1
2
3
4
5
6
7
8
9
10
11
12
|
<?xml version=
"1.0"
encoding=
"UTF-8"
?>
<!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=
"Category"
table=
"Category"
>
<id name=
"cateId"
column=
"id"
>
<generator
class
=
"native"
/>
</id>
<property name=
"cateName"
column=
"name"
/>
</
class
>
</hibernate-mapping>
|
7.数据访问实现类CategoryDao
如果方法要支持事务,需要加注解@Transactional。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
public
class
CategoryDao {
private
SessionFactory sessionFactory;
public
CategoryDao(SessionFactory sessionFactory) {
this
.sessionFactory = sessionFactory;
}
private
Session currentSession() {
return
sessionFactory.getCurrentSession();
}
@Transactional
public
void
save(Category category) {
currentSession().save(category);
}
@Transactional
public
void
update(Category category){
currentSession().update(category);
}
@Transactional
public
void
delete(
int
id) {
Query query = currentSession().createSQLQuery(
"DELETE FROM category WHERE Id=::ID"
);
query.setInteger(
"::ID"
, id);
query.executeUpdate();
}
@Transactional
public
int
count() {
return
getAll().size();
}
@Transactional
public
Category getById(
int
id) {
Criteria criteria=currentSession().createCriteria(Category.
class
);
criteria.add(Restrictions.eq(
"id"
,id));
return
(Category) criteria.uniqueResult();
}
@Transactional
public
List<Category> getAll() {
return
currentSession().createCriteria(Category.
class
).list();
}
}
|
8.测试
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
@ContextConfiguration
(locations =
"classpath:applicationContext.xml"
)
@RunWith
(SpringJUnit4ClassRunner.
class
)
public
class
testCategoryDao {
@Autowired
private
CategoryDao categoryDao;
@Test
public
void
testAdd() {
Category category =
new
Category();
category.setCateId(
4
);
category.setCateName(
"母婴"
);
categoryDao.save(category);
}
@Test
public
void
testUpdate() {
Category category =
new
Category();
category.setCateId(
4
);
category.setCateName(
"男装"
);
categoryDao.update(category);
}
@Test
public
void
testGetById() {
int
id =
4
;
Category category = categoryDao.getById(id);
if
(category==
null
){
System.out.println(
"not exist"
);
}
else
{
System.out.println(category.toString());
}
}
@Test
public
void
testGetAll() {
List<Category> categories = categoryDao.getAll();
for
(Category item : categories) {
System.out.println(item);
}
}
@Test
public
void
testCount() {
int
count = categoryDao.count();
System.out.println(count);
}
@Test
public
void
testDelete() {
int
id =
4
;
categoryDao.delete(id);
}
}
|
源码地址:https://github.com/cathychen00/learnjava/tree/master/DemoHibernate