天天看点

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,如需转载请自行联系原作者