博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JAVA入门[19]-Hibernate简单示例
阅读量:6824 次
发布时间:2019-06-26

本文共 4719 字,大约阅读时间需要 15 分钟。

一、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,引入相关依赖。

junit
junit
4.12
org.hibernate
hibernate-core
4.3.5.Final
mysql
mysql-connector-java
5.1.30

  

5.配置applicationContext.xml

  

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

org.hibernate.dialect.MySQLDialect
true

  

②Category.hbm.xml

  

7.数据访问实现类CategoryDao

如果方法要支持事务,需要加注解@Transactional。

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

  

源码地址:

 

转载地址:http://mfykl.baihongyu.com/

你可能感兴趣的文章
增加智能感知的RichTextBox扩展控件(WPF)
查看>>
大家一起来学习一下面向对象的三层架构吧!今天我来说说Entity有时也叫MODEL实体层!...
查看>>
个人管理:发掘自己的性格优势
查看>>
Rails性能优化简明指南 (转载)
查看>>
关于D3D11,你必须了解的几件事情(一)
查看>>
AutoResetEvent和ManualResetEvent的使用与区别
查看>>
shell中的fork、source和exec总结(包括环境变量)
查看>>
《Effective C#》读书笔记——条目4:使用Conditional特性而不是#if条件编译<C#语言习惯>...
查看>>
浅谈异常与恋爱
查看>>
分享:http-watcher更新,改进对动态web程序的支持
查看>>
设计模式---->经典设计模式一览
查看>>
Asp.Net生命周期系列一
查看>>
ArcGis API FOR Silverlight 做了个导航工具~
查看>>
Spark源码分析 – Deploy
查看>>
C#反射技术概念作用和要点
查看>>
lm393
查看>>
JavaScript回调函数的理解
查看>>
C#实现UTC时间与Datetime转换
查看>>
JS模块化写法(转)
查看>>
allegro飞线隐藏
查看>>