一、什么是Hibernate框架:

1.Hibernate是一个操作数据库的框架,实现了对JDBC的封装;

2.Hibernate是一个ORM(对象关系映射)框架,我们在写程序时 ,用的是面向对象的方法,但是在关系型数据库里,存的是一条条的数据,为了用纯面向对象的思想解决问题,所有需要将程序中的对象和数据库的记录建立起映射关系,ORM就是这样的技术,而Hibernate就是这样一个框架,以操作对象的方式操作数据库。

3.Hibernate简化了代码的编写,原生态的JDBC需要很多代码来实现操作数据库,在这里用Hibernate只需要很少的代码就可以实现。

4.使用Hibernate的基本流程是:配置实现类与数据库表的映射关系,产生sessionFactory,打开session通道拿到session对象,开启事务,完成操作,关闭session。

5.Hibernate屏蔽了数据库的差异,增强了对数据库的可移植性。

6.使用Hibernate时,先要配置hibernate.cfg.xml文件,其中配置数据库连接信息和方言等,还要为每个实体配置相应的hbm.xml文件(Hibernate的映射文件),当然,也可以采用注解编程实现映射关系,hibernate.cfg.xml文件中需要登记每个hbm.xml文件。

二、Hibernate项目的基本搭建:

步骤:

--创建工程,导入依赖;

--创建Hibernate核心配置文件;

--创建持久化类;

--创建对象-关系映射文件;

--通过Hibernate API编写访问数据库的代码。

具体实现:

1、创建一个maven项目,在pom.xml文件中导入hibernate所有相关的jar包依赖:

为了方便,在这里我直接导入ssh整合项目常用的依赖。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.zwp</groupId><artifactId>ssh-test</artifactId><version>0.0.1-SNAPSHOT</version><packaging>war</packaging><!-- 属性 --><properties><spring.version>4.2.4.RELEASE</spring.version><hibernate.version>5.0.7.Final</hibernate.version><struts.version>2.3.24</struts.version></properties><!-- 锁定版本,struts2-2.3.24、spring4.2.4、hibernate5.0.7 --><dependencyManagement><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-orm</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-core</artifactId><version>${hibernate.version}</version></dependency><dependency><groupId>org.apache.struts</groupId><artifactId>struts2-core</artifactId><version>${struts.version}</version></dependency><dependency><groupId>org.apache.struts</groupId><artifactId>struts2-spring-plugin</artifactId><version>${struts.version}</version></dependency></dependencies></dependencyManagement><!-- 依赖管理 --><dependencies><!-- spring --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-orm</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId></dependency><!-- 导入 struts2 --><dependency><groupId>org.apache.struts</groupId><artifactId>struts2-core</artifactId></dependency><dependency><groupId>org.apache.struts</groupId><artifactId>struts2-spring-plugin</artifactId></dependency><!-- hibernate --><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-core</artifactId></dependency><!-- 数据库驱动 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.6</version><scope>runtime</scope></dependency><!-- c3p0 --><dependency><groupId>c3p0</groupId><artifactId>c3p0</artifactId><version>0.9.1.2</version></dependency><!-- servlet jsp --><dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>2.5</version><scope>provided</scope></dependency><dependency><groupId>javax.servlet</groupId><artifactId>jsp-api</artifactId><version>2.0</version><scope>provided</scope></dependency><!-- 日志 --><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.7.2</version></dependency><!-- junit --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.9</version><scope>test</scope></dependency><!-- jstl --><dependency><groupId>javax.servlet</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency></dependencies><build><plugins><!-- 设置编译版本为1.8 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>1.8</source><target>1.8</target><encoding>UTF-8</encoding></configuration></plugin><!-- 默认的tomcat6不支持jdk1.8,访问页面时报错:页面编译成.class失败解决:配置tomcat7插件:mvn命令改为:tomcat7:run --><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.2</version><configuration><url>http://127.0.0.1:8080/manager/text</url><server>tomcat8</server><path>/</path></configuration></plugin></plugins></build>
</project>

