在很多场景下,我们不需要使用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,如需转载请自行联系原作者