一、Hibernate简介
1、什么是Hibernate?
Hibernate是数据持久层的一个轻量级框架。数据持久层的框架有很多比如:iBATIS,myBatis,Nhibernate,Siena等等。并且Hibernate是一个开源的orm(Object relations mapping)框架,提供了查询获取数据的方法,用面向对象的思想来操作数据库,节省了我们开发处理数据的时间。
2、Hibernate的优点
1)、使用简介的hql语句(Hibernate query language)。可以不使用传统的insert,update等sql语句。比如insert一个对象,原来的做法是:insert into 表名称 alue(值1,值2,值3,……),而现在的做法是:save(对象)。
2)、使用or映射。对象到关系数据库之间的映射。是从对象的角度操作数据库,再次体现了面向对象思想。原来的实体抽取方法:首先有了表,然后表映射实体对象。而现在Hibernate做法是:直接由对象映射到表。
3)、没有侵入性,移植性比较好。什么是没有侵入性?就是Hibernate采用了pojo对象。所谓的pojo对象就是没有继承Hibernate类或实现Hibernate接口。这样的话,此类就是一个普通的java类,所以移植性比较好。
4)、支持透明持久化。透明是针对上层而言的。三层架构的理念是上层对下层的依赖,只是依赖接口不依赖具体实现。而Hibernate中的透明是指对业务逻辑层提供了一个接口session,而其他的都封装隐藏。持久化是指把内存中的数据存放到磁盘上的文件中。
3、当然一个事物,不可能十全十美,即使如此优秀的Hibernate也有自己的弱点。比如:若是大量数据批量操作。则不适合使用Hibernate。并且一个持久化对象不能映射到多张表中。
4、Hibernate中5个核心接口
1)、Configuration接口:负责配置及启动Hibernate,用来创建sessionFactory
2)、SessionFactory接口:一个SessionFactory对应一个数据源存储,也就是一个数据库对应一个SessionFactory。SessionFactory用来创建Session对象。并且SessionFactory是线程安全的,可以由多个线程访问SessionFactory共享。
3)、Session接口:这个接口是Hibernate中常用的接口,主要用于对数据的操作(增删改查)。而这个Session对象不是线程安全的。不能共享。
4)、Query接口:用于数据库的查询对象。
5)、Transaction接口:Hibernate事务接口。它封装了底层的事务操作,比如JTA(;java transcation architecture)所有的数据操作,比如增删改查都写在事务中。
其实hibernate和mybatis很相似只是hibernate是全封装、开发效率高、但是对于sql的优化不如mybatis对sql的优化。mybatis是半封装,开发效率相对hibernate要低些,但是正因为它是半封装,所以sql优化很灵活。两者都有各自的优点,要看自己项目的需要,接下来一步步将hibernate搭建。
首先新建含有maven工程的包
在maven里面有个pom.xml的文件,这个文件可以将maven仓库里的包下载到我们的工程里面
与mybatis一样七大步骤:三拷三配六准备
三拷(去maven仓库里下载相应的包,也可以复制我的)
一拷:拷jdbc驱动
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
二拷:拷mysql
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
三拷:拷hibernate-core包
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.4.0.Final</version>
</dependency>
如果要整合spring可以将相应的包拷到pom.xml里面
三配
一配:配置pojo文件
package com.pojo;
import java.io.Serializable;
public class Student implements Serializable{
private int id;//学号
private String name;//姓名
/**
* @return the id
*/
public int getId() {I
return id;
}
/**
* @param id the id to set
*/
public void setId(int id) {
this.id = id;
}
/**
* @return the name
*/
public String getName() {
return Name;
}
/**
* @param name the name to set
*/
public void setName(String name) {
this.name = name;
}
}
二配:配置hibernate的映射文件(与mybatis的映射文件不一样,hibernate的映射文件命名是 :表名小写.hbm.xml(student.hbm.xml))
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.mapper.Student" table="student">
<!-- 主键 -->
<id name="id" column="id">
<generator class="native"></generator>
</id>
<!-- 其他字段 -->
<property name="name" column="name" length="10" ></property>
</class>
</hibernate-mapping>
三配:配置hibernate总的配置文件 (文件名为:hibernate.cfg.xml)
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="connection.url">jdbc:mysql://127.0.0.1:3306/数据库名</property>
<property name="connection.username">mysql用户名</property>
<property name="connection.password">mysql密码</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<property name="myeclipse.connection.profile">MySQL</property>
<mapping resource="com/mapper/student.hbm.xml" />
</session-factory>
</hibernate-configuration>
如果想要测试hibernate有没有搭建好,可以写一个测试类hibernate5.4的版和老版本根据配置生成表完全不一样然后可以打开数据看看是不是有新的表入,同时字段与你的pojo文件的属性名是否一致。如果是的那就hibernate环境搭建成功
package com.test;
import java.util.EnumSet;
import org.hibernate.boot.Metadata;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.tool.hbm2ddl.SchemaExport;
import org.hibernate.tool.schema.TargetType;
public class 添加表 {
public static void main(String[] args) {
ServiceRegistry registry = new StandardServiceRegistryBuilder().configure().build();
Metadata metadata = new MetadataSources(registry).buildMetadata();
SchemaExport export = new SchemaExport();
export.create(EnumSet.of(TargetType.DATABASE), metadata);
}
}