2、创建Hibernate的主配置文件,命名:hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"><hibernate-configuration><session-factory><!-- 连接数据库 --><property name="connection.driver_class">com.mysql.jdbc.Driver</property><property name="connection.url">jdbc:mysql:///ssh-test</property><property name="connection.username">root</property><property name="connection.password">admin</property><!-- 设置数据库方言 --><property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property><!-- 输出底层sql语句 --><property name="hibernate.show_sql">true</property><!-- format输出的底层sql语句格式 --><property name="hibernate.format_sql">true</property><!-- 自动创建表;update:如果已经有表,更新,如果没有,创建 --><property name="hibernate.hbm2ddl.auto">update</property><!-- 把映射文件放到核心配置文件中 --><mapping resource="com/zwp/domain/User.hbm.xml" /></session-factory>
</hibernate-configuration>

3、创建持久化类:

//持久化对象:
public class User {private int uid;private String username;private String password;private String address;public int getUid() {return uid;}public void setUid(int uid) {this.uid = uid;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}
}

4、创建对象-关系映射文件:命名:类名.hbm.xml

并把映射文件放到核心配置文件hibernate.cfg.xml中,在第二步中已经写出来了。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><!-- 创建映射配置文件 -->
<hibernate-mapping><!-- 1.配置类和对应表 class标签:name属性:实体类全路径;table属性:数据库表名称,数据库需要自己建立,如果不建立,会报异常 --><class name="com.zwp.domain.User" table="t_user"><!-- 2.配置实体类id和表id对应,hibernate要求实体类有一个属性唯一致,hibernate要求表有字段作为唯一值 --><!-- id标签:name属性:实体类里面id属性名称;column属性:生成的表字段名称 --><id name="uid" column="uid"><!-- 设置uid的增长策略;native:就是生成表id主键自动增长,实体类的主键类型是int类型--><generator class="native"></generator>       <!-- 设置uid的增长策略;uuid:就是生成表id随机uuid,实体类的主键类型是String类型--><!-- <generator class="uuid"></generator> --></id><!-- 3.配置其他属性和表字段对应;name属性:实体类属性名称;column属性:生成表字段名称 --><property name="username" column="username"></property><property name="password" column="password"></property><property name="address" column="address"></property></class>
</hibernate-mapping>

5、测试:

//Hibernate的测试类
public class HibernateTest {//添加一条数据的测试@Testpublic void testAdd(){//第一步:加载hibernate核心配置文件Configuration cfg=new Configuration();cfg.configure();//第二步:建立sessionFactory//读取hibernate核心配置文件的内容,创建sessionFactory//在这个过程中,会根据映射关系,在配置数据里面把表创建SessionFactory sessionFactory = cfg.buildSessionFactory();//第三步:使用SessionFactory常见session对象Session session = sessionFactory.openSession();//第四步:开启事务:Transaction tx = session.beginTransaction();//第五步:写具体的逻辑crud操作://添加功能:User user = new User();user.setUsername("zhangweipeng");user.setPassword("123456");user.setAddress("中国");session.save(user);//第六步:提交事务tx.commit();//第七步:关闭资源session.close();sessionFactory.close();}
}

至此,如果测试成功的话,那么一个简单的hibernate的项目已经搭建完成。

附:项目结构:

三、常用Hibernate方法的使用:

1、hibernate常用方法:

