概述:

  1. 关系--对象映射的中间件,属于开源ORM框架,是我们业务逻辑层中的调用数据库的中间件

演变:

  1. jdbc---hibernater---mybatis

hibernate和mybatis区别?

  1. 1hiberanter学习的难度要比mybatis要大,复杂度要高
  2. 2hibernate不需要写sql语句,自动生成,而mybatis需要写sql语句进行数据操作
  3. 3hibernate支持分页(API),而mybatis不支持分页(那是属于插件)
  4. 4hibernate支持事务处理,而mybaits不支持事务处理(Spring)
  5. 5hibernate支持一级缓存、二级缓存和查询缓存,而mybaits本身没有缓存(加载第三方缓存技术)

环境搭建步骤:

  1. 1:导包
  1. <dependency>
  2. <groupId>org.hibernate</groupId>
  3. <artifactId>hibernate-core</artifactId>
  4. <version>5.3.3.Final</version>
  5. </dependency>

  1. 2:加载配置文件hibernate.cfg.xml(数据库连接信息)
  2. 3:需要增加映射文件(写的不是sql语句,写的是实体entity和表table中的字段、类型对应关系)

数据库工具类:

  1. public class HibernateUitls {
  2.  
  3. public static Session getSession() {
  4. // 获取数据库的连接工厂
  5. // 从工厂中获取连接session
  6. Configuration config = new Configuration();
  7. config.configure("hibernate.cfg.xml");
  8. SessionFactory sf = config.buildSessionFactory();// 获取工厂
  9. Session session = sf.openSession();
  10. return session;
  11. }
  12. }

增删改查操作

  1. /**
  2. * 测试hibernate增删改查
  3. * @author lisi
  4. * @date 2018年8月20日
  5. */
  6. public class HibernateTest {
  7.  
  8. /**
  9. * 查询操作---读操作
  10. */
  11. @Test
  12. public void query(){
  13.  
  14. Session session = HibernateUitls.getSession();
  15. Note note = session.get(Note.class, 63);//根据主键查询
  16. if (note != null) {
  17. System.out.println(note.getContext());
  18. }
  19. }
  20.  
  21. /**
  22. * 增加---写操作
  23. */
  24. @Test
  25. public void save(){
  26. Session session = HibernateUitls.getSession();
  27.  
  28. Note note = new Note();
  29. note.setId(3000);
  30. note.setContext("java20增加测试数1");
  31. note.setLikeCount(10);
  32. note.setUserId(1);
  33. note.setPublishTime(new Date(System.currentTimeMillis()));
  34.  
  35. Transaction ts = session.beginTransaction();//开启事务处理
  36.  
  37. session.save(note);//保存数据
  38. ts.commit();//提交事物--
  39. session.close();//关闭连接
  40. }
  41.  
  42. /**
  43. * 修改数据
  44. */
  45. @Test
  46. public void update(){
  47.  
  48. Session session = HibernateUitls.getSession();
  49.  
  50. // Note note = new Note();
  51. Note note = session.get(Note.class, 3000);
  52. //note.setId(3000);
  53. note.setContext("java20增加测试数2");
  54. Transaction ts = session.beginTransaction();//开启事务处理
  55. session.update(note);
  56. ts.commit();//提交事物--
  57. session.close();//关闭连接
  58.  
  59. }
  60.  
  61. /**
  62. * 删除操作
  63. * 1:先查询数据是否存在
  64. * 2:如果存在,则删除,不存在,则不执行delete
  65. * 3:hibernate做的安全设置
  66. */
  67. @Test
  68. public void delete(){
  69.  
  70. Session session = HibernateUitls.getSession();
  71.  
  72. Note note = new Note();
  73. note.setId(3000);
  74. Transaction ts = session.beginTransaction();//开启事务处理
  75. session.delete(note);
  76. ts.commit();//提交事物--
  77. session.close();//关闭连接
  78. }
  79.  
  80. }

Hibernate主键管理

策略生成的位置配置:

  1. <id name="id" type="integer" column="id">
  2. <generator class="identity"></generator>
  3. </id>

1.sequence 序列

  1. 主要用于oracle数据库

2.identity 主键自增

  1. 主要用于mysqlSqlServer
  2. 主键自增

3.native

  1. 自动识别当前数据库的类型
  2. 如果数据库为oracle,则默认的ID生成策略为sequence
  3. 如果数据库为mysql等,则默认的ID生成策略为identity

