首页
统计
4K壁纸
留言
Search
1
自动采集头像+壁纸+流量主小程序
851 阅读
2
【腾讯云】低价服务器活动和新用户活动
494 阅读
3
Spring Di依赖注入环境
377 阅读
4
springboot
323 阅读
5
Spring MVC 结构体系
299 阅读
技术分享
学习笔记
jsp
Maven
Mybatis
Spring
Hibernate
系统源码
网站源码
APP源码
微信程序
小程序
登录
/
注册
Search
标签搜索
学习笔记
Hibernate
小程序
Mybatis
源码
教程
笔记
Ajax
微信
活动
福利
MyEclipse 10
笔记fen'x
壁纸小程序
微信程序
HQL
笔记分享
Mybatis-Plus
小新
累计撰写
44
篇文章
累计收到
42
条评论
首页
栏目
技术分享
学习笔记
jsp
Maven
Mybatis
Spring
Hibernate
系统源码
网站源码
APP源码
微信程序
小程序
页面
统计
4K壁纸
留言
搜索到
3
篇与
学习笔记
的结果
2022-04-11
HQL连接查询
暂无简介
2022年04月11日
18 阅读
0 评论
0 点赞
2022-04-09
HQL实用技术
HQL查询语言是一种面向对象的查询语言,没有表和字段的概念,只要类和对象的概念。我们查询的时候 是查询 实体类HQL语句HibernateUtil.currentSession().beginTransaction(); Session session = HibernateUtil.currentSession(); String hql = "from Emp"; Query query = session.createQuery(hql); // 适用createQuery()方法执行Query对象构建好后,有两种方式执行查询语句并获取查询结果,list() , iterate()两个方法参数绑定第一种显示参数方式HibernateUtil.currentSession().beginTransaction(); Session session = HibernateUtil.currentSession(); String hql = "from Emp where ENAME like concat('%',?,'%')"; Query query = session.createQuery(hql); //setParameter是任意类型参数 , 占位符下标从0开始 query.setParameter(0, "王"); List<Emp> list = query.list();如果参数为字符串类型,可调用setString()方法,整数类型调用setInteger() 依次类推setParameter是任意类型参数,还可以传递数组作为参数 ,对象第二种显示参数方式String hql = "from Emp where ENAME like concat('%',:ename,'%')";动态查询把对象作为参数 有参数作为判断条件,这里我是使用的字符串代替Map<String, Object> map = new HashMap<String, Object>(); String job = "CLERK"; Double sal = 1000.0; String startDt ="1981-4-1"; String endDt = "1985-9-9"; str.append("from Emp where 1 = 1 "); if(job !=null ){ str.append("and job = :job "); map.put("job", job); } if(sal !=null){ str.append("and sal > :sal "); map.put("sal", sal); } if(startDt !=null){ str.append("and HIREDATE >=to_date(:startDt,'yyyy-MM-dd') "); map.put("startDt", startDt); } if(endDt !=null){ str.append("and HIREDATE < to_date(:endDt,'yyyy-MM-dd') "); map.put("endDt", endDt); } Query query = session.createQuery(str.toString()); query.setProperties(map); List<Emp> list = query.list(); System.out.println(list);uniqueResult()方法Query接口提供的list(),iterate()方法获取查询结果集合,使用uniquerResult()方法是或缺唯一的 ,返回一条数据Query query = session.createQuery("select ename from Emp where empno=1944"); Object obs = query.uniqueResult();需要注意的是:当查询结果不是唯一的时候 , 不能使用 nuiqueResult()方法,否则会报错误!分页查询分页查询非常简单,只需要设置两个方法String hql = "from Emp"; Query query = session.createQuery(hql); //表示当前页数 query.setFirstResult(0); //每页显示的数据 query.setMaxResults(2); 投影查询有时候我们只需要展示数据,不需要获取对象的全部属性,比如结果聚合函数等方式得到某个结果,此时可以使用投影查询,下面是投影查询获取的几种方式//1. 单个投影值 Query query = session.createQuery("select ename from Emp where empno=1944"); Object obs = query.uniqueResult(); System.out.println(obs); //2. 单行投影值 Query query = session.createQuery("select empno ,ename, sal from Emp where empno=1944"); Object[] objs = (Object[])query.uniqueResult(); System.out.println(objs[0]); System.out.println(objs[1]); System.out.println(objs[2]); //3.多行投影值 Query query = session.createQuery("select empno ,ename, sal from Emp"); List<Object[]> list = query.list(); for (Object[] objects : list) { System.out.println(objects[0]); System.out.println(objects[1]); System.out.println(objects[2]); } //4. 构造方法投影 Query query = session.createQuery("select new Emp(empno ,ename, sal) from Emp"); List<Emp> list = query.list(); System.out.println(list);总结HQL是面向对象的查询语言,在Hibernate提供的各种查询方式中,HQL是使用最广的一种查询方式执行HQL语句需要Query接口,Query也是Hibernate的核心接口之一,执行HQL的两种常用的方法是list()方法 和 iterate()方法HQL语句中绑定的参数的形式有两种,按参数位置绑定,按参数名称绑定。HQL支持投影查询,灵活的参数查询,分页查询等功能.可以使用反向工具生成持久化类和映射文件
2022年04月09日
76 阅读
0 评论
0 点赞
2022-04-09
Hibernate入门
Hibernate的优点:1、对象化。hibernate可以让开发人员以面相对象的思想来操作数据库。jdbc只能通过SQL语句将元数据传送给数据库,进行数据操作。而hibernate可以在底层对元数据和对象进行转化,使得开发者只用面向对象的方式来存取数据即可。2、更好的移植性。hibernate使用xml或JPA的配置以及数据库方言等等的机制,使得hibernate具有更好的移植性,对于不同的数据库,开发者只需要使用相同的数据操作即可,无需关心数据库之间的差异。而直接使用JDBC就不得不考虑数据库差异的问题。3、开发效率高。hibernate提供了大量的封装(这也是它最大的缺点),很多数据操作以及关联关系等都被封装的很好,开发者不需写大量的sql语句,这就极大的提高了开发者的开发效率。4、缓存机制的使用。hibernate提供了缓存机制(session缓存,二级缓存,查询缓存),对于那些改动不大且经常使用的数据,可以将它们放到缓存中,不必在每次使用时都去查询数据库,缓存机制对提升性能大有裨益。hibernate的缺点主要有以下几点:一、由于对持久层封装过于完整,导致开发人员无法对SQL进行优化,无法灵活使用JDBC的原生SQL,Hibernate封装了JDBC,所以没有JDBC直接访问数据库效率高。要使用数据库的特定优化机制的时候,不适合用Hibernate二、框架中使用ORM原则,导致配置过于复杂,一旦遇到大型项目,比如300张表以上,配置文件和内容是非常庞大的,另外,DTO满天飞,性能和维护问题随之而来三、如果项目中各个表中关系复杂,表之间的关系很多,在很多地方把lazy都设置false,会导致数据查询和加载很慢,尤其是级联查询的时候。四、Hibernate在批量数据处理时有弱势,对于批量的修改,删除,不适合用Hibernate,这也是ORM框架的弱点使用Hibernate操作数据库(1) 读取并解析配置文件及映射文件。Configuration conf = new Configuration().configure();(2) 依据配置文件和映射文件中的信息,创建SessionFactory对象。SessionFactory sf = conf.buildSessionFactory();(3) 打开SessionSession session = sf.getCurrentSession(); //或者使用 sf.openSession() : 使用这个需要关闭;(4) 开始一个事务Transaction tx = session.beginTransaction();(5) 数据库操作session.sava(user); //保存方法(6) 结束事务tx.commit(); //提交事务 或 tx.rollback(); // 回滚封装步骤package com.xyh.util; import org.hibernate.HibernateException; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import org.hibernate.classic.Session; public class HibernateUtil { private static Configuration configuration; private final static SessionFactory sessionFactory; static{ try { configuration = new Configuration().configure(); sessionFactory = configuration.buildSessionFactory(); } catch (HibernateException e) { e.printStackTrace(); throw new ExceptionInInitializerError(e); } } public HibernateUtil() {} public static Session currentSession(){ return sessionFactory.getCurrentSession(); } } 这里直接打开了Session 调用直接使用!使用Hibernate API向hibernate.cfg.xml文件中配置映射文件<property name="show_sql">true</property> <property name="format_sql">true</property> <!--配后才能使用session=sessionFactory.getCurrentSession(); --> assigend:忽略自增长,添加时需手动指定主键 native:采用数据库已有的自增长规则 <property name="current_session_context_class">thread</property>按主键查询在进行修改或删除操作时,应县加载对象,然后再执行修改或删除操作, 主键查询对象:get(类 , id)load(类, id){tabs}{tabs-pane label="get方法"}@Test public void test(){ try { Transaction tx = HibernateUtil.currentSession().beginTransaction(); //这里可以转换为对象 Object object = HibernateUtil.currentSession().get(Emp.class, (short)1944); System.out.println(object); //打印数据 tx.commit(); } catch (HibernateException e) { e.printStackTrace(); } } {/tabs-pane}{tabs-pane label="load方法"}@Test public void test(){ try { Transaction tx = HibernateUtil.currentSession().beginTransaction(); //这里可以转换为对象 Object object = HibernateUtil.currentSession().load(Emp.class, (short)1944); System.out.println(object); //打印数据 tx.commit(); } catch (HibernateException e) { e.printStackTrace(); } } {/tabs-pane}{/tabs}这两个方法的区别之一:get方法如果没有查询出数据,就会返回nullload方法如果没有查询出数据,就会抛出异常实现修改,删除修改和删除操作之前,要先获取到数据{tabs}{tabs-pane label="修改"}Transaction tx = HibernateUtil.currentSession().beginTransaction(); Emp emp = (Emp) HibernateUtil.currentSession().get(Emp.class, (short)1944); emp.setEname("小新"); //获取数据后:直接set修改 tx.commit(); // 提交事务{/tabs-pane}{tabs-pane label="删除"}Transaction tx = HibernateUtil.currentSession().beginTransaction(); Emp emp = (Emp) HibernateUtil.currentSession().get(Emp.class, (short)1944); HibernateUtil.currentSession().delete(emp); //执行delete删除方法即可 tx.commit(); // 提交事务{/tabs-pane}{/tabs}Hibernate对象三种状态临时状态、持久状态、游离状态 临时状态(Transient):当new一个实体对象后,这个对象处于临时状态,即这个对象只是一个保存临时数据的内存区域,如果没有变量引用这个对象,则会被jre垃圾回收机制回收。这个对象所保存的数据与数据库没有任何关系,除非通过Session的save或者SaveOrUpdate把临时对象与数据库关联,并把数据插入或者更新到数据库,这个对象才转换为持久对象。持久状态(Persistent): 持久化对象的实例在数据库中有对应的记录,并拥有一个持久化表示(ID)。对持久化对象进行delete操作后,数据库中对应的记录将被删除,那么持久化对象与数据库记录不再存在对应关系,持久化对象变成临时状态。持久化对象被修改变更后,不会马上同步到数据库,直到数据库事务提交。在同步之前,持久化对象是脏的(Dirty)。游离状态(Detached):当Session进行了Close、Clear或者evict后,持久化对象虽然拥有持久化标识符和与数据库对应记录一致的值,但是因为会话已经消失,对象不在持久化管理之内,所以处于游离状态(也叫:脱管状态)。游离状态的对象与临时状态对象是十分相似的,只是它还含有持久化标识。三种状态之间的转换脏检查与刷新缓存脏检查Transaction tx = HibernateUtil.currentSession().beginTransaction(); //获取部门对象,emp对象处于持久化状态 Emp emp = (Emp) HibernateUtil.currentSession().load(Emp.class, (short)1944); //修改后,部门信息和之前不同,此时emp对象成为所谓的 脏对象 emp.setEname("小新"); // 提交事务 tx.commit();刷新缓存当刷新缓存(调用Session的flush()方法)时,Hiberante会对Session 中持久状态的对象进行监测 ,判断对象的数据是否发生了改变commit() 方法会首先刷新缓存刷新缓存机制刷新缓存就是将数据库同步为与Session缓存一致刷新缓存时会执行脏检查Session 会在以下时间点刷新缓存Session 的flush()方法调用Transaction的commit()方法
2022年04月09日
104 阅读
0 评论
1 点赞