//Hibernate的测试类
public class HibernateTest {@Testpublic void testAdd(){//第一步:加载hibernate核心配置文件Configuration cfg=new Configuration();cfg.configure();//第二步:建立sessionFactory//读取hibernate核心配置文件的内容,创建sessionFactory//在这个过程中,会根据映射关系,在配置数据里面把表创建SessionFactory sessionFactory = cfg.buildSessionFactory();//第三步:使用SessionFactory常见session对象Session session = sessionFactory.openSession();//第四步:开启事务:Transaction tx = session.beginTransaction();//第五步:写具体的逻辑crud操作之添加功能:User user = new User();user.setUsername("zhangweipeng");user.setPassword("123456");user.setAddress("中国");session.save(user);//第六步:提交事务tx.commit();//第七步:关闭资源session.close();sessionFactory.close();}@Testpublic void testSel(){Configuration cfg=new Configuration();cfg.configure();SessionFactory sessionfactory=cfg.buildSessionFactory();Session session=sessionfactory.openSession();Transaction tx=session.beginTransaction();//第五步:写具体逻辑crud操作之查询功能://调用session的get方法,第一个参数:实体类class;第二个参数:id值User user=session.get(User.class, 1);System.out.println(user.toString());tx.commit();session.close();sessionfactory.close();    }@Testpublic void testUpadte(){Configuration cfg=new Configuration();cfg.configure();SessionFactory sessionfactory=cfg.buildSessionFactory();Session session=sessionfactory.openSession();Transaction tx=session.beginTransaction();//第五步:写具体逻辑crud操作之修改功能://5.1根据id进行查询User user=session.get(User.class, 1);//5.2设置修改值user.setUsername("updateUsername");//调用session的update修改;持久态会自动更新数据库,可以不调用update //session.update(user);tx.commit();session.close();sessionfactory.close();   }@Testpublic void testDel(){Configuration cfg=new Configuration();cfg.configure();SessionFactory sessionfactory=cfg.buildSessionFactory();Session session=sessionfactory.openSession();Transaction tx=session.beginTransaction();//第五步:写具体逻辑crud操作之删除功能://常用:1:根据id删除User user=session.get(User.class, 2);session.delete(user);//不常用://User user=new User();//user.setUid(4);//session.delete(user);tx.commit();session.close();sessionfactory.close();}//saveOrUpdate()方法的使用@Testpublic void testsavaOrUpdate(){Configuration cfg=new Configuration();cfg.configure();SessionFactory sessionfactory=cfg.buildSessionFactory();Session session=sessionfactory.openSession();Transaction tx=session.beginTransaction();//       瞬时态的情况:
//      User user =new User();
//      user.setUsername("张三");
//      user.setPassword("5646548");
//      user.setAddress("中国");
//      //实体类对象的状态是瞬时态,则执行添加操作
//      session.saveOrUpdate(user);//       持久态的情况:
//      User user=session.get(User.class, 1);
//      user.setUsername("李四");
//      //实体类对象的状态是持久态,则执行修改操作
//      session.saveOrUpdate(user);//托管态的情况:User user=new User();user.setUid(6);user.setUsername("王五");user.setPassword("132156");user.setAddress("印度");//实体类对象的状态是托管态,则执行修改操作session.saveOrUpdate(user);tx.commit();session.close();sessionfactory.close();}
}

hibernate中实体类对象有三种状态:

(1)瞬时态:实体类对象没有id值,与session也没有关联

(2)持久态:实体类对象有id值,与session有关联

(3)托管态:实体类对象有id值,与session没有关联

2、封装工具类:

从上面的几个测试方法可以看出,我们一直在重复使用同一段代码去创建并获取session,开启事务,为了提高代码的利用率,我们将重复使用的代码抽取出来,封装成一个工具类。

//Hibernate的util工具类:
public class HibernateUtil {static Configuration cfg=null;static SessionFactory sessionfactory=null;//静态代码块实现static{//加载核心配置文件cfg=new Configuration();cfg.configure();sessionfactory=cfg.buildSessionFactory();}//提供返回与本地线程的session方法//需要在hibernate.cfg.xml中加入下面配置//<property name="hibernate.current_session_context_class">thread</property>public static Session getSeesionObject(){return sessionfactory.getCurrentSession();}//提供方法返回sessionFactorypublic static SessionFactory getSessionFactory(){return sessionfactory;}
}

3、hibernate的规范写法:

        //hibernate规范写法:@Testpublic void test(){//得到与本地连接的sessionSession session = null;Transaction tx=null;try{//与本地线程绑定的sessionsession=HibernateUtil.getSeesionObject();tx=session.beginTransaction();User user=new User();user.setUsername("张维鹏");user.setPassword("123");user.setAddress("中国");session.save(user);tx.commit();    }catch(Exception e){e.printStackTrace();tx.rollback();}finally{//session.close();//与本地线程绑定的session,不需要手动关闭//sessionfactory.close();}     }

四、hibernate常用对象api的使用:

1、Query对象:

①使用query对象,不需要写sql语句,但是要写hql语句。

Hql:hibernate query language,hibernate提供查询语句,与sql相似。

②hql和sql语句区别:

Sql语句操作表和表字段;hql语句操作实体类和属性。

③查询所有hql语句:from 实体类名称

④Query对象使用

--创建Query对象;

--调用query对象里面的方法得到结果。

2.Criteria对象:

①使用这个对象查询操作,不需要写语句,直接调用方法实现

②实现过程:

--创建criteria对象;

--调用对象里面的方法得到结果。

3、SQLQuery对象:

①使用hibernate时候,调用底层sql实现;

②实现过程:

--创建SQLQuery对象;

--调用对象的方法。

4、代码实现:

 //使用Query对象@Testpublic void testQuery(){SessionFactory sessionfactory = null;Session session = null;Transaction tx=null;try{sessionfactory=HibernateUtil.getSessionFactory();session=sessionfactory.openSession();tx=session.beginTransaction();//1.创建Query对象,方法里面写hql语句Query query=session.createQuery("from User");//2.调用query对象的方法List<User> list=query.list();for(User user:list){System.out.println(user.toString());}tx.commit();}catch(Exception e){e.printStackTrace();tx.rollback();}finally{session.close();sessionfactory.close();}      }//使用Criteria对象@Testpublic void testCriteria(){SessionFactory sessionfactory = null;Session session = null;Transaction tx=null;try{sessionfactory=HibernateUtil.getSessionFactory();session=sessionfactory.openSession();tx=session.beginTransaction();//1.创建Criteria对象,参数写类名Criteria criteria=session.createCriteria(User.class);//2.调用criteria对象的方法List<User> list=criteria.list();for(User user:list){System.out.println(user.toString());}tx.commit();}catch(Exception e){e.printStackTrace();tx.rollback();}finally{session.close();sessionfactory.close();}        }//使用SQLQuery对象@Testpublic void testSQLQuery(){SessionFactory sessionfactory = null;Session session = null;Transaction tx=null;try{sessionfactory=HibernateUtil.getSessionFactory();session=sessionfactory.openSession();tx=session.beginTransaction();//1.创建SQLQuery对象,参数写底层sql语句SQLQuery sqlquery=session.createSQLQuery("select * from t_user");//调用SQLQuery对象的方法//2.1 list默认返回的是数组的形式
/*          List<Object[]> list=sqlquery.list();for(Object[] objects:list){//System.out.println(objects);System.out.println(Arrays.toString(objects));}*///2.2设置返回的是对象的形式:sqlquery.addEntity(User.class);//调用SQLQuery对象的方法List<User> list =sqlquery.list();for(User user:list){System.out.println(user.toString());}tx.commit();}catch(Exception e){e.printStackTrace();tx.rollback();}finally{session.close();sessionfactory.close();}        }

五、hibernate缓存:

一级缓存:

(1)一级缓存是默认打开的;

(2)一级缓存作用范围,是从session创建到session关闭;

(3)一级缓存存储的数据,必须是持久态数据。

Hibernate框架--学习笔记(上):hibernate项目的搭建和常用接口方法、对象的使用相关推荐

  1. Hibernate框架--学习笔记(下):hibernate的查询方式、多表查询、检索策略、批量抓取

    一.hibernate的查询方式: 主要有五种:对象导航查询:OID查询:hql查询:QBC查询:本地sql查询. 1.对象导航查询:根据id查询某个客户,再查询这个客户里面所有的联系人. 2.OID ...

