天天看點

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

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

Spring對ORM架構的支援提供了與這些架構的內建點以及一些附加的服務:

支援內建Spring聲明式事務;

透明的異常處理;

線程安全的、輕量級的模闆類;

DAO支援類;

資源管理。

Hibernate是在開發者社群很流行的開源ORM架構。

mysql建立資料庫store,然後執行如下sql:

 db_store.sql

我用的IDE是IdeaIU,通過maven建構項目,通過xml配置spring。完成後的代碼結構為:

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

<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方法&lt;br&gt;</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>&lt;dependencies&gt;</code>

<code>        </code><code>&lt;dependency&gt;</code>

<code>            </code><code>&lt;groupId&gt;junit&lt;/groupId&gt;</code>

<code>            </code><code>&lt;artifactId&gt;junit&lt;/artifactId&gt;</code>

<code>            </code><code>&lt;version&gt;</code><code>4.12</code><code>&lt;/version&gt;</code>

<code>        </code><code>&lt;/dependency&gt;</code>

<code>            </code><code>&lt;groupId&gt;org.hibernate&lt;/groupId&gt;</code>

<code>            </code><code>&lt;artifactId&gt;hibernate-core&lt;/artifactId&gt;</code>

<code>            </code><code>&lt;version&gt;</code><code>4.3</code><code>.</code><code>5</code><code>.Final&lt;/version&gt;</code>

<code>            </code><code>&lt;groupId&gt;mysql&lt;/groupId&gt;</code>

<code>            </code><code>&lt;artifactId&gt;mysql-connector-java&lt;/artifactId&gt;</code>

<code>            </code><code>&lt;version&gt;</code><code>5.1</code><code>.</code><code>30</code><code>&lt;/version&gt;</code>

<code>    </code><code>&lt;/dependencies&gt;</code>

<code>&lt;?xml version=</code><code>"1.0"</code> <code>encoding=</code><code>"UTF-8"</code><code>?&gt;</code>

<code>&lt;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>&gt;</code>

<code>    </code><code>&lt;bean id=</code><code>"dataSource"</code> <code>class</code><code>=</code><code>"org.springframework.jdbc.datasource.DriverManagerDataSource"</code><code>&gt;</code>

<code>        </code><code>&lt;property name=</code><code>"driverClassName"</code> <code>value=</code><code>"com.mysql.jdbc.Driver"</code><code>&gt;&lt;/property&gt;</code>

<code>        </code><code>&lt;property name=</code><code>"url"</code> <code>value=</code><code>"jdbc:mysql://localhost:3306/store"</code><code>&gt;&lt;/property&gt;</code>

<code>        </code><code>&lt;property name=</code><code>"username"</code> <code>value=</code><code>"root"</code><code>&gt;&lt;/property&gt;</code>

<code>        </code><code>&lt;property name=</code><code>"password"</code> <code>value=</code><code>"root"</code><code>&gt;&lt;/property&gt;</code>

<code>    </code><code>&lt;/bean&gt;</code>

<code>    </code><code>&lt;bean id=</code><code>"sessionFactory"</code>

<code>          </code><code>class</code><code>=</code><code>"org.springframework.orm.hibernate4.LocalSessionFactoryBean"</code><code>&gt;</code>

<code>        </code><code>&lt;property name=</code><code>"dataSource"</code> <code>ref=</code><code>"dataSource"</code><code>/&gt;</code>

<code>        </code><code>&lt;property name=</code><code>"configLocation"</code> <code>value=</code><code>"classpath:hibernate/hibernate.cfg.xml"</code><code>/&gt;</code>

<code>    </code><code>&lt;tx:annotation-driven/&gt;</code>

<code>    </code><code>&lt;bean id=</code><code>"transactionManager"</code>

<code>          </code><code>class</code><code>=</code><code>"org.springframework.orm.hibernate4.HibernateTransactionManager"</code><code>&gt;</code>

<code>        </code><code>&lt;property name=</code><code>"sessionFactory"</code> <code>ref=</code><code>"sessionFactory"</code><code>/&gt;</code>

<code>    </code><code>&lt;bean id=</code><code>"categoryDao"</code> <code>class</code><code>=</code><code>"CategoryDao"</code><code>&gt;</code>

<code>        </code><code>&lt;constructor-arg ref=</code><code>"sessionFactory"</code><code>&gt;&lt;/constructor-arg&gt;</code>

<code>&lt;/beans&gt;</code>

dataSource沒什麼特别的,就不在解釋了。看下其他幾點:

①hibernate sessionFactory:

使用Hibernate所需的主要接口是org.hibernate.Session,Session接口提供了CRUD等最基本的資料通路功能。通過Hibernate的Session接口,應用程式的Repository能夠滿足所有的持久化需求。而擷取Hibernate Session對象的标準方式是借助于Hibernate SessionFactory接口的實作類。

在sessionFactory配置主要設定了兩個屬性:dataSource設定了資料連接配接,configLocation設定了hibernate配置檔案的路徑。

②事務

要是資料庫操作支援事務,需要配置&lt;tx:annotation-driven/&gt;和transactionManager。

①hibernate.cfg.xml

<code>&lt;?xml version=</code><code>'1.0'</code> <code>encoding=</code><code>'utf-8'</code><code>?&gt;</code>

<code>        </code><code>&lt;!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>&gt;</code>

<code>&lt;hibernate-configuration&gt;</code>

<code>&lt;session-factory&gt;</code>

<code>    </code><code>&lt;property name=</code><code>"dialect"</code><code>&gt;org.hibernate.dialect.MySQLDialect&lt;/property&gt;</code>

<code>    </code><code>&lt;property name=</code><code>"show_sql"</code><code>&gt;</code><code>true</code><code>&lt;/property&gt;</code>

<code>    </code><code>&lt;mapping resource=</code><code>"hibernate/Category.hbm.xml"</code><code>/&gt;</code>

<code>&lt;/session-factory&gt;</code>

<code>&lt;/hibernate-configuration&gt;</code>

②Category.hbm.xml

<code>&lt;!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>&gt;</code>

<code>&lt;hibernate-mapping&gt;</code>

<code>    </code><code>&lt;</code><code>class</code> <code>name=</code><code>"Category"</code> <code>table=</code><code>"Category"</code><code>&gt;</code>

<code>        </code><code>&lt;id name=</code><code>"cateId"</code> <code>column=</code><code>"id"</code><code>&gt;</code>

<code>            </code><code>&lt;generator </code><code>class</code><code>=</code><code>"native"</code><code>/&gt;</code>

<code>        </code><code>&lt;/id&gt;</code>

<code>        </code><code>&lt;property name=</code><code>"cateName"</code> <code>column=</code><code>"name"</code><code>/&gt;</code>

<code>    </code><code>&lt;/</code><code>class</code><code>&gt;</code>

<code>&lt;/hibernate-mapping&gt;</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&lt;Category&gt; 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&lt;Category&gt; 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,如需轉載請自行聯系原作者