1. 程式人生 > >JAVA入門[20]-Hibernate簡單示例

JAVA入門[20]-Hibernate簡單示例

roo mysql play ger 4.3 path arc result 建數據庫

一、Hibernate簡介

在很多場景下,我們不需要使用JdbcTemplate直接操作SQL語句,這時候可以用ORM工具來節省數大量的的代碼和開發時間。ORM工具能夠把註意力從容易出錯的SQL代碼轉向如何實現應用程序的真正需求。

Spring對ORM框架的支持提供了與這些框架的集成點以及一些附加的服務:

  • 支持集成Spring聲明式事務;
  • 透明的異常處理;
  • 線程安全的、輕量級的模板類;
  • DAO支持類;
  • 資源管理。

Hibernate是在開發者社區很流行的開源ORM框架。

二、Spring+Hibernate實例

1.創建數據庫表

mysql新建數據庫store,然後執行如下sql:

技術分享
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。完成後的代碼結構為:

技術分享

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

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

如果方法要支持事務,[email protected]

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);
    }
}

  

源碼地址:https://github.com/cathychen00/learnjava/tree/master/DemoHibernate

JAVA入門[20]-Hibernate簡單示例