Hibernate介绍
开放源代码的对象关系映射框架
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,
它将POJO与数据库表建立映射关系,是一个全自动的orm框架,
hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,
既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,
最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。
为什么使用Hibernate
1、Hibernate对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。
2、Hibernate是一个基于jdbc的主流持久化框架,是一个优秀的orm实现,它很大程度的简化了dao层编码工作。
3、Hibernate使用java的反射机制,而不是字节码增强程序类实现透明性
4、Hibernate的性能非常好,因为它是一个轻量级框架。映射的灵活性很出色。它支持很多关系型数据库,从一对一到多对多的各种复杂关系。
ORM介绍
ORM:(Object/Relation Mapping): 对象/关系映射
面向对象概念 面向关系概念
类 表
对象 表的行(记录)
属性 表的列(字段)
ORM的实现思想:将关系数据库中表中的记录映射成为对象,以对象的形式展现,
程序员可以把对数据库的操作转化为对对象的操作。
因此ORM的目的是为了方便开发人员以面向对象的思想来实现对数据库的操作。
ORM 采用元数据来描述对象-关系映射细节, 元数据通常采用 XML 格式, 并且存放在专门的对象-关系映射文件中
hibernate之所以操作javabean的过程即操作数据库的表,
这hibernate底层会调用javabean持久化对象的set和get方法,
对数据进行赋值和取值,并获取字段名称,组织sql语句,并执行sql语句,达到效果
Hibernate入门操作
1.引入Hibernate相关jar包
2.封装和表关系映射的javabean
private Integer id; private String name; private String sex; private Integer age; 1:提供一个无参数 public访问控制符的构造器(默认就是) 2:提供一个标识属性,映射数据表主键字段 3:所有属性提供public访问控制符的 set get 方法 4:属性应尽量使用基本数据类型的包装类型
3.配置hibernate.cfg.xml
在src下创建hibernate.cfg.xml文件
4 配置Bean.hbm.xml文件-在Bean的同级目录下边完成
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.exampe.domain.User" table="t_user"> <id name="id" type="integer"> <column name="id"></column> <generator class="increment"></generator> </id> <property name="name" type="string"> <column name="name"></column> </property> <property name="sex" type="string"> <column name="sex"></column> </property> <property name="age" column="age" type="integer"></property> </class> </hibernate-mapping>
Hibernate中核心API
Configuration 类
Configuration 类负责管理 Hibernate 的配置信息。包括如下内容: Hibernate运行的底层信息:数据库的URL、用户名、密码、JDBC驱动类,数据库Dialect,数据库连接池等(对应 hibernate.cfg.xml 文件)。 持久化类与数据表的映射关系(*.hbm.xml 文件) 创建 Configuration 的两种方式 属性文件(hibernate.properties): Configuration cfg = new Configuration(); Xml文件(hibernate.cfg.xml) Configuration cfg = new Configuration().configure();
SessionFactory接口
Configuration对象根据当前的配置信息生成 SessionFactory 对象。 SessionFactory 对象一旦构造完毕,即被赋予特定的配置信息(SessionFactory 对象中保存了当前的数据库配置信息和所有映射关系以及预定义的SQL语句。 同时,SessionFactory还负责维护Hibernate的二级缓存)。 Configuration cfg = new Configuration().configure(); SessionFactory sf = cfg.buildSessionFactory(); 是线程安全的。 SessionFactory是生成Session的工厂: Session session = sf.openSession();
Session接口
Session 是应用程序与数据库之间交互操作的一个单线程对象,是 Hibernate 运作的中心,所有持久化对象必须在 session 的管理下才可以进行持久化操作。此对象的生命周期很短。Session 对象有一个一级缓存,显式执行 flush 之前,所有的持久层操作的数据都缓存在 session 对象处。相当于 JDBC 中的 Connection。 持久化类与 Session 关联起来后就具有了持久化的能力。 是线程不安全的 Session 类的方法: 取得持久化对象的方法: get() load() 持久化对象都得保存,更新和删除:save(),update(),saveOrUpdate(),delete() 开启事务: beginTransaction(). 管理 Session 的方法:isOpen(),flush(), clear(), evict(), close()等
Transaction接口
代表一次原子操作,它具有数据库事务的概念。所有持久层都应该在事务管理下进行,即使是只读操作。 Transaction tx = session.beginTransaction(); 常用方法: commit():提交相关联的session实例 rollback():撤销事务操作 wasCommitted():检查事务是否提交
Query
Query接口让你方便地对数据库及持久对象进行查询,它可以有两种表达方式: HQL语言或本地数据库的SQL语句。Query经常被用来绑定查询参数、限制查询记录数量, 并最终执行查询操作。
Criteria
Criteria接口与Query接口非常类似,允许创建并执行面向对象的标准化查询。 值得注意的是Criteria接口也是轻量级的,它不能在Session之外使用。
Hibernate中增删改查
封装工具类获取SessionFactory
private static SessionFactory sessionFactory; static{ sessionFactory = new Configuration().configure().buildSessionFactory(); } public static Session getSession(){ return sessionFactory.openSession(); }
添加
@Test public void add() { //通过session工厂,生成session Session openSession = sf.openSession(); //开启事务 Transaction tr = openSession.beginTransaction(); //创建对象 设置对应数据 User user = new User(); user.setName("wangwu"); user.setAge(13); user.setSex("nan"); //将信息保存到session中 openSession.save(user); //提交事务 tr.commit(); openSession.close(); }
删除
@Test public void delete() { Session openSession = sf.openSession(); Transaction tr = openSession.beginTransaction(); User user = new User(); user.setId(1); openSession.delete(user); tr.commit(); openSession.close(); }
修改
@Test public void update() { Session openSession = sf.openSession(); Transaction tr = openSession.beginTransaction(); User user = new User(); user.setId(2); user.setName("周期"); user.setAge(88); user.setSex("女"); openSession.update(user); tr.commit(); openSession.close(); }
查询单个
@Test public void query() { Session openSession = sf.openSession(); Transaction tr = openSession.beginTransaction(); User user = (User) openSession.get(User.class, 1); openSession.close(); tr.commit(); }
检索语句
Hibernate的检索方式
HQL 检索方式:
使用面向对象的 HQL 查询语言 select * from t_person where name=zhangsan (from Person where name=zhangsan) HQL(Hibernate Query Language) 是面向对象的查询语言 Hibernate 负责解析 HQL 查询语句, 然后根据对象-关系映射文件中的映射信息, 把 HQL 查询语句翻译成相应的 SQL 语句. HQL语句的检索方式与SQL语句的区别 HQL是面向对象和对象中的属性
QBC 检索方式:
使用 QBC(Query By Criteria) API 来检索对象.
SQL 检索方式:
使用本地数据库的 SQL 查询语句
查询
使用Hql语句进行查询
查询所有
Query query = session.createQuery("from Customer ); List<Customer> list = query.list();//list()
条件查询
//Query query = session.createQuery("from Customer c where c.name='zhangsan'"); Query createQuery = session.createQuery("from Customer where name=?"); createQuery.setString(0, "张三"); List<Customer> list = query.list();
排序
Query query = session.createQuery("from Customer c order by c.id desc"); List<Customer> list = query.list();
分页查询
Query query = session.createQuery("from Order o order by o.id desc"); query.setFirstResult(20);//表示从第一条开始检索,0表示1 query.setMaxResults(10);//表示当前页最多显示多少条记录 List<Order> list = query.list(); tx.commit(); s.close();
惟一结果集
Query query = session.createQuery("from Customer c order by c.id"); query.setMaxResults(1);//做多返回几条记录 Customer c = (Customer)query.uniqueResult();//返回0到1条数据
内连接
Query query = session .createQuery("from Customer c inner join c.orders o where c.name ='张三'"); List<Object[]> list = query.list(); for (Object[] objects : list) { Customer customer = (Customer) objects[0]; Order order = (Order) objects[1]; System.out.println(customer + order.toString()); } Query query = session .createQuery("from Customer c where c.name ='张三'"); List<Customer> list = query.list(); for (Customer customer : list) { Set<Order> orders = customer.getOrders(); for (Order order : orders) { System.out.println(order.toString()); } }
左外连接
Query query =session.createQuery("from Customer c left outer join c.orders o"); List<Object[]> list = query.list();
右外连接
Query query = session.createQuery("from Customer c right outer join c.orders o where c.name like ‘t%'");
使用SQl进行查询
Query query = session.createSQLQuery(“select o.name from t_customer c where c.name=‘张三’”);
query.list();
Query query = session.createSQLQuery(“select * from t_customer c where c.name=?”);
query.setString(“0”,’tom’)
query.list();