Hibernate:hibernate是一个标准的ORM框架,不需要写sql语句,维护关系比较复杂,sql语句自动生成,对sql语句优化,修改比较困难。
Hibernate的优缺点:
优点:面向对象开发,不需要自己写sql语句。如果进行数据库迁移不需要修改sql语句,只需要修改一下方言。
缺点:hibernate维护数据表关系比较复杂。完全是有hibernate来管理数据表的关系,对于我们来说完全是透明的,不易维护。
Hibernate自动生成sql语句,生成sql语句比较复杂,比较难挑错。
Hibernate由于是面向对象开发,不能开发比较复杂的业务。
应用场景:
适合需求变化较少的项目,比如ERP,CRM等等
Mybatis框架对jdbc框架进行封装,屏蔽了jdbc的缺点,开发简单。
Mybatis只需要程序员关注sql本身,不需要过多的关注业务。对sql的优化,修改比较容易
适应场景:
适合需求变化多端的项目,比如:互联网项目
mybatis与hibernate重要区别
企业开发进行技术选型 ,考虑mybatis与hibernate适用场景。
mybatis:入门简单,程序容易上手开发,节省开发成本 。mybatis需要程序员自己编写sql语句,是一个不完全 的ORM框架,对sql修改和优化非常容易实现 。
mybatis适合开发需求变更频繁的系统,比如:互联网项目。
hibernate:入门门槛高,如果用hibernate写出高性能的程序不容易实现。hibernate不用写sql语句,是一个 ORM框架。
hibernate适合需求固定,对象数据模型稳定,中小型项目,比如:企业OA系统
Hibernate 框架简介
一、什么是 Hibernate?
Hibernate 是一个基于元数据的轻量级的 ORM 框架:
1、元数据(Meta Data):data about data(数据的数据),也就是说描述一个对象数据,相当于这个对象的上下文环境。
2、轻量级:占用资源少,没有侵入性。(其实我认为这只是相对而言,如果和 Ibatis 相比,它到成重量级的了)。
3、ORM:(Object Relation Mapping)对象关系数据库的映射这是 Hibernate 框架的重点,也就是说将我们程序中的实体(bean,这里也叫 POJO)和数据库中的表进行映射。java 类型和 sql类型映射,面向对象设计和关系型数据库设计的映射,从而我们只需要将更多的精力放到业务中,而不是 sql 数据库方面。
4、POJO:(Plain Ordinary Java Object),无格式的普通 java 对象,也就是上边说的实体,和数据库做映射的简单类。只是在这里提出了一个新的名词而已。
总而言之,Hibernate 就是将我们的数据库表和程序的 POJO 类进行映射,数据的操作进行了封装,使我们不用把数据库弄得非常精通,我们会面向对象编程就可以了,这样大大提高了我们的编程效率,而且对个人的知识要求也降低了。
ORM 实现了数据表到 Java 对象的映射,这正是 ORM 的作用
四、持久层概念
ORM 是通过使用描述对象和数据库之间映射的元数据,将 Java 程序中的对象自动持久化到关系数据库中。由此便引入了以下两个新概念:
(1)持久化:就是对数据和程序状态的保持。大多数情况下特别是企业级应用,数据持久化往往也就意味将内存中的数据保存到磁盘上加以固化,而持久化的实现过程则大多通过各种关系数据库来完成。
(2)持久层:把数据库实现当做一个独立逻辑拿出来,即数据库程序是在内存中的,为了使程序运行结束后状态得以保存,就要保存到数据库。持久层是在系统逻辑层面上,专致于实现数据持久化的一个相对独立的领域。持久层的目的是通过持久层的框架将数据库存储服务从服务层中分离出来,而 Hibernate 是目前最流行的持久层框架。
五、具体开发步骤:
1、在Eclipse中配置开发环境:
(1)安装Hibernate插件:
A、下载Hibernate插件,采用link方式安装
(2)添加XML约束文件
2、新建Maven工程,导入Hibernate的核心jar包、支持C3P0数据库连接池的jar包:
c3p0-0.9.5.2.jar
hibernate-c3p0-5.2.17.Final.jar
<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.2.17.Final</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-c3p0 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-c3p0</artifactId>
<version>5.2.17.Final</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.mchange/c3p0 -->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.2</version>
</dependency>
2、创建Hibernate配置文件:
<session-factory>
<!-- 配置C3P0 -->
<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider
</property>
<property name="hibernate.c3p0.max_size">20</property>
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.timeout">120</property>
<!--1 配置Oracle数据库的方言 -->
<property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property>
<!--2、配置驱动 -->
<property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<!--3、配置连接字符串 -->
<property name="hibernate.connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>
<!--4、配置用户名、密码 -->
<property name="hibernate.connection.username">scott</property>
<property name="hibernate.connection.password">root</property>
<!--5、配置是否是否在控制台打印sql语句-->
<property name="hibernate.show_sql">true</property>
<!--6、是否格式化sql语句 -->
<property name="hibernate.format_sql">true</property>
<!--7、是否自动生成数据表 -->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 配置POJO类的映射文件 -->
<mapping resource="com/cn/pojo/Product.hbm.xml"/>
</session-factory>
2、创建持久化类:
public class Product {
private Integer p_id;
private String p_name;
private Double p_price;
private String p_phone;
private String p_address;
......//省去set/get方法
}
3、创建对象-关系映射文件:
<hibernate-mapping>
<class name="com.cn.pojo.Product" table="TB_PRODUCT">
<id name="p_id" type="java.lang.Integer">
<column name="P_ID" />
<generator class="sequence">
<param name="sequence">TB_PRODUCT_SEQ</param>
</generator>
</id>
<property name="p_name" type="java.lang.String">
<column name="P_NAME" />
</property>
<property name="p_price" type="java.lang.Double">
<column name="P_PRICE" />
</property>
<property name="p_phone" type="java.lang.String">
<column name="P_PHONE" />
</property>
<property name="p_address" type="java.lang.String">
<column name="P_ADDRESS" />
</property>
</class>
</hibernate-mapping>
4、在Hibernate配置文件中加入映射文件:
<mapping resource="com/pojo/Product.hbm.xml"/>
5、通过Hibernate API 编写访问数据库的代码:
//1.创建Configuration对象,并调用configure()方法从默认路径加载hibernate.cfg.xml文件
Configuration config = new Configuration().configure();
//2.获取SessionFactory类实例(相当于JDBC中的工厂类)
SessionFactory sessionFactory = config.buildSessionFactory();
//3.获取Session实例(相当于JDBC中的Connection对象)
Session session = sessionFactory.openSession();
//4.开启事务
Transaction ts = session.beginTransaction();
//5.封装数据
Product pro = new Product();
pro.setP_name("钢笔");
pro.setP_price(12.55);
pro.setP_phone("02985368888");
pro.setP_address("咸阳");
//6.执行保存操作
session.save(pro);
//7.提交事务
ts.commit();
session.close();
注意:
1)4.0以前的版本使用,现在已经废弃;
sessionFactory = configuration.buildSessionFactory();
2)创建一个ServiceRegistry对象:hibernate4.x以后新添加的对象,hibernate的任何配置对象和服务都必须在该对象中注册了才能使用
//Hibernate4.2之前版本的写法:
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties())
.buildServiceRegistry();
//Hibernate4.3之后版本的写法:
ServiceRegistry serviceRegistry =
new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();
sessionFactory = configuration.buildSessionFactory(serviceRegistry);