一、什么是Hibernate
Hibernate是一种ORM框架,全称为Object Relational Mapping,在Java对象与关系数据库之间建立某种映射,以实现直接存取Java对象!(MVC中的数据持久层->编写Dao层)
ORM思想:
二、Hibernate的作用:
通过配置文件(xml)或注解,使POJO和数据表中的字段存在映射关系,让Hibernate框架自动生成SQL语句
POJO:Plain Ordinary Java Object,简单的Java对象,有一些private的参数作为对象的属性。然后针对每个参数定义了get和set方法作为访问的接口
三、导入Hibernate的jar
使用maven导入jar包(如果hibernate的jar包含了连接数据库的驱动包,则不需要外引)
通过hibernate官网下载:http://hibernate.org/orm/releases/ 下载hibernate.final文件,hibernate.cfg.xml也在该文件里
四、实现POJO类到数据库表的映射关系
mvnproject结构:
1、通过xx.hbm.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<hibernate-mapping>
<class name="test.User" table="hbn_user" ><!---映射对应的类,设定其在数据库中的表名->
<id name="id" type="java.lang.Integer" >
<!--主键生成策略-->
<generator class="native"></generator>
</id>
<!--name是POJO类的属性名,column是数据库表中的字段名,默认和属性名一致,hibernate会补全type-->
<property name="name" type="java.lang.String" column="name" length="10"/>
<!--表的属性排列顺序受当前声明顺序影响-->
</class>
</hibernate-mapping>
test.User.java
package test;
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;
}
}
主键生成策略:
- increment:代理主键自增,由hibernate框架完成 , 原理 select max(id) , +1 作为新插入记录的id
优点: 跨数据库 ,与数据库无关
缺点: 存在线程问题
注:生成数据表,内部没有对 id 自增,自增完全由Hibernate框架实现,如果数据库也设立了主键自增就会发生冲突 - identity:由底层数据库来管理生成,不由hibernate管理,
注:mysql 和sql server可以,oracle不可以 - sequence:使用底层数据库序列机制,不由hibernate管理
注:mysql不支持序列, oracle支持 - native:由底层数据库自己来决定使用什么策略,不由hibernate管理
注:mysql — identity , oracle — sequence - uuid ,采用随机32位字符串作为数据表主键值
- assigned 自然主键,需要在程序指定设置主键的列的值
复合主键 (联合主键), 是一种特殊的自然主键, 定义Person 类数据 由 firstname和secondname 共同作为主键
注:使用复合主键,PO类必须实现 java.io.Serializable 接口
主键分自然主键和代理主键
- 自然主键:在业务中有具体意义的主键,最后一种
- 代理主键,上面的前6个都属,没有具体意义,只是标识主键是唯一的。
2、通过注解annotation
package test;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Table
@Entity(name="hbn_book")
public class Book {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY) //主键自增策略
//@GenericGenerator(name="myGenerator",strategy="uuid") //主键生成器
//@GeneratedValue(generator="myGenerator") //使用生成器
private int id;
@Column(unique=true,length=20)
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;
}
}
@GeneratedValue指定了标识符的生成策略。JPA提供了4种标准用法。
(1)AUTO:根据不同的数据库选择不同的策略。
(2)TABLE:使用表保存id值。
(3)INDENTITY:使用数据库自动生成主键(主要是自动增长类型,如MySql、SQLServer)
(4)SEQUENCE:使用序列创建主键(如Oracle)生成表后数据库会多一张SEQUENCE表。
五、hibernate的配置,hibernate.cfg.xml(放置位置很重要/src/main/resources)
有了xx.hbm.xml这个映射文件还不够,因为hibernate需要连接数据库,hibernate.cfg.xml就是这种公共的配置文件,加载数据库连接的信息,和将各种映射文件加载进来,因为有很多映射文件,每个映射文件都需要连接数据库等操作,所以就将共同的操作提取出来形成了hibernate.cfg.xml。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory><!-- jdbcurl必须设置时区serverTimezone=GMT%2B8 -->
<!-- 连接数据库及hibernate的方言配置 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/testconn?serverTimezone=GMT%2B8</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property><!-- 在该包下还有其他的Dialect -->
<!-- 连接池的信息,非必要 -->
<!-- hibernate的其他配置 -->
<property name="hibernate.show_sql">true</property><!--在控制台中打印sql语句 -->
<property name="hibernate.format_sql">true</property><!-- 打印前格式化sql一句 -->
<!-- ddl策略 -->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 设置是否自动提交事务 -->
<property name="hibernate.connection.autoconmmit">false</property>
<!-- 导入映射文件xml -->
<mapping resource="test/User_hbm.xml"/>
<!-- 注解@通过包下的类寻找注解 -->
<mapping class="test.Book"/>
</session-factory>
</hibernate-configuration>
hbm2ddl.auto: 生成表结构的策略配置
- update(最常用的取值): 如果当前数据库中不存在表结构,那么自动创建表结构. 如果存在表结构,并且表结构与实体一致,那么不做修改,如果存在表结构,并且表结构与实体不一致,那么会修改表结构.会保留原有列.
- create(很少):无论是否存在表结构.每次启动Hibernate都会重新创建表结构.(数据会丢失)
- create-drop(极少): 无论是否存在表结构.每次启动Hibernate都会重新创建表结构.每次Hibernate运行结束时,删除表结构.
- validate(很少):不会自动创建表结构.也不会自动维护表结构.Hibernate只校验表结构. 如果表结构不一致将会抛出异常.
六、使用hibernate的功能
package testall;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import test.Book;
import test.User;
public class testcfg {
public static void main(String[] args) {
//1、加载classpath下的hibernate.cfg.xml配置文件
Configuration configure = new Configuration().configure();
//2、创建会话连接工厂
SessionFactory sessionFactory = configure.buildSessionFactory();
//3、创建session
Session session = sessionFactory.openSession();
//4、开启事务
Transaction transaction = session.beginTransaction();
User user = new User();
user.setName("Waylon");
Book book = new Book();
book.setName("Test");
session.save(user);
session.save(book);
//5、提交事务
transaction.commit();
//6、关闭连接
session.close();
sessionFactory.close();
}
}
Console部分截图:
通过Navicat查看数据库的变化