Hibernate :基于JDBC的,不用写SQL语句的持久层框架,其构架JAVA实体对象映射储存到数据库的表中,只需要维护对象与表的映射关系。
Hibernate自动生成SQL语句。Hibernate简化了对数据库的操作,提供了不同数据库的统一接口,应用程序开发使跨数据库成了可能。
Hibernate是开源的、用于封装数据库访问层的组件,我们称之为数据访问层框架(持久层框架),之前我们通过JDBC/SQL语句从数据库中访问/操作数据,而Hibernate就封装了这些操作,专门用于数据访问层的组件技术。
出现Hibernate框架之前在企业项目开发过程中,如下几点造就了程序员的痛苦:hibernate的好处是:
SQL语句过于繁杂,和数据库的耦合度太高。
2.不同数据库之间SQL不同,导致项目难以移植。
3.二维关系表和对象之间数据结构不匹配。基于以上苦难,Hibernate应用而生。对象关系映射
在我们的应用程序(APP)中,数据用对象来体现,而在数据库中,数据使用表的形式保存。Hibernate用于应用程序中的对象(Object)与表中的数据关系之间的映射(Mapping),即把对象保存到关系表中或者把关系表中数据取出映射为对象。6、可以这样理解,当我们使用 Hibernate 框架技术,就可以直接从数据库中取出 Java 对象,或者把Java 对象直接保存于数据库中,中间写 sql 语句等繁琐的步骤被 Hibernate 封装,对我们是透明的。
Hibernate 自动化的程度很高的组件,因此比较难以驾驭,在对 Hibernate 理解不够透彻的情况下使用,稍不留神可能就会影响性能。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
核心API:configuration Sessionfactory session query transaction
工作原理:Hibernate 启动------>configuration(xml)-->
SessionFactory---->Session--->创建Transaction--->持久化操作
----->提交transaction----关闭session
使用: 1、导包 2、文件配置 :Hibernate.cfg.xml和xx.hbm.xml(映射关系)
Saveorupdate:有就保存。没有就更新
在数据库中的主外键的形式来体现,实体对象中体现在对象与对象之间的引用。Hibernate多表之间关系不好做。Hibernate 可以控制外键,主表不需要创建外键
权限:
1、用URL控制
2、资源控制 shiro 权威指南
Hibernate是持久层的数据框架,与数据库交互,为了降低应用程序与物理数据源的交互评率,提高应用的运行的性能
工作原理:查询请求首先进入一级缓存,如果没有进到二级缓存查找,如果还没有,与数据库进行交互,将查询到的结果返回给应用程序。
一级缓存的管理:
evict(obj)将对象从session中清除,从持久态变为游离态。
Clear()将session中的所有对象读清除。
Flush():将缓存中的数据与数据库中的数据进行同步。
Contains(obj):判断缓存中是否存在已知的对象。
load( ):是懒加载。
一级缓存的应用:save( ) ;get();load()将查询的数据放到session
HQL查询:将查询到的对象放到session中
1、自增长
2、Sequence
3、UUID
搭建项目 一、这里在数据库test中建3个表,分别为T_user、T_student、T_teaher
t_user表
t_student表
t_teacher表
public class TestCase { public static Session openSession() { //读取数据库信息 Configuration cfg = new Configuration(); cfg.configure("Hibernate.cfg.xml"); //获取session对象 SessionFactory sf = cfg.buildSessionFactory(); Session session = sf.openSession(); return session; } //测试类 /*public static void main(String[] args) { System.out.println(TestCase.openSession()); }*/ @Test public void testUser() { //获取session对象 Session session=TestCase.openSession(); //通过Session操作数据库 User user = (User) session.get(User.class,"1"); System.out.println(user.getName()); session.close(); } @Test public void testStudent() { //获取Session Session session=TestCase.openSession(); //开启事务 Transaction t = session.beginTransaction(); t.begin(); //创建Student对象,给name赋值 Student st=new Student(); //st.setId(); st.setName("tom"); session.save(st); t.commit(); session.close(); } @Test public void testTeacher() { //获取Session Session session=TestCase.openSession(); //开启事务 Transaction t = session.beginTransaction(); t.begin(); //创建Student对象,给name赋值 Teacher st=new Teacher(); //st.setId(); st.setName("tom"); session.save(st); t.commit(); session.close(); } @Test /* * 修改,先查找,后修改 */ public void testUpdate() { Session session = TestCase.openSession(); Transaction t = session.beginTransaction(); t.begin(); Student student = (Student) session.get(Student.class, 2); System.out.println(student); student.setName("Jery"); System.out.println(student); t.commit(); System.out.println(""); session.close(); } @Test public void testDelete() { Session session = TestCase.openSession(); Transaction t = session.beginTransaction(); t.begin(); Student st = (Student) session.get(Student.class, 5); session.delete(st); t.commit(); session.close(); } @Test public void testEvict() { Session session = TestCase.openSession(); Transaction t = session.beginTransaction(); t.begin(); Student student = (Student) session.get(Student.class, 6); System.out.println(student); //与studnet解除关系 ,从session中清除student对象 session.evict(student); student.setName("tmo"); System.out.println(student); t.commit(); session.close(); } @Test public void testObjectUpdate() { //游离态变回持久态 Session session = TestCase.openSession(); Transaction t = session.beginTransaction(); t.begin(); //获取持久态对象 Student student = (Student) session.get(Student.class, 6); session.evict(student); System.out.println(student); //让对象回到持久态 student.setName("2"); session.update(student); System.out.println(student); t.commit(); session.close(); } //练习HQL @Test public void testSelect() { //1.获取Session Session session = TestCase.openSession(); // 不用获取事务 //2.编写HQL语句 String hql="from Student"; //3.创建query对象 Query query=session.createQuery(hql); //4.调用list()方法查询数据 @SuppressWarnings("unchecked") List<Student> list=query.list(); for (Student student : list) { System.out.println(student); } //6.关闭session session.close(); } @Test //hql 条件查询 public void testWhere() { //获取session Session session = TestCase.openSession(); //2.编写HQL语句 String hql="from Student where name=:name"; //3.创建query对象 Query query = session.createQuery(hql); //4.设置参数 query.setString("name", "Jery"); //5.调用list()方法查询数据 @SuppressWarnings("unchecked") List <Student> list= query.list(); for (Student student : list) { System.out.println(student); } //6.关闭session session.close(); } //排序查询,查询Student所有记录,以ID倒序的方式显示出来 @Test public void testOrder() { //获取session Session session = TestCase.openSession(); String hql="from Student order by id desc"; Query query = session.createQuery(hql); @SuppressWarnings("unchecked") List<Student> list = query.list(); for (Student student : list) { System.out.println(student); } session.close(); }
在测试的时候细心,后续继续改善!!!
