在很多場景下,我們不需要使用JdbcTemplate直接操作SQL語句,這時候可以用ORM工具來節省數大量的的代碼和開發時間。ORM工具能夠把注意力從容易出錯的SQL代碼轉向如何實作應用程式的真正需求。
Spring對ORM架構的支援提供了與這些架構的內建點以及一些附加的服務:
支援內建Spring聲明式事務;
透明的異常處理;
線程安全的、輕量級的模闆類;
DAO支援類;
資源管理。
Hibernate是在開發者社群很流行的開源ORM架構。
mysql建立資料庫store,然後執行如下sql:
db_store.sql
我用的IDE是IdeaIU,通過maven建構項目,通過xml配置spring。完成後的代碼結構為:

<code>class</code> <code>Category{</code>
<code> </code><code>private</code> <code>int</code> <code>cateId;</code>
<code> </code><code>private</code> <code>String cateName;</code>
<code> </code><code>//次數省略get,set方法<br></code>
<code> </code><code>@Override</code>
<code> </code><code>public</code> <code>String toString() {</code>
<code> </code><code>return</code> <code>"id="</code><code>+cateId+</code><code>" name="</code><code>+cateName;</code>
<code> </code><code>}</code>
<code>}</code>
<code><dependencies></code>
<code> </code><code><dependency></code>
<code> </code><code><groupId>junit</groupId></code>
<code> </code><code><artifactId>junit</artifactId></code>
<code> </code><code><version></code><code>4.12</code><code></version></code>
<code> </code><code></dependency></code>
<code> </code><code><groupId>org.hibernate</groupId></code>
<code> </code><code><artifactId>hibernate-core</artifactId></code>
<code> </code><code><version></code><code>4.3</code><code>.</code><code>5</code><code>.Final</version></code>
<code> </code><code><groupId>mysql</groupId></code>
<code> </code><code><artifactId>mysql-connector-java</artifactId></code>
<code> </code><code><version></code><code>5.1</code><code>.</code><code>30</code><code></version></code>
<code> </code><code></dependencies></code>
<code><?xml version=</code><code>"1.0"</code> <code>encoding=</code><code>"UTF-8"</code><code>?></code>
<code><beans xmlns:xsi=</code><code>"http://www.w3.org/2001/XMLSchema-instance"</code>
<code> </code><code>xmlns=</code><code>"http://www.springframework.org/schema/beans"</code> <code>xmlns:tx=</code><code>"http://www.springframework.org/schema/tx"</code>
<code> </code><code>xsi:schemaLocation=</code><code>"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"</code><code>></code>
<code> </code><code><bean id=</code><code>"dataSource"</code> <code>class</code><code>=</code><code>"org.springframework.jdbc.datasource.DriverManagerDataSource"</code><code>></code>
<code> </code><code><property name=</code><code>"driverClassName"</code> <code>value=</code><code>"com.mysql.jdbc.Driver"</code><code>></property></code>
<code> </code><code><property name=</code><code>"url"</code> <code>value=</code><code>"jdbc:mysql://localhost:3306/store"</code><code>></property></code>
<code> </code><code><property name=</code><code>"username"</code> <code>value=</code><code>"root"</code><code>></property></code>
<code> </code><code><property name=</code><code>"password"</code> <code>value=</code><code>"root"</code><code>></property></code>
<code> </code><code></bean></code>
<code> </code><code><bean id=</code><code>"sessionFactory"</code>
<code> </code><code>class</code><code>=</code><code>"org.springframework.orm.hibernate4.LocalSessionFactoryBean"</code><code>></code>
<code> </code><code><property name=</code><code>"dataSource"</code> <code>ref=</code><code>"dataSource"</code><code>/></code>
<code> </code><code><property name=</code><code>"configLocation"</code> <code>value=</code><code>"classpath:hibernate/hibernate.cfg.xml"</code><code>/></code>
<code> </code><code><tx:annotation-driven/></code>
<code> </code><code><bean id=</code><code>"transactionManager"</code>
<code> </code><code>class</code><code>=</code><code>"org.springframework.orm.hibernate4.HibernateTransactionManager"</code><code>></code>
<code> </code><code><property name=</code><code>"sessionFactory"</code> <code>ref=</code><code>"sessionFactory"</code><code>/></code>
<code> </code><code><bean id=</code><code>"categoryDao"</code> <code>class</code><code>=</code><code>"CategoryDao"</code><code>></code>
<code> </code><code><constructor-arg ref=</code><code>"sessionFactory"</code><code>></constructor-arg></code>
<code></beans></code>
dataSource沒什麼特别的,就不在解釋了。看下其他幾點:
①hibernate sessionFactory:
使用Hibernate所需的主要接口是org.hibernate.Session,Session接口提供了CRUD等最基本的資料通路功能。通過Hibernate的Session接口,應用程式的Repository能夠滿足所有的持久化需求。而擷取Hibernate Session對象的标準方式是借助于Hibernate SessionFactory接口的實作類。
在sessionFactory配置主要設定了兩個屬性:dataSource設定了資料連接配接,configLocation設定了hibernate配置檔案的路徑。
②事務
要是資料庫操作支援事務,需要配置<tx:annotation-driven/>和transactionManager。
①hibernate.cfg.xml
<code><?xml version=</code><code>'1.0'</code> <code>encoding=</code><code>'utf-8'</code><code>?></code>
<code> </code><code><!DOCTYPE hibernate-configuration PUBLIC</code>
<code> </code><code>"-//Hibernate/Hibernate Configuration DTD 3.0//EN"</code>
<code> </code><code>"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"</code><code>></code>
<code><hibernate-configuration></code>
<code><session-factory></code>
<code> </code><code><property name=</code><code>"dialect"</code><code>>org.hibernate.dialect.MySQLDialect</property></code>
<code> </code><code><property name=</code><code>"show_sql"</code><code>></code><code>true</code><code></property></code>
<code> </code><code><mapping resource=</code><code>"hibernate/Category.hbm.xml"</code><code>/></code>
<code></session-factory></code>
<code></hibernate-configuration></code>
②Category.hbm.xml
<code><!DOCTYPE hibernate-mapping PUBLIC</code>
<code> </code><code>"-//Hibernate/Hibernate Mapping DTD 3.0//EN"</code>
<code> </code><code>"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"</code><code>></code>
<code><hibernate-mapping></code>
<code> </code><code><</code><code>class</code> <code>name=</code><code>"Category"</code> <code>table=</code><code>"Category"</code><code>></code>
<code> </code><code><id name=</code><code>"cateId"</code> <code>column=</code><code>"id"</code><code>></code>
<code> </code><code><generator </code><code>class</code><code>=</code><code>"native"</code><code>/></code>
<code> </code><code></id></code>
<code> </code><code><property name=</code><code>"cateName"</code> <code>column=</code><code>"name"</code><code>/></code>
<code> </code><code></</code><code>class</code><code>></code>
<code></hibernate-mapping></code>
如果方法要支援事務,需要加注解@Transactional。
<code>public</code> <code>class</code> <code>CategoryDao {</code>
<code> </code><code>private</code> <code>SessionFactory sessionFactory;</code>
<code> </code><code>public</code> <code>CategoryDao(SessionFactory sessionFactory) {</code>
<code> </code><code>this</code><code>.sessionFactory = sessionFactory;</code>
<code> </code><code>private</code> <code>Session currentSession() {</code>
<code> </code><code>return</code> <code>sessionFactory.getCurrentSession();</code>
<code> </code><code>@Transactional</code>
<code> </code><code>public</code> <code>void</code> <code>save(Category category) {</code>
<code> </code><code>currentSession().save(category);</code>
<code> </code><code>public</code> <code>void</code> <code>update(Category category){</code>
<code> </code><code>currentSession().update(category);</code>
<code> </code><code>public</code> <code>void</code> <code>delete(</code><code>int</code> <code>id) {</code>
<code> </code><code>Query query = currentSession().createSQLQuery(</code><code>"DELETE FROM category WHERE Id=::ID"</code><code>);</code>
<code> </code><code>query.setInteger(</code><code>"::ID"</code><code>, id);</code>
<code> </code><code>query.executeUpdate();</code>
<code> </code><code>public</code> <code>int</code> <code>count() {</code>
<code> </code><code>return</code> <code>getAll().size();</code>
<code> </code><code>public</code> <code>Category getById(</code><code>int</code> <code>id) {</code>
<code> </code><code>Criteria criteria=currentSession().createCriteria(Category.</code><code>class</code><code>);</code>
<code> </code><code>criteria.add(Restrictions.eq(</code><code>"id"</code><code>,id));</code>
<code> </code><code>return</code> <code>(Category) criteria.uniqueResult();</code>
<code> </code><code>public</code> <code>List<Category> getAll() {</code>
<code> </code><code>return</code> <code>currentSession().createCriteria(Category.</code><code>class</code><code>).list();</code>
<code>@ContextConfiguration</code><code>(locations = </code><code>"classpath:applicationContext.xml"</code><code>)</code>
<code>@RunWith</code><code>(SpringJUnit4ClassRunner.</code><code>class</code><code>)</code>
<code>public</code> <code>class</code> <code>testCategoryDao {</code>
<code> </code><code>@Autowired</code>
<code> </code><code>private</code> <code>CategoryDao categoryDao;</code>
<code> </code><code>@Test</code>
<code> </code><code>public</code> <code>void</code> <code>testAdd() {</code>
<code> </code><code>Category category = </code><code>new</code> <code>Category();</code>
<code> </code><code>category.setCateId(</code><code>4</code><code>);</code>
<code> </code><code>category.setCateName(</code><code>"母嬰"</code><code>);</code>
<code> </code><code>categoryDao.save(category);</code>
<code> </code><code>public</code> <code>void</code> <code>testUpdate() {</code>
<code> </code><code>category.setCateName(</code><code>"男裝"</code><code>);</code>
<code> </code><code>categoryDao.update(category);</code>
<code> </code><code>public</code> <code>void</code> <code>testGetById() {</code>
<code> </code><code>int</code> <code>id = </code><code>4</code><code>;</code>
<code> </code><code>Category category = categoryDao.getById(id);</code>
<code> </code><code>if</code><code>(category==</code><code>null</code><code>){</code>
<code> </code><code>System.out.println(</code><code>"not exist"</code><code>);</code>
<code> </code><code>}</code><code>else</code> <code>{</code>
<code> </code><code>System.out.println(category.toString());</code>
<code> </code><code>}</code>
<code> </code><code>public</code> <code>void</code> <code>testGetAll() {</code>
<code> </code><code>List<Category> categories = categoryDao.getAll();</code>
<code> </code><code>for</code> <code>(Category item : categories) {</code>
<code> </code><code>System.out.println(item);</code>
<code> </code><code>public</code> <code>void</code> <code>testCount() {</code>
<code> </code><code>int</code> <code>count = categoryDao.count();</code>
<code> </code><code>System.out.println(count);</code>
<code> </code><code>public</code> <code>void</code> <code>testDelete() {</code>
<code> </code><code>categoryDao.delete(id);</code>
本文轉自 陳敬(Cathy) 部落格園部落格,原文連結:http://www.cnblogs.com/janes/p/6972440.html,如需轉載請自行聯系原作者