一、什么是Hibernate

  Hibernate框架是当今主流的持久层框架之一,该框架是基于JDBC的主流持久化框架,使用它之后能够大大简化程序DAO层的代码量,提高工作效率,因此受广大开发人员的喜爱。配合Strut2和Spring框架,就是经典的SSH组合。

二、ORM思想

  学习该框架的编程思想是 ORM(Object Relational Mapping)即对象关系映射是思想,进而对数据库进行CRUD操作。所谓的ORM思想就是把实体对象跟数据库中的表一一对应

ORM的原理如下

三、环境搭建

1.所需jar包

2.两个配置文件

  2.1映射配置文件

2.2核心配置文件

该配置文件通常在src的源文件夹下

四、CRUD操作

 @Test
public void testCRUD(){    //第一步加载核心配置文件
    Configuration configuration = new Configuration();
    configuration.configure();
    //得到SessionFactory对象
    SessionFactory factory = configuration.buildSessionFactory();
    //得到session对象(此处的session对象相当于jdbc中的connection)
    Session session = factory.openSession();
    //开启事务
    Transaction ts = session.beginTransaction();
    try{


      //此处进行CRUD操作
      //添加操作User
      User user = new User();
      user.set(...);
      session.save(user);


      //查找操作
      User user = session.get(User.class,"uid");//查找指定ID下的对象
  
      //其他查询方式
      //使用Query对象使用hql语句
      Query qr = session.createQuery("from User where 属性名 =?");
       qr.setString(0,"...");
      List<User> user = qr.list();
      //使用Criteria对象查询
      Criteria criteria = session.createCriteria(User。class);
      List<User> list = criteria.list();
      //使用SQLQuery对象查询
      SQLQuery sq = session.createSQLQuery("select * from user ");
      sq.addEntity(User.class);
      List<User> list = sq.list();
     


      //修改操作 先查找在修改
      User user = session.get(User.class,"uid");
      user.set(...);
      session.update(user);

      //删除操作
      User user = session.get(User.class,"uid");
      session.delete(user);
    
      //或者
      User user = new User();
      user.setUid("uid");
      session.delete(user);

  

      ts.commit();
     }catch(Exception e){
      ts.rollback();
    }finally{
      session.close();
      factory.close();
  }
}

五、实体之间关联

5.1一对多关系

每个实体对应一个映射配置文件 如果两个实体之间是一对多关系是需要两个映射配置文件

one to many中

one的class标签中加入

	<!--在客户映射文件中表示所有联系人
		使用set标签表示所有联系人
		set标签中的name属性 :属性值写在客户实体类里面表示set集合名称
		实体类里面表示联系人的set集合名称
		一对多见表有外键
		hibernate机制:双向维护外键字啊一和多哪一方都有配置外键
		在one-to-many中class里面写的是联系人的实体类路径

		 inverse:放弃关系维护  因为hibernate中是双向逐渐维护
		 -->
		 <set name="setLinkMan" inverse="true" cascade="save-update,delete">
		 	<key column="clid"></key>
		 	<one-to-many class="cn.entity.LinkMan"/>
		 </set>

  

many的class标签中加入

<many-to-one name="customer" class="cn.entity.Customer" column="clid"></many-to-one>

5.2实体之间是多对多的关系

假设用户和角色之间是多对多的关系

在用户和角色中分别配置

在核心配置文件中添加

六、Hibernate的查询方式

SessionFactory sessionfactory = null;

Session session = null;

Transaction ts = null;

try{

sessionFactory = HibernateUtils.getSessionFactory();

session = sessionFactory.openSession();

ts = session.beginTransaction();

6.1OID查询

例:根据id查询客户

Customer customer = session.get(Customer.class,1);

  

6.2对象导航查询

例:查询某个对象里面的所有联系人

Customer customer = session.get(Customer.class);
set<LinkMan> linkman = customer.getSetLinkMan();

6.3HQL查询

注:hql查询和sql语句十分相似 hql操作实体类和属性 而sql语句操作的是数据表和其中的字段

  •  查询所有客户记录

Query query = session.createQuery("from Customer");

List<Customer> list = query.list();

  • 条件查询

Query query = session.createQuery("from Customer where cid = ?");

query.setParameter(0,1);//注意 此处参数顺序是从0开始  查询cid=1的用户

  • 模糊查询

Query query = session.createQuery("from Customer c where c.custName like ?");

query.setParameter(0,"%Bai%")

  • 排序查询

Query query = session.createQuery("from Customer order by cid desc");

  • 分页查询

Query query = session.createQuery("from Customer");

query.setFirstResult(0);//设置每页的开始记录数【(页数-1)*每页记录数】

query.setMaxResults(3);//设置每页记录数

  • 投影查询

Query query = session.createQuery("select custName From Customer");

  • 聚集函数

Query query = session.createQuery("select count(*) from Customer");

Object obj = query.uniqueResult();//返回的是一个Object类型的对象

Long lobj = (Long) obj;

int count = lobj.intValue();

hql多表查询

内连接and迫切内连接

注:迫切内连接只需要在hql语句中join后添加一个fetch即可  两者区别在于内连接返回结果list中每一项是以数组形式而后者则是以对象形式返回

Query query = session.createQuery("from Customer c inner join c.setLinkMan");//

List list = query.list();

左连接和迫切左连接

Query query = session.createQuery("from Customer c left outer join c.setLinkMan");

右外连接

Query query = session.createQuery("from Customer c right outer join c.setLinkMan");

6.4QBC查询

注:改查询是不需要sql或者hql语句的 都是通过方法来完成

查询所有

Criteria criteria = session.createCriteria(Customer.class);

List<Customer> list = criteria.list();

条件查询

Criteria criteria = session.createCriteria(Customer.class);

//首先要使用add方法 然后在add方法里面使用累的方法使用实现调教设置 例如:cid=?

criteria.add(Restrictions.eq("cid",1));

//可见此表

  • 排序查询

Criteria criteria = session.createCriteria(Customer.class);

criteria.addOrder(Order.desc("cid"));//Order.asc();默认是升序

分页查询(和hql类似)

Criteria criteria = session.createCriteria(Customer.class);

criteria.setFirstResult(0);

criteria.setMaxResults(10);

  • 统计查询

Criteria criteria = session.createCriteria(Customer.class);

criteria.setProjection(Projections.rowCount());

  • //调用方法得到结果

Object obj = criteria.uniquerResult();

  • 离线查询

DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Customer.class);

Criteria criteria = detachedCriteria.getExecutableCriteria(session);

List<Customer> list = criteria.list();

ts.commit();

}catch(Exception e){

  ts.rollback();

}finally{

  session.close();

  sessionFactory.close();  

}

七、Hibernate的检索策略和批量抓取

  

例:查询所有的客户,返回list集合,遍历list集合,得到每个客户,得到每个客户的所有联系人

没有配置批量抓取时,发送多条sql语句,效率很低 我们可以在客户端的映射文件中set标签中配置

bitch-size="100"//该数字不固定 可随意配置

  

框架学习笔记之Hibernate的更多相关文章

  1. phalcon(费尔康)框架学习笔记

    phalcon(费尔康)框架学习笔记 http://www.qixing318.com/article/phalcon-framework-to-study-notes.html 目录结构   pha ...

  2. Yii框架学习笔记(二)将html前端模板整合到框架中

    选择Yii 2.0版本框架的7个理由 http://blog.chedushi.com/archives/8988 刚接触Yii谈一下对Yii框架的看法和感受 http://bbs.csdn.net/ ...

  3. JavaSE中Collection集合框架学习笔记(2)——拒绝重复内容的Set和支持队列操作的Queue

    前言:俗话说“金三银四铜五”,不知道我要在这段时间找工作会不会很艰难.不管了,工作三年之后就当给自己放个暑假. 面试当中Collection(集合)是基础重点.我在网上看了几篇讲Collection的 ...

  4. JavaSE中Collection集合框架学习笔记(3)——遍历对象的Iterator和收集对象后的排序

    前言:暑期应该开始了,因为小区对面的小学这两天早上都没有像以往那样一到七八点钟就人声喧闹.车水马龙. 前两篇文章介绍了Collection框架的主要接口和常用类,例如List.Set.Queue,和A ...

  5. JavaSE中Map框架学习笔记

    前言:最近几天都在生病,退烧之后身体虚弱.头疼.在床上躺了几天,什么事情都干不了.接下来这段时间,要好好加快进度才好. 前面用了三篇文章的篇幅学习了Collection框架的相关内容,而Map框架相对 ...

  6. JavaSE中线程与并行API框架学习笔记1——线程是什么?

    前言:虽然工作了三年,但是几乎没有使用到多线程之类的内容.这其实是工作与学习的矛盾.我们在公司上班,很多时候都只是在处理业务代码,很少接触底层技术. 可是你不可能一辈子都写业务代码,而且跳槽之后新单位 ...

  7. JavaSE中线程与并行API框架学习笔记——线程为什么会不安全?

    前言:休整一个多月之后,终于开始投简历了.这段时间休息了一阵子,又病了几天,真正用来复习准备的时间其实并不多.说实话,心里不是非常有底气. 这可能是学生时代遗留的思维惯性--总想着做好万全准备才去做事 ...

  8. scrapy爬虫框架学习笔记(一)

    scrapy爬虫框架学习笔记(一) 1.安装scrapy pip install scrapy 2.新建工程: (1)打开命令行模式 (2)进入要新建工程的目录 (3)运行命令: scrapy sta ...

  9. TensorFlow机器学习框架-学习笔记-001

    # TensorFlow机器学习框架-学习笔记-001 ### 测试TensorFlow环境是否安装完成-----------------------------```import tensorflo ...

随机推荐

  1. 转载NodePort,LoadBalancer还是Ingress?我该如何选择 - kubernetes

    原文:http://mp.weixin.qq.com/s/dHaiX3H421jBhnzgCCsktg ClusterIP ClusterIP服务是Kuberntets的默认服务.它在集群内部生成一个 ...

  2. 在java或 js中的日期时间转换问题

    1.在js中需要求的当前日期的周一和周日 var now = new Date(); // 当前日期时间对象 var date = now.getDate(); // 当前是几号:当前日期在一个月中的 ...

  3. Python实现制度转换(货币,温度,长度)

    人民币和美元是世界上通用的两种货币之一,写一个程序进行货币间币值转换,其中: 人民币和美元间汇率固定为:1美元 = 6.78人民币. 程序可以接受人民币或美元输入,转换为美元或人民币输出.人民币采用R ...

  4. [ZJOI2007] 矩阵游戏

    Description 小Q是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏――矩阵游戏.矩阵游戏在一个N*N黑白方阵进行(如同国际象棋一般,只是颜色是随意的).每次可以对该矩阵进行两 ...

  5. svn打分支

    http://www.07net01.com/linux/Eclipsexiasvndechuangjianfenzhi_hebing_qiehuanshiyong_548928_1374750252 ...

  6. 笔记:Jersey REST 传输格式

    通常REST接口会以XML或JSON作为主要传输格式,同时 Jersey 也支持其他的数据格式,比如基本类型.文件.流等格式. 基本类型 Java的基本类型又叫原生类型,包括4种整数(byte.sho ...

  7. 笔记:I/O流-ZIP文档

    ZIP文档以压缩格式存储了一个或多个文件,每个ZIP文档都有一个头,包含诸如每个文件名字和所使用的压缩方法等信息,在 Java 中可以使用 ZipInputStream 来读入ZIP 文档,getNe ...

  8. MYSQL数据库学习十八 数据库维护和性能提高

    18.1 数据备份 可能造成数据损失的原因有: 存储介质故障:保存数据库文件的磁盘设备损坏,用户没有数据库备份导致数据彻底丢失. 用户的错误操作:如误删了某些重要数据,甚至整个数据库. 服务器的彻底瘫 ...

  9. 【Python】 MySQLdb的安装与使用

    MySQLdb MySQLdb是一款较为底层的,python连接mysql用的模块.和更加高级的,提供ORM的模块不同,MySQLdb主要还是聚焦于如何和数据库进行连接和进行基本的操作,操作的体现形式 ...

  10. linux下安装Sublime Text3并将它的快捷方式放进启动器中

    Sublime Text是一个代码编辑器,我主要是用它来编辑python.下面就来简单说明下它在linux的安装过程吧! 1.添加sublime text3的仓库 首先按下快捷键ctrl+alt+t打 ...