1、对象化。hibernate可以让开发人员以面相对象的思想来操作数据库。jdbc只能通过SQL语句将元数据传送给数据库,进行数据操作。而hibernate可以在底层对元数据和对象进行转化,使得开发者只用面向对象的方式来存取数据即可。
2、更好的移植性。hibernate使用xml或JPA的配置以及数据库方言等等的机制,使得hibernate具有更好的移植性,对于不同的数据库,开发者只需要使用相同的数据操作即可,无需关心数据库之间的差异。而直接使用JDBC就不得不考虑数据库差异的问题。
3、开发效率高。hibernate提供了大量的封装(这也是它最大的缺点),很多数据操作以及关联关系等都被封装的很好,开发者不需写大量的sql语句,这就极大的提高了开发者的开发效率。
4、缓存机制的使用。hibernate提供了缓存机制(session缓存,二级缓存,查询缓存),对于那些改动不大且经常使用的数据,可以将它们放到缓存中,不必在每次使用时都去查询数据库,缓存机制对提升性能大有裨益。
1、由于对持久层封装过于完整,导致开发人员无法对SQL进行优化,无法灵活使用JDBC的原生SQL,Hibernate封装了JDBC,所以没有JDBC直接访问数据库效率高。要使用数据库的特定优化机制的时候,不适合用Hibernate
2、框架中使用ORM原则,导致配置过于复杂,一旦遇到大型项目,比如300张表以上,配置文件和内容是非常庞大的,另外,DTO满天飞,性能和维护问题随之而来
3、如果项目中各个表中关系复杂,表之间的关系很多,在很多地方把lazy都设置false,会导致数据查询和加载很慢,尤其是级联查询的时候。
4、Hibernate在批量数据处理时有弱势,对于批量的修改,删除,不适合用Hibernate,这也是ORM框架的弱点
本例演示使用hibernate添加一条数据到表Product
如图:
步骤1:
准备数据库步骤3:
导入jar包步骤4:
创建实体类及实体类映射,直接上代码。
实体类:
1 package com.day01.pojo; 2 3 public class Product { 4 private int id; 5 private String pName; 6 private double price; 7 public int getId() { 8 return id; 9 } 10 public void setId(int id) { 11 this.id = id; 12 } 13 public String getpName() { 14 return pName; 15 } 16 public void setpName(String pName) { 17 this.pName = pName; 18 } 19 public double getPrice() { 20 return price; 21 } 22 public void setPrice(double price) { 23 this.price = price; 24 } 25 26 }
实体类映射:
命名:类名.hbm.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE hibernate-mapping PUBLIC 3 "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 4 "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 5 <hibernate-mapping package="com.day01.pojo"> 6 <class name="Product" table="Product"> 7 <id name="id" column="id"><!-- 映射主键 name:属性名 column:表中字段名 --> 8 <generator class="native"></generator> 9 </id> 10 <property name="pName"></property><!-- 只指定name表示属性名和字段名保持一致 --> 11 <property name="price"></property> 12 </class> 13 </hibernate-mapping>
步骤5:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE hibernate-configuration PUBLIC 3 "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 4 "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> 5 <hibernate-configuration> 6 <session-factory> 7 <!-- 数据库连接配置 --> 8 <property name="connection.driver_class"> 9 com.mysql.jdbc.Driver 10 </property> 11 <property name="connection.url"> 12 jdbc:mysql://localhost:3306/test?characterEncoding=UTF-8 13 </property> 14 <property name="connection.username">root</property> 15 <property name="connection.password">root</property> 16 <!-- 设置数据库方言 就是告诉hibernate使用的是什么数据库 --> 17 <property name="dialect">org.hibernate.dialect.MySQLDialect</property> 18 <!-- 是否显示sql语句 --> 19 <property name="show_sql">true</property> 20 <!-- 是否显示sql语句 --> 21 <property name="sql_format">true</property> 22 <!-- 设置事务管理方式 即每个线程一个事务 --> 23 <property name="current_session_context_class">thread</property> 24 <!-- hbm2ddl.auto: 生成表结构的策略配置 25 update(最常用的取值): 如果当前数据库中不存在表结构,那么自动创建表结构. 26 如果存在表结构,并且表结构与实体一致,那么不做修改 27 如果存在表结构,并且表结构与实体不一致,那么会修改表结构.会保留原有列. 28 create(很少):无论是否存在表结构.每次启动Hibernate都会重新创建表结构.(数据会丢失) 29 create-drop(极少): 无论是否存在表结构.每次启动Hibernate都会重新创建表结构.每次Hibernate运行结束时,删除表结构. 30 validate(很少):不会自动创建表结构.也不会自动维护表结构.Hibernate只校验表结构. 如果表结构不一致将会抛出异常. 31 --> 32 <property name="hbm2ddl.auto">update</property> 33 <!-- 映射实体 Product--> 34 <mapping resource="com/day01/pojo/Product.hbm.xml" /> 35 </session-factory> 36 </hibernate-configuration>
步骤6:
编写测试类代码
1 package com.day01.test; 2 3 import org.hibernate.Session; 4 import org.hibernate.SessionFactory; 5 import org.hibernate.cfg.Configuration; 6 import org.hibernate.service.ServiceRegistry; 7 import org.hibernate.service.ServiceRegistryBuilder; 8 import com.day01.pojo.Product; 9 10 public class Test { 11 public static void main(String[] args) { 12 //创建配置对象 13 Configuration cfg=new Configuration().configure();//默认加载hibernate.cfg.xml 14 //若不以hibernate.cfg.xml命名 则需为configure()指定参数:如 configure("myhibernate.cfg.xml") 15 //创建服务注册类 进一步加载配置文件 16 ServiceRegistry sr=new ServiceRegistryBuilder().applySettings(cfg.getProperties()).buildServiceRegistry(); 17 //创建会话工厂 18 SessionFactory sf=cfg.buildSessionFactory(sr); 19 //获取会话对象 20 Session session=sf.openSession(); 21 //开始事务 22 session.beginTransaction(); 23 //创建一个商品实例 24 Product p=new Product(); 25 p.setpName("电视"); 26 p.setPrice(5000.00); 27 //将实例p保存到数据库 28 session.save(p); 29 //提交事务 30 session.getTransaction().commit(); 31 //关闭资源 32 session.close(); 33 sf.close(); 34 } 35 36 }
原文:http://www.cnblogs.com/UnwillingToMediocrity/p/7867656.html