  2. hibernate框架学习笔记11:Criteria查询详解

    创建实体类对象: package domain;import java.util.HashSet; import java.util.Set;//客户实体 public class Customer ...

  3. hibernate框架学习笔记2:配置文件详解

    实体类: package domain;public class Customer {private Long cust_id;private String cust_name;private Str ...

  4. javaweb学习笔记2(jquery的使用,以及常用的方法,选择器,过滤器)

    javaweb学习笔记2 javascript正则表达式 regfxp对象 方式1: var putt=new RegExp("e");//表示要求字符串中必须包含字符串evar ...

  5. Go 学习笔记(64)— Go error.New 创建接口错误对象、fmt.Errorf 创建接口错误对象、errors.Is 和 errors.As

    1. error 接口定义 除用 panic 引发中断性错误外,还可返回 error 类型错误对象来表示函数调用状态.error 接口是 Go 原生内置的类型,它的定义如下: // $GOROOT/s ...

  6. Hibernate框架--学习笔记(中):一对多配置、多对多配置

    一.一对多: 一个客户可以有多个联系人,一个联系人只能属于一个客户. 1.一对多映射配置: (1)创建实体类 //客户类:一个客户可以有多个联系人,一个联系人只能属于一个客户 public class ...

  7. MongoDB学习笔记(一)环境搭建与常用操作

    一.MongoDB是什么 MongoDB是一个基于分布式文件存储的数据库,旨在为WEB应用提供可扩展的高性能数据存储解决方案. 它介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富, ...

  8. SpringMVC框架--学习笔记(上)

    1.SpringMVC入门程序: (1)导入jar包:spring核心jar包.spring-webmvc整合Jar包 (2)配置前端控制器:web.xml文件中 <?xml version=& ...

  9. mybatis框架--学习笔记(上)

    使用JDBC操作数据库的问题总结: (1)数据库连接,使用时创建,不使用时立即释放,对数据库进行频繁连接开启和关闭,造成数据库资源浪费,影响数据库性能. 设想:使用数据库连接池管理数据库连接. (2) ...

最新文章

  1. 大话App测试2.0笔记2
  2. Python 入门篇-最新版python3.7.2的安装。
  3. js map 箭头_JS异常函数之-箭头函数
  4. Postgre约束详解
  5. 系统磁盘空间满的一个问题
  6. Linux之export命令
  7. 2021牛客暑期多校训练营6,签到题CFHI
  8. 设备驱动简介 -- ldd3读书笔记
  9. 学英语怎样才能事半功倍
  10. stm32f4 生成PWM波
  11. wps所有宏被禁用_WPS 2019怎么启用宏功能?WPS 2019启用宏功能教程
  12. 使用dhtmlxgantt制作任务进度表
  13. HBuilder X运行到微信小程序报错 [微信小程序开发者工具] Error: read EBADF
  14. Banner打造广告自动轮播图
  15. window.open()打开窗口的几种方式
  16. 小白calculator
  17. 查看当前目录和上一级目录的命令
  18. 2022年湖南省高职单招(综合素质)考试冲刺试题及答案
  19. oracle电子商务套件使用手册,Oracle电子商务套件概述.pdf
  20. python数据评估

热门文章

  1. 四十四、Python中的statsmodels模块
  2. AIS 2022 | ACL-IJCAI-SIGIR顶级会议论文预讲会,现开启论文征集
  3. 域对抗自适应算法的设计、不足与改进(Domain Adversarial Learning)
  4. 官方发布:深度学习高层API保姆级中文教程免费开放
  5. 无线通信AI大赛正式开放评测,50万大奖等你霸榜!
  6. RealFormer:把残差转移到Attention矩阵上面去
  7. 最小熵原理系列:词向量的维度应该怎么选择?
  8. 从近年CVPR看域自适应立体匹配
  9. 数学建模第五节2020.5.8-17补
  10. 电音之王 对64bit int 取模