【部份内容参考地址:http://www.javashuo.com/article/p-rvqqxzky-dt.html】html
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了很是轻量级的对象封装,它将POJO与数据库表创建映射关系,是一个全自动的orm框架,hibernate能够自动生成SQL语句,自动执行,使得Java程序员能够为所欲为的使用对象编程思惟来操纵数据库。 Hibernate能够应用在任何使用JDBC的场合,既能够在Java的客户端程序使用,也能够在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate能够在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。程序员
一、经过Configuration config=new Configuration().configure(); //读取并解析hibernate.cfg.xml配置文件sql
二、由hibernate.cfg.xml中的<mapping resource="com/xx/User.hbm.xml"/> //读取并映射信息数据库
三、经过SessionFactory sf = config.buildSessionFactory(); //建立SessionFactory编程
四、Session s = sf.openSession(); //打开session数组
五、Transaction tx = s.beginTransaction(); //建立并启动事务Transaction缓存
六、persistent operate操做数据,持久化操做session
七、tx.commit(); //提交事务架构
八、关闭Session并发
九、关闭SessionFactory
一、获取SessionFactory
二、经过SessionFactory 获取一个Session
三、在Session基础上开启一个事务
四、经过调用Session的save方法把对象保存到数据库
五、 提交事务
六、关闭Session
七、关闭SessionFactory
1 public class TestHibernate { 2 3 public static void main(String[] args) { 4 5 //获取SessionFactory 6 SessionFactory sf = new Configuration().configure().buildSessionFactory(); 7 8 Session s = sf.openSession(); //经过SessionFactory 获取一个Session 9 s.beginTransaction(); //在Session基础上开启一个事务 10 11 Catagory c = new Catagory(); 12 c.setName("分类1"); 13 s.save(c); //经过调用Session的save方法把对象保存到数据库 14 15 s.getTransaction().commit(); //提交事务 16 s.close(); //关闭Session 17 sf.close(); //关闭SessionFactory 18 } 19 20 }
一、对JDBC访问数据库的代码封装,大大简化了数据访问层繁琐的重复代码。
二、hibernate是轻量级框架,支持各类数据库,从一对一到一对多的各类复杂关系。
hibernate的缓存包括两大类:一级缓存(session缓存)和二级缓存(SessionFactory缓存)。
一级缓存:一级缓存是内置的,就是说只要你使用hibernate就必须使用session缓存。hibernate默认是开启一级缓存的。因为session对象的声明周期一般对应一个数据库事务或者一个应用事务,所以其缓存的缓存范围是事务。在一级缓存中,持久化类的每一个实例都具备惟一的OID(对象标识符)。
二级缓存:因为二级缓存对象的生命周期和应用程序的整个过程对应,所以hibernate二级缓存的缓存范围是进程或者集群,有可能出现并发问题,所以须要采起适当的并发访问策略,该策略为被缓存的数据提供了事务隔离级别。二级缓存是可选的,是一个可配置的插件,默认状况下不会启动。若要开启二级缓存,能够在hibernate.cfg.xml中开启二级缓存的配置,hibernate自己不提供二级缓存,都是使用第三方的二级缓存插件,可使用 EhCache提供的二级缓存。
应该放在二级缓存中的数据:
一、不多被修改的数据
二、不是很重要的数据,容许出现偶尔并发的数据
三、不会被并发访问的数据
四、常量数据
不适合放在二级缓存中的数据:
一、常常被修改的数据
二、不容许出现并发访问的数据
三、与其余应用共享的数据
一、使用双向一对多关联,不适用单向。
二、使用一对多取代一对一
三、配置对象缓存,不适用集合缓存
延迟加载 又叫 lazyload。
get是非延迟加载,不管后面的代码是否会访问到属性,立刻执行sql语句,对于不存在的对象返回null【处理对象是null,处理空对象的信息也会抛出异常】。
load是延迟加载,只有属性被访问到的时候,才会执行sql语句,对于不存在的对象会抛出异常。
属性的延迟加载:
当使用load方式来获取对象的时候,只有访问了这个对象的属性,hibernate才会到数据库中进行查询,不然不会访问数据库。
关系的延迟加载:
关系的延迟加载在one-many、many-many的时候均可以使用。
使用 session的createSQLQuery方法执行标准sql语句时,因为标准sql语句可能有多种返回结果,不能保证其查询结果能够装进一个Product对象中,因此返回的集合里的每个元素是一个对象数组。
1 String name = "iphone"; 2 String sql = "select * from product_ p where p.name like '%"+name+"%'"; 3 Query q = s.createSQLQuery(sql); 4 List<Object[]> list = q.list(); 5 for(Object[] os : list) { 6 for(Object o : os) { 7 System.out.print(o + "\t"); 8 } 9 System.out.println(); 10 }
使用hql查询数据时,根据hql建立一个Query对象,设置参数,(PreparedStatement:基1,Query:基0),经过Query对象的list()方法返回查询结果。
【注:使用hql时,使用的是类名,而不是表名】
【注:使用hql时,不须要在前面加select *】
1 String name = "iphone"; 2 Query q = s.createQuery("from Product p where p.name like ?"); 3 q.setString(0, "%"+name+"%"); 4 List<Product> ps = q.list(); 5 for(Product p : ps) { 6 System.out.println(p.getPrice()); 7 }
使用Criteria查询数据时,彻底面向对象,再也不有sql语句的痕迹。(Criteria还能够很方便的进行分页查询和获取总数)
经过session的creteCriteria建立一个Criteria对象,Criteria.add增长约束,调用list()方法返回查询结果的集合。
1 String name = "iphone"; 2 Criteria c = s.createCriteria(Product.class); 3 c.add(Restrictions.like("name", "%"+name+"%")); 4 List<Product> ps = c.list(); 5 for(Product p : ps) { 6 System.out.println(p.getPrice()); 7 }
使用Criteria分页查询数据时,不管你使用的是Oracle,Mysql,NoSQL仍是DB2,分页查询的代码写法都是同样的。
c.setFirstResult(2); 表示从第3条数据开始 。
c.setMaxResults(5); 表示一共查询5条数据。
1 String name = "iphone"; 2 Criteria c = s.createCriteria(Product.class); 3 c.add(Restrictions.like("name", "%" + name + "%")); 4 c.setFirstResult(2); 5 c.setMaxResults(5); 6 7 List<Product> pl = c.list(); 8 for(Product p : pl) { 9 System.out.println(p.getName()); 10 }
Hibernate有两种方式得到session,分别是:openSession和getCurrentSession
区别:一、获取的是不是同一个session对象
openSession每次都会获得一个新的Session对象 。
getCurrentSession在同一个线程中,每次都是获取相同的Session对象,可是在不一样的线程中获取的是不一样的Session对象 。
二、事务提交的必要性
openSession只有在增长,删除,修改的时候须要事务,查询时不须要的 。
getCurrentSession是全部操做都必须放在事务中进行,而且提交事务后,session就自动关闭,不可以再进行关闭。
创建数据库链接时比较消耗时间的,因此一般都会采用数据库链接池的技术来创建多条数据库链接,而且在未来持续使用,从而节约掉创建数据库链接的时间 。
hibernate自己是提供了数据库链接池的,可是hibernate官网也不推荐使用他自带的数据库链接池。 通常都会使用第三方的数据库链接池。C3P0是免费的第三方的数据库链接池,而且有不错的表现 。
【注:当运行次数不大的时候,从运行效果上来看,是看不出区别的。 只有在高并发量的状况下,才会体会出来。】
XML配置方式:
优:容易编辑,配置比较集中,方便修改,在大业务量的系统里面,经过xml配置会方便后人理解整个系统的架构,修改以后直接重启应用便可 。
缺:比较繁琐,配置形态丑陋, 配置文件过多的时候难以管理 。
注解方式:
优:方便,简洁,配置信息和 Java 代码放在一块儿,有助于加强程序的内聚性。
缺:分散到各个class文件中,因此不宜维护, 修改以后你须要从新打包,发布,重启应用。
总结:
=> 小项目,参与人数很少,不复杂的用注解,开发快速。
=>复杂项目,多人交互,配置量大,维护复杂度高的,用配置文件。