4.increment

  1. 代表当前数据库表的主键ID,查询数据库ID最大值+1

5.uuid/hilo

  1. 采用UUIDhilo的算法,生成一个字符串,当成主键ID

6.assigned

  1. hibernate默认的主键生成策略,增加set方法

Hibernate查询操作

  • SQL:面向结构的查询 Structured Query Language(结构化)

    select * from note 或者 SELECT * FROM NOTE

  • HQL:面向对象的查询 hibernater query language(对象化)

    select userid(实体类中的属性名称) from Note(实体类名)

HQL和SQL区别?

  1. - HQL是面向对象的查询,SQL是面向结构化的查询
  2. - HQL查询时候对查询属性大小写比较敏感,SQL在查询的时候对属性的大小写依赖于我们的配置
  3. - HQL支持countsumavg等,但是HQL不支持类型转换,比如日期转换、字符串转换
  4. - HQL不建议使用left join,而SQL可以无条件的使用
  5. - HQL在做查询的时候,如果是查询所有字段信息,则可以省略select *,直接使用from 实体类名
  6. - HQL在查询的时候,使用的是类名和属性名,SQL查询的时候,使用的表名和字段名
  7. - HQLSQL在使用上,或者处理业务上,HQL只能进行简单操作,SQL可以进行复杂操作

结构化:

HQL查询

  1. 普通查询
  2. 1:查询所有的数据
  3. 2:根据条件进行查询
  4. 3:分页条件
  5. 4:统计个数

代码如下:

  1. /**
  2. * hibernate普通查询
  3. * @author lisi
  4. * @date 2018年8月21日
  5. */
  6. public class HQLTest {
  7.  
  8. /**
  9. * 查询所有的数据
  10. */
  11. @Test
  12. public void query(){
  13. Session session = HibernateUitls.getSession();
  14. String hql = "from Note";//注意:这里的Note不是你的数据库表名,而是你的实体类名
  15. Query query = session.createQuery(hql);
  16. List<Note> list = query.list();//获取查询结果集
  17. //list.isEmpty() 只会判断list中的数据是否为空
  18. //list != null && list.size() > 0 判断的是对象list是否存在,并且判断list中是否有数据
  19. if (list != null && list.size() > 0) {
  20. for (int i = 0; i < list.size(); i++) {
  21. System.out.println("内容为:" + list.get(i).getContext());
  22. }
  23. }
  24. }
  25.  
  26. /**
  27. * 根据条件查询
  28. * select * from note where userId = 3
  29. */
  30. @Test
  31. public void test2(){
  32. Session session = HibernateUitls.getSession();
  33.  
  34. //jpa-style
  35. //String hql = "from Note where userId=?0";//?代表占位符,占位符下标是从0开始
  36. String hql = "from Note where userId = :userid";
  37. Query query = session.createQuery(hql);
  38. // query.setInteger(0, 3);
  39. // query.setParameter(0, 3);
  40. query.setParameter("userid", 3);
  41.  
  42. List<Note> list = query.list();//获取查询结果集
  43. if (list != null && list.size() > 0) {
  44. for (int i = 0; i < list.size(); i++) {
  45. System.out.println("内容为:" + list.get(i).getContext());
  46. }
  47. }
  48. }
  49.  
  50. /**
  51. * 分页查询
  52. *
  53. * select * from note limit 0,3;
  54. */
  55. @Test
  56. public void test3(){
  57. Session session = HibernateUitls.getSession();
  58. String hql = "from Note";
  59.  
  60. Query query = session.createQuery(hql);
  61.  
  62. query.setFirstResult(1);//分页条件limit的第一个参数,下标是从0开始
  63. query.setMaxResults(3);//分页条件limit的第二个参数,代表需要查询的条数
  64.  
  65. List<Note> list = query.list();//获取查询结果集
  66. if (list != null && list.size() > 0) {
  67. for (int i = 0; i < list.size(); i++) {
  68. System.out.println("内容为:" + list.get(i).getId());
  69. }
  70. }
  71. }
  72.  
  73. /**
  74. * 统计个数
  75. * select count(1) from note
  76. */
  77. @Test
  78. public void test4(){
  79. Session session = HibernateUitls.getSession();
  80. String hql = "select count(0) from Note";
  81. Query query = session.createQuery(hql);
  82. Long count = (Long) query.uniqueResult();
  83. System.out.println("统计个数为:" + count);
  84. }
  85. }

