一、Hibernate简介

在很多场景下,我们不需要使用JdbcTemplate直接操作SQL语句,这时候可以用ORM工具来节省数大量的的代码和开发时间。ORM工具能够把注意力从容易出错的SQL代码转向如何实现应用程序的真正需求。

Spring对ORM框架的支持提供了与这些框架的集成点以及一些附加的服务:

  • 支持集成Spring声明式事务;

  • 透明的异常处理;

  • 线程安全的、轻量级的模板类;

  • DAO支持类;

  • 资源管理。

Hibernate是在开发者社区很流行的开源ORM框架。

二、Spring+Hibernate实例

1.创建数据库表

mysql新建数据库store,然后执行如下sql:

Hibernate简介与实例介绍-LMLPHPHibernate简介与实例介绍-LMLPHP
1 create table Category (2 Id int not null,3 Name varchar(80) null,4 constraint pk_category primary key (Id)5 );6 7 INSERT INTO category(id,Name) VALUES (1,'女装');8 INSERT INTO category(id,Name) VALUES (2,'美妆');9 INSERT INTO category(id,Name) VALUES (3,'书籍');
登录后复制
db_store.sql

2.代码结构

我用的IDE是IdeaIU,通过maven构建项目,通过xml配置spring。完成后的代码结构为:

Hibernate简介与实例介绍-LMLPHP

3.创建实体类Category

class Category{
    private int cateId;

    private String cateName;

    //次数省略get,set方法
@Override
    public String toString() {
        return "id="+cateId+" name="+cateName;
    }
}
登录后复制

  

4.修改pom.xml,引入相关依赖。

<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

<?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/tx ">


    <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

<?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

<?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。

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.测试

@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);
    }
}
登录后复制

以上就是Hibernate简介与实例介绍的详细内容,更多请关注Work网其它相关文章!

09-08 11:18