Fork me on GitHub
文章目录
  1. 1. 添加相应的架包
  2. 2. 配置Hibernate相关的XML配置文件
    1. 2.1. 配置database.properties
    2. 2.2. 配置Hibernate-config.xml
  3. 3. 修改实体类
  4. 4. 修改Dao文件
  5. 5. 修改Dao的测试文件
  6. 6. 与原生JDBC比较

最近学习了Hibernate,并将Hibernate集成到Spring MVC之中,并替换原有的JDBC,遇到了很多问题,在此记录一下。

添加相应的架包

我的项目是采用Gradle进行管理的,具体架包主要应包括:

  1. org.springframework:spring-orm:4.0.6.RELEASE   #主要包含LocalSessionFactoryBean,用于产生sessionFactory
  2. org.springframework:spring-test:4.0.0.RELEASE   #主要在测试中能配置ContextConfiguration的入口文件
  3. org.hibernate:hibernate-core:4.3.6.Final   #主要包含了Hibernate核心类库
  4. org.hibernate:hibernate-annotations:3.5.6-Final   #主要包含了Hibernate注解类库
  5. org.hibernate:hibernate-c3p0:4.3.6.Final   #主要包含数据库连接池的类库
  6. org.slf4j:slf4j-api:1.7.5   #主要打印输出日志服务,我当时以为没用,没添加它,就一直报slf4j的架包错误

配置Hibernate相关的XML配置文件

配置database.properties

这里主要配置数据库连接池的参数,其中数据库我配有两个,一个用于开发,一个用于测试的。具体配置如下:

1
2
3
4
5
6
7
8
9
10
hibernate.dialect=org.hibernate.dialect.MySQLDialect
driverClassName=com.mysql.jdbc.Driver
validationQuery=SELECT 1
url=jdbc:mysql://127.0.0.1:3306/bookshelf?useUnicode=true&characterEncoding=UTF-8
url_test=jdbc:mysql://127.0.0.1:3306/bookshelf_test?useUnicode=true&characterEncoding=UTF-8
username=root
password=
hibernate.hbm2ddl.auto=update
hibernate.show_sql=true
hibernate.format_sql=true

其中hibernate.hbm2ddl.auto=update配置,如果代码Object属性,类型和长度等有更新,执行过程中,数据库会对应自动更新,这样就不用再去更改对应数据表了。

配置Hibernate-config.xml

主要配置dataSource、sessionFactory、txManager,还有自动扫描、注解配置等。

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
<context:component-scan base-package="com.thoughtworks.bookshelf"/>
<context:annotation-config/>
<context:property-placeholder location="classpath:database.properties"/>
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
<property name="driverClass" value="${driverClassName}"></property>
<property name="jdbcUrl" value="${url_test}"></property>
<property name="user" value="${username}"></property>
<property name="password" value="${password}"></property>
<property name="maxPoolSize" value="40"></property>
<property name="minPoolSize" value="1"></property>
<property name="initialPoolSize" value="1"></property>
<property name="maxIdleTime" value="20"></property>
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="hibernateProperties">
<props>
<prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
<prop key="hibernate.format_sql">${hibernate.format_sql}</prop>
</props>
</property>
<!-- 注解方式配置 -->
<property name="packagesToScan">
<list>
<value>com.thoughtworks.bookshelf.model</value>
</list>
</property>
</bean>
<bean name="txManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<tx:annotation-driven transaction-manager="txManager"/>

其中注意

  1. <context:component-scan base-package="com.thoughtworks.bookshelf"/> <context:annotation-config/>不可缺少,这个是扫描注解的。
  2. <property name="packagesToScan"></property>中间应是包名,我当时写成了com.thoughtworks.bookshelf.model.*就报找不到对应实体的错误。
  3. 该配置文件,对于Web app应该是在配置Spring MVC的配置文件中导入,否则会找不到Bean,无法加载sessionFactory,dataSource等,具体如<import resource="hibernate-config.xml"></import>,等类似的代码; 如果是Junit测试,应该在测试文件上头配置@ContextConfiguration(locations = {"classpath:hibernate-test.xml"}), 具体参见第五部分。因此最好这个配置文件一式两份,一个配置的是开发的数据库,和Spring MVC配置文件在一起,另一个配置测试数据库,放在Source目录下。

修改实体类

这里主要有@Entity @Table @Id @GeneratedValue @Column等注解。其中Obeject上的注解@Table是与数据库中的某表对应的,默认名字相同,如果不同则要在注明,如@Table(name = "book"); 属性上的注解@Column是于表中的字段对应,同理,如果名字不同则要@Column(name = "title", length = 200); @Id是指主键; @GeneratedValue是指该字段自动增长。

部分代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Entity
@Table(name = "book")
public class Book {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column(name = "title", length = 200)
private String title;
@Column(name = "author", length = 100)
private String author;
#getter or setter方法……
}

修改Dao文件

部分代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Component
@Transactional   *#Spring事务管理,不必手动打开session,关闭session*
public class BookDao {
@Autowired   *#自动加载sessionFactory bean,不必手动实例化*
private SessionFactory sessionFactory;
private Session session;
public List<Book> findAllBooks(){
session = sessionFactory.getCurrentSession();
List<Book> books = new ArrayList<Book>();
books = session.createCriteria(Book.class).list();
return books;
}
public Book findBookById(int id){
session = sessionFactory.getCurrentSession();
return (Book) session.get(Book.class, id);
}
}

修改Dao的测试文件

Junit测试需要配置Hibernate配置文件入口

1
2
3
4
5
6
7
8
9
10
11
12
13
@RunWith(SpringJUnit4ClassRunner.class)   *#用RunWith注解改变JUnit的默认执行类*
@ContextConfiguration(locations = {"classpath:hibernate-test.xml"})   *#配置在source下的Hibernate测试配置文件*
public class BookDaoTest {
@Autowired
private BookDao bookDao;
@Test
public void shouldFindAllBooks() throws Exception {
List<Book> books = new ArrayList<Book>();
books = (List<Book>) bookDao.findAllBooks();
assertNotNull(books);
}
}

与原生JDBC比较

这里还没有涉及到复杂的表之间的关联,和自己写HQL语句,只是Hibernate入门和基本配置。

目前最直观的体现如下:

  1. Hibernate封装了基本的CRUD的方法,开发效率大大提高。
  2. Hibernate提供数据库事务管理,因此我们不必对手动关闭和释放数据库连接资源。
文章目录
  1. 1. 添加相应的架包
  2. 2. 配置Hibernate相关的XML配置文件
    1. 2.1. 配置database.properties
    2. 2.2. 配置Hibernate-config.xml
  3. 3. 修改实体类
  4. 4. 修改Dao文件
  5. 5. 修改Dao的测试文件
  6. 6. 与原生JDBC比较