Criteria查询

  1. 多条件查询、可以根据实体类属性的字段、排序、分组、分页、统计个数、andor

示例代码:

  1. /**
  2. * 多条件查询
  3. * @author likang
  4. * @date 2018年8月21日
  5. */
  6. public class CriteriaTest {
  7.  
  8. /**
  9. * select * from note;
  10. */
  11. @Test
  12. public void test1(){
  13. Session session = HibernateUitls.getSession();
  14. Criteria criteria = session.createCriteria(Note.class);
  15. List<Note> list = criteria.list();
  16. if (list != null && list.size() > 0) {
  17. for (int i = 0; i < list.size(); i++) {
  18. System.out.println("内容为:" + list.get(i).getContext());
  19. }
  20. }
  21. }
  22.  
  23. /**
  24. * select * from note where userId = 3;
  25. * select * from note where userId = 2 and id = 2005;
  26. * select * from note where userId = 2 or id = 2005;
  27. * select * from note where userId = 2 or id = 2005 order by id desc/asc;
  28. */
  29. @Test
  30. public void test2(){
  31. Session session = HibernateUitls.getSession();
  32. Criteria criteria = session.createCriteria(Note.class);
  33. // criteria.add(Restrictions.eq("userId", 2));
  34. // criteria.add(Restrictions.eq("id", 2005));
  35. criteria.add(Restrictions.or(Restrictions.eq("userId", 2), Restrictions.eq("id", 2005)));
  36. // criteria.addOrder(Order.desc("id"));
  37. criteria.addOrder(Order.asc("id"));
  38.  
  39. List<Note> list = criteria.list();
  40. if (list != null && list.size() > 0) {
  41. for (int i = 0; i < list.size(); i++) {
  42. System.out.println("内容为:" + list.get(i).getContext());
  43. }
  44. }
  45. }
  46.  
  47. /**
  48. * hibernate5新特性写法:
  49. * select * from note where userId = 3;
  50. */
  51. @Test
  52. public void test3(){
  53. Session session = HibernateUitls.getSession();
  54. CriteriaBuilder crb = session.getCriteriaBuilder();
  55. CriteriaQuery<Note> criteria = crb.createQuery(Note.class);
  56. Root<Note> root = criteria.from(Note.class);
  57. criteria.where(crb.equal(root.get("userId"), 1));
  58. Query<Note> query = session.createQuery(criteria);
  59. List<Note> list = query.list();
  60. if (list != null && list.size() > 0) {
  61. for (int i = 0; i < list.size(); i++) {
  62. System.out.println("内容为:" + list.get(i).getContext());
  63. }
  64. }
  65. }
  66. }

NativeSQL查询

  1. 原生查询、支持sql语句的查询

示例代码:

  1. /**
  2. * 原生sql语句查询
  3. * @author lisi
  4. * @date 2018年8月21日
  5. */
  6. public class NativeSQLTest {
  7.  
  8. @Test
  9. public void test1(){
  10. Session session = HibernateUitls.getSession();
  11. String sql = "select * from note";
  12. // SQLQuery query = session.createSQLQuery(sql);
  13. // List<Object[]> list = query.list();
  14. // if (list != null && list.size() > 0) {
  15. // for (Object[] obj : list) {
  16. // System.out.println(obj[1]);
  17. // }
  18. // }
  19.  
  20. SQLQuery query = session.createSQLQuery(sql);
  21. query.addEntity(Note.class);//在进行遍历之前,提前进行数据映射转换
  22. List<Note> list = query.list();
  23. if (list != null && list.size() > 0) {
  24. for (int i = 0; i < list.size(); i++) {
  25. System.out.println("内容为:" + list.get(i).getContext());
  26. }
  27. }
  28. }
  29.  
  30. /**
  31. * hibernate5新特性写法:
  32. */
  33. @Test
  34. public void test2(){
  35. Session session = HibernateUitls.getSession();
  36. String sql = "select * from note where userId = 3";
  37. NativeQuery query = session.createNativeQuery(sql);
  38.  
  39. query.addEntity(Note.class);//在进行遍历之前,提前进行数据映射转换
  40. List<Note> list = query.list();
  41. if (list != null && list.size() > 0) {
  42. for (int i = 0; i < list.size(); i++) {
  43. System.out.println("内容为:" + list.get(i).getContext());
  44. }
  45. }
  46. }
  47.  
  48. }

Hibernate注解应用

类上面注解:

  1. @Entity
  2. @Table(name="note")

方法属性注解:

  1. @Id
  2. @Column(name="数据库中字段主键")
  3. @GeneratedValue(generator="identity")
  4. private int id;//主键

  1. 其它字段:
  2. @Column(name="数据库中字段名称")

修改hibernate.cfg.xml配置文件:

  1. <mapping class="com.xdl.entity.Note"/>

Hibernate特性

延迟加载

  1. hibernate中的API,有一些是具有延迟加载的特性,对象在调用的时候,才会进行数据加载(什么时候调用,什么时候加载)
  2. getlist方法,不具有延迟加载特性
  3. loadfind方法,具有延迟加载特性

问题:

  1. ...... no session

问题请求:

  1. 接口请求--->web.xml--->action--->service--->dao(session关闭)--->view

解决:

  1. 接口请求--->web.xml--->action--->service--->dao(session不关闭)--->view--->关闭session(事务spring)

缓存(性能优化)

  1. 缓存:对象在第一次使用的时候,是进行数据加载(需要查询数据库),下一次查询同样条件的数据,则直接从缓存中获取,而并发查询数据库(速度快、减轻数据库服务器压力)
  • 一级缓存

    自动开启,不需要做任何的配置和修改 特点: session独享

  • 二级缓存

    特定: session共享

  • 查询缓存

持久化(session)

  • 临时状态

    可以被JVM进行垃圾回收

  • 持久化状态

    不能更直接被JVM回收,可以先变成其它两种状态之后,才会进行垃圾回收

  • 游离状态

    可以被JVM进行垃圾回收

Spring+Hibernate整合

整合结构:

整合步骤:

  1. 1:导包
  2. hibernate-core
  3. 2:导入spring
  4. 3:加载springhibernate配置文件
  5. 4:在spring的配置文件中,增加数据库的连接信息和事务管理
  6. 5:将原来的工程进行改造---jdbc实现类注释,增加一个hibernate实现类
  7. 6:实现接口方法
  8. 7:部署、启动、访问

核心代码:

  1. applicationContext.xml:
  1. <!-- 加载hibernateTemplate -->
  2. <bean id="hibernateTemplate" class="org.springframework.orm.hibernate5.HibernateTemplate">
  3. <property name="sessionFactory" ref="sessionFactory"></property>
  4. </bean>
  5.  
  6. <!-- 加载sessionFacotory -->
  7. <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
  8. <property name="dataSource" ref="c3p0"></property>
  9. <property name="configLocations" value="classpath:hibernate.cfg.xml"></property>
  10. </bean>
  11.  
  12. <!-- 处理事务 -->
  13. <bean id="txManger" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
  14. <property name="sessionFactory" ref="sessionFactory"/>
  15. </bean>
  16. <!-- 事务支持注解驱动 -->
  17. <!-- proxy-target-class:属性默认为false,则代表是使用jdk本身的代理(静态代理)
  18. true:则代表使用的是cglib代理(动态代理模式)
  19. -->
  20. <tx:annotation-driven transaction-manager="txManger" proxy-target-class="true"/>
  1. HibernateServiceImpl.java:
  1. @Repository
  2. public class HibernateServiceImpl implements INoteService{
  3.  
  4. @Resource
  5. private HibernateTemplate hibernateTemplate;
  6.  
  7. @Override
  8. public List<Note> queryNoteList(int userid) {
  9. DetachedCriteria dCriteria = DetachedCriteria.forClass(Note.class);
  10. dCriteria.add(Restrictions.eq("userId", userid));
  11. List<Note> list = (List<Note>) hibernateTemplate.findByCriteria(dCriteria);
  12. String hql = "from Note where userId=:userId";
  13. List<Note> list1 = (List<Note>) hibernateTemplate.findByNamedParam(hql, "userId", userid);
  14. return list1;
  15. }
  16.  
  17. @Override
  18. public int deleteNotesById(int id) {
  19. Note note = hibernateTemplate.get(Note.class, id);
  20. if (note != null) {
  21. hibernateTemplate.delete(note);
  22. return 1;
  23. }
  24. return 0;
  25. }
  26. }

  1. 如果有删除操作,需要在删除的action的类头上加上标注,将只读模式关闭
  2. @Transactional(readOnly=false)//将只读模式进行关闭
  3. DeleteAction.java:

Hibernate下的增删改查的更多相关文章

  1. Rest架构下的增删改查

    首先还是要连接一下什么是Rest, REST是英文representational state transfer(表象性状态转变)或者表述性状态转移;Rest是web服务的一种架构风格;使用HTTP, ...

  2. 肝 hibernate 配置and增删改查 and 测试

    已经通宵三天撸代码了,现在的我已经养成晚上修仙写代码的节奏了.....最近 刚刚复习到了 hibernate 谈谈 这篇文章就谈谈我对这货的理解吧. 在看这篇文章之前希望你 知道sessionfact ...

  3. Hibernate入门_增删改查

    一.Hibernate入门案例剖析:  ①创建实体类Student 并重写toString方法 public class Student { private Integer sid; private ...

  4. hibernate搭建及其增删改查

    一.jar包 最基础的hibernatejar包,以及数据库驱动的jar包 二.数据库 t_user表 id int 主键 自动增长 name varchar() 三.配置文件 <?xml ve ...

  5. hibernate的配置, 增删改查

    路径:查找路径 实际上都是查找编译后的对应的路径,在bin文件夹中总 增删改必须开启事务才行 hibernate加载文件的两种方式 configure 1.引包 antlr-2.7.6.jar bac ...

  6. struts+hibernate 请求数据库增删改查(小项目实例)

      StudentAction.java package com.action; import java.util.ArrayList; import java.util.List; import j ...

  7. 5.Hibernate实现全套增删改查和ajax异步分页

    1.1 创建如下oracle数据库脚本 drop sequence seq_stu; create sequence SEQ_STU minvalue maxvalue start increment ...

  8. Hibernate的入门(增删改查):

    注意:本次的记录是在上一篇Hibernate入门的基础上应用的 1.目录 2.实体类修改 package com.itheima.domain; /* * 客户的javaBean * @author ...

  9. JPA+Hibernate 3.3 ——增删改查

    1.     查找对象   1)  用find()方法查找对象 public void getPerson(){ EntityManagerFactory factory = Persistence. ...

随机推荐

  1. NetCore入门篇:(七)Net Core项目使用Controller之二

    一.简介 1.说明Post,Get定义的区别. 2.说明如何路由定义. 二.Get.Post定义 1.api不定义访问方式时,同时支持get 和 post.如果定义某种方式,则仅支持某种方式.具体看代 ...

  2. Spring Batch学习笔记(一)

    Spring Batch简介 Spring Batch提供了可重复使用的功能,用来处理大量数据.包括记录.跟踪,事务管理,作业处理统计,作业重启,跳过和资源管理. 此外还提供了更高级的技术服务和功能, ...

  3. monoDB环境搭建

    最近看到有部分人MongoDB安装之后总是启动不起来,在这里,写了一个简单的搭建教程 直接进入正题 1.mongoDB下载地址 https://www.mongodb.org/downloads#pr ...

  4. .net core webapi+EF Core

    .net core webapi+EF Core 一.描述: EF Core必须下载.net core2.0版本 Micorsoft.EntityFrameworkCore:EF框架的核心包Micor ...

  5. JIT与JVM的三种执行模式:解释模式、编译模式、混合模式

    Java JIT(just in time)即时编译器是sun公司采用了hotspot虚拟机取代其开发的classic vm之后引入的一项技术,目的在于提高java程序的性能,改变人们“java比C/ ...

  6. 1047 行 MySQL 详细学习笔记

    https://blog.csdn.net/baidu_25310663/article/details/86517610 Windows服务   -- 启动MySQL   net start mys ...

  7. Day 11 函数名,闭包,装饰器. +作业

    '''一.函数名.def func(): print(5555)print(func)#输出结果 <function func at 0x026B5E88> 打印函数地址. # 1. 函数 ...

  8. STL在数组算法的使用

    find(a:起始位置 , b: 终止位置 , c: 要查找的内容)      ------>查找寻找内容的位置 count(a:起始位置 , b: 终止位置 , c: 要查找的内容)   -- ...

  9. POJ 2243

    #include <iostream> #include <queue> using namespace std; ][] = {-,-,-,,,-,,,,-,-,-,,,-, ...

  10. zabbix 自动发现 相关

    zabbix自动发现,是zabbix精髓所在. 生产中,一台服务器上可能会存在多个监控实例,比如:A服务器2个,B服务器4个, C服务器1个.单单靠套模板来完成监控,做法那太糟糕了.比如小明有100台 ...