框架学习笔记之Hibernate
一、什么是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的更多相关文章
- phalcon(费尔康)框架学习笔记
phalcon(费尔康)框架学习笔记 http://www.qixing318.com/article/phalcon-framework-to-study-notes.html 目录结构 pha ...
- Yii框架学习笔记(二)将html前端模板整合到框架中
选择Yii 2.0版本框架的7个理由 http://blog.chedushi.com/archives/8988 刚接触Yii谈一下对Yii框架的看法和感受 http://bbs.csdn.net/ ...
- JavaSE中Collection集合框架学习笔记(2)——拒绝重复内容的Set和支持队列操作的Queue
前言:俗话说“金三银四铜五”,不知道我要在这段时间找工作会不会很艰难.不管了,工作三年之后就当给自己放个暑假. 面试当中Collection(集合)是基础重点.我在网上看了几篇讲Collection的 ...
- JavaSE中Collection集合框架学习笔记(3)——遍历对象的Iterator和收集对象后的排序
前言:暑期应该开始了,因为小区对面的小学这两天早上都没有像以往那样一到七八点钟就人声喧闹.车水马龙. 前两篇文章介绍了Collection框架的主要接口和常用类,例如List.Set.Queue,和A ...
- JavaSE中Map框架学习笔记
前言:最近几天都在生病,退烧之后身体虚弱.头疼.在床上躺了几天,什么事情都干不了.接下来这段时间,要好好加快进度才好. 前面用了三篇文章的篇幅学习了Collection框架的相关内容,而Map框架相对 ...
- JavaSE中线程与并行API框架学习笔记1——线程是什么?
前言:虽然工作了三年,但是几乎没有使用到多线程之类的内容.这其实是工作与学习的矛盾.我们在公司上班,很多时候都只是在处理业务代码,很少接触底层技术. 可是你不可能一辈子都写业务代码,而且跳槽之后新单位 ...
- JavaSE中线程与并行API框架学习笔记——线程为什么会不安全?
前言:休整一个多月之后,终于开始投简历了.这段时间休息了一阵子,又病了几天,真正用来复习准备的时间其实并不多.说实话,心里不是非常有底气. 这可能是学生时代遗留的思维惯性--总想着做好万全准备才去做事 ...
- scrapy爬虫框架学习笔记(一)
scrapy爬虫框架学习笔记(一) 1.安装scrapy pip install scrapy 2.新建工程: (1)打开命令行模式 (2)进入要新建工程的目录 (3)运行命令: scrapy sta ...
- TensorFlow机器学习框架-学习笔记-001
# TensorFlow机器学习框架-学习笔记-001 ### 测试TensorFlow环境是否安装完成-----------------------------```import tensorflo ...
随机推荐
- JAVA获取文件数据 ( xxxxx.json )
//路径fPixFile filePath = new File(fPix);System.out.print("文件路径:" + filePath);try { if (file ...
- K-Means 聚类
机器学习中的算法主要分为两类,一类是监督学习,监督学习顾名思义就是在学习的过程中有人监督,即对于每一个训练样本,有对应的标记指明它的类型.如识别算法的训练集中猫的图片,在训练之前会人工打上标签,告诉电 ...
- 排序算法Java实现(希尔排序)
算法描述:先将待排序序列的数组元素分成多个子序列,使得每个子序列的元素个数相对较少,然后对各个子序列分别进行直接插入排序,待整个待排序序列“基本有序”后,再对所有元素进行一次直接插入排序. packa ...
- VMware 下快速克隆出多个 Linux 环境
念念不忘,必有回响 好好工作,好好吃饭,困了倒头就睡:吃你认为好吃的,吃到饱:买贵的,你想买的:去玩去野: 就这样. 为什么要克隆多个 Linux 系统? 因为要玩阿. 其实也不是了,就是为了折腾嘛, ...
- Dynamics 365 Online-使用Azure Logic App 与 Dynamics 365 集成
什么是Logic App? Azure Logic App 是微软发布的集成平台的产品,有助于生成,计划和自动完成工作流形式的流程,适合跨企业或组织集成,数据,系统和服务.与此同时,Logic App ...
- Algorithm --> 求N以内的真分数个数
求N以内的真分数个数 For example, if N = 5, the number of possible irreducible fractions are 11 as below. 0 1/ ...
- cisco交换机实现端口聚合
0x00前言: 今天听老师讲端口聚合,为了方便日后复习故此有 了本篇随笔. 0x01准备工具: cisco模拟器 0x02:目录 为什么要用端口聚合? 广播风暴? 扩展:SMTP 0x03正文: 为什 ...
- backpropagation
github: https://github.com/mattm/simple-neural-network blog: https://mattmazur.com/2015/03/17/a-step ...
- Alpha冲刺Day2
Alpha冲刺Day2 一:站立式会议 今日安排: 首先完善前一天的剩余安排工作量,其次我们把项目大体分为四个模块:数据管理员.企业人员.第三方机构.政府人员.数据管理员这一模块,数据管理员又可细分为 ...
- 在Nginx上配置多个站点
有时候你想在一台服务器上为不同的域名运行不同的站点.比如www.siteA.com作为博客,www.siteB.com作为论坛.你可以把两个域名的IP都解析到你的服务器上,但是没法在Nginx的根目录 ...