Java Web框架之Hibernate
1. Hibernate的定义:
Hibernate是一个基于JDBC的开源的持久化框架,是一个优秀的ORM实现,它很大程度的简化了DAO层编码工作。Hibernate 对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。
在分层结构中处于持久化层,封装对数据库的访问细节,使业务逻辑层更专注于实现业务逻辑。
2. Hibernate的开发步骤:
1.创建持久化类
2.创建对象-关系映射(ROM)文件
3.创建Hibernate配置文件
4.通过Hibernate API编写访问数据库的代码
1.创建持久化类:
/**
* 实体
*/
public class User {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "[User: id=" + id + ", name=" + name + "]";
}
}
2. 创建对象-关系映射文件*.hbm.xml:
(Hibernate之所以能够智能地判断实体类和数据表之间的对象关系,就是因为有映射文件)
<hibernate-mapping>
<!-- 实体类class和数据库表table的映射 -->
<class name="com.ljh.hibernate.pojo.User" table="t_user">
<!--
id标签用来映射主键字段
name属性表示类的属性
column属性表示表的字段
-->
<id name="usercode" column="usercode" length="20">
<!-- 主键生成策略
native 表示根据连接数据库的表的主键生成方式来生成主键值
mysql数据采用的auto_increment属性来生成主键值,一般主键字 段需要设置的类型为int
assigned 表示主键由用户自己维护。
-->
<generator class="assigned"/>
</id>
<!-- 普通属性的映射
name 表示类中的属性名称
column 表示表中的列名称
column属性不指定会采用默认的值,默认名称与属性名称一致
length 表示属性的字符长度
not-null 表示属性值不能为null
-->
<property name="userpswd" column="userpswd" type="java.lang.String" length="20" not-null="true"/>
<property name="username" />
<property name="regdate" length="19"/>
<property name="orgtype" length="1"/>
</class>
</hibernate-mapping>
3. 创建Hibernate配置文件hibernate.cfg.xml:(在src目录下)
<hibernate-configuration>
<session-factory name="foo">
<!-- 1. 配置数据库信息 -->
<!-- 方言(连接的数据库类型) -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="connection.url">jdbc:mysql:///hibernate_20160926</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.username">root</property>
<property name="connection.password">yezi</property>
<!-- 2. 其他配置 -->
<!-- 显示生成的SQL语句 -->
<property name="hibernate.show_sql">true</property>
<!-- 3. 导入映射文件 -->
<mapping resource="cn/itcast/a_helloworld/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
4. 通过Hibernate API编写访问数据库的代码:
编程步骤:
- 获取Configuration对象。
- 获取SessionFactory对象。
- 获取Session,打开事务(Hibernate对JDBC进行了一种包装,提供了另外一套API来操作数据,其中与数据直接打交道的是Session,它是Hibernate的一级缓存,保持着应用程序与数据库之间的连接,通过它保持内存与数据库之间的数据同步。)
- 用面向对象的方式操作数据库。
- 关闭事务,关闭Session。
public class App {
private static SessionFactory sessionFactory;
static {
Configuration cfg = new Configuration();
cfg.configure("hibernate.cfg.xml"); // 读取指定的主配置文件
sessionFactory = cfg.buildSessionFactory(); // 根据配置生成Session工厂
}
@Test
public void testSave() {
User user = new User();
user.setName("张三");
// 保存
Session session = sessionFactory.openSession(); // 打开一个新的Session
Transaction tx = session.beginTransaction(); // 开启事务
session.save(user);
tx.commit(); // 提交事务
session.close(); // 关闭Session,释放资源(不一定是真正的关闭)
}
@Test
public void testGet() {
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
User user = (User) session.get(User.class, 1); // 获取?
System.out.println(user);
tx.commit();
session.close();
}
}
注意:Session的管理,Spring会帮助关闭的
这样一看我们的方法写的代码也是挺多了,想说的是这里只是写出了Hibernate框架是从创建sessionFactory对象,然后创建session对象,通过session对象进行对数据库的操作。其实真正的开发中,我们会把这些对象,事务的操作交给框架来管理,我们需要做的就是持久化操作的那些代码,是非常少的。
5. Hibernate的优点、缺点:
优点:
- 轻量级的ORM框架
- 对JDBC进行很好的封装,使用ORM映射,可以通过面向对象的方式操作数据库
- 提供了缓存机制,可以提高效率
缺点:如果对大量的数据进行频繁的操作,性能效率低,不如直接使用JDBC。
6. ORM(object Relation Mapping)对象关系数据库的映射:
这是Hibernate框架的重点,也就是说我们程序中的实体(bean,这里也叫POJO)和数据库中的表进行映射。Java类型和sql类型映射,面向对象设计和关系型数据库设计的映射,从而我们只需要把更多的精力放在业务中。
7. MyBatis和Hibernate的区别:
1、Hibernate 是一个标准的ORM框架(对象关系映射框架),不需要程序写sql,sql语句自动生成,对sql语句进行优化、修改 比较困难。全自动的、完全面向对象的持久层框架。
2、MyBatis专注于sql本身,需要程序员自己编写sql语句,sql修改、优化比较方便。是一个不完全的ORM框架,虽然程序员自 己写sql,MyBatis也可以实现映射(输入映射,输出映射)半自动化的持久层框架。
3、Hibernate的DAO层开发比MyBatis简单,Mybatis需要维护sql和结果映射。
4、Hibernate对对象的维护和缓存要比MyBatis好,对增删改查的对象的维护要方便。
5、Hibernate数据库移植性很好,MyBatis的数据库移植性不好,不同的数据库需要写不同sql。
6、Hibernate有更好的二级缓存机制,可以使用第三方缓存。MyBatis本身提供的缓存机制不佳。
7、MyBatis可以进行更为细致的SQL优化,可以减少查询字段。