Hibernate是一个持久化,ORM框架。
持久化:瞬时状态和持久状态之间的转换机制。
Hibernate 使用步骤
1 导入本地jar包或者使用maven pom下载对应hiberante jar包。
2 封装实体类User(采用正向工程方式 实体类–表)
3 配置实体类映射文件 User.hbm.xml(开头与实体类名称一致)
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.sunsharing.htest.entity.User" table="t_user" schema="htest">
<id name="userId" column="user_id">
<generator class="native"></generator>
</id>
<property name="userName" column="user_name"/>
<property name="userPwd" column="user_pwd"/>
</class>
</hibernate-mapping>
4.配置Hibernate总配置文件
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">
<![CDATA[jdbc:mysql://localhost:3306/htest?useUnicode=true&characterEncoding=utf8]]>
</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">1234</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<mapping resource="com/sunsharing/htest/entity/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
5.编写测试类
import com.sunsharing.htest.entity.User;
import org.hibernate.SessionFactory;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistryBuilder;
public class Main {
public static void main(String[] args) {
//1 初始化配置文件,并读取里面的信息
Configuration config = new Configuration().configure();
//2 配置注册器 hibernate3 不需要配置注册器,而hibernate4则需要
ServiceRegistryBuilder srb = new ServiceRegistryBuilder().applySettings(config.getProperties());
//3 创建sessionfactory
SessionFactory sf = config.buildSessionFactory(srb.buildServiceRegistry());
//4 开启会话
Session session = sf.openSession();
//5 开启事务
Transaction tran = session.beginTransaction();
//6进行相关语句操作
try {
// User user = new User();
// user.setUserName("对对对");
// user.setUserPwd("111");
// session.save(user);
User user = (User)session.get(User.class,1);
System.out.print(user.getUserName() + " " + user.getUserPwd());
} catch (Exception e) {
//事务回滚
tran.rollback();
}
//7 提交事务
tran.commit();
//8 关闭会话
session.close();
}
}
对象三种状态:
瞬时状态(new 出来的对象)
持久状态(当前对象和数据库表的一行数据一致,且所在的session没有关闭)
游离(脱管)状态(当前对象和数据库表的一行数据一致,且所在的session关闭)
三种状态切换:
当对象是通过new方式构造出来的,那么此时该对象是瞬时状态对象,当调用save方法时,那么该对象由瞬时状态变成持久状态,当持久状态的对象调用delete方法后,该对象变成瞬时状态。当一个对象是由get或者load等方法获取得到,那么此时该对象就是持久状态的对象,当session关闭时,持久状态的对象都是脱管状态的对象。注意:瞬时状态和脱管状态是没有办法直接转换的。
JDBC和Hibernate区别
相同点:1 都是数据库操作的中间件
2 事务都需要显式提交
3 都需要关闭
不同点:1 JDBC采用sql,Hibernate采用HQL。
2 JDBC操作的是表,Hibernate操作的是实体类
3 JDBC操作的对象都是瞬时的,Hibernate操作的对象都是可持久化的。
持久化持久类需要注意的事项:
1、为类的持久化字段声明访问方法(get/set),Hibernate对JavaBeans风格的属性实行持久化。
2、实现一个默认的构造方法(无参的),这样的话Hibernate就可以使用Constructor.newInstance()方法来实例化对象。
3、如果是集合类型的属性,它的类型必须定义为集合的接口,例如:List、Set(不要定义成ArrayList)
4、提供一个标识属性(主键Identifier property),如果没有该属性,一些功能不起作用,比如:级联更新,session.saveOrUpdate()。
get和load的区别
1 get方法返回的是真实对象,load方法返回的是代理对象
2 当查询的数据id是没有数据对应的情况下,get返回的是空对象,load方法会抛出异常。
HQL特点
它是完全面向对象的查询语句,查询功能非常强大,具备继承、多态和关联等特性
HQL用面向对象的方式生成SQL
- 以类和属性来代替表和数据列
- 支持多态
- 支持各种关联
- 减少了SQL的冗余
HQL支持所有的关系数据库操作
- 连接(joins,包括Inner/outer/full joins),笛卡尔积(cartesian products)
- 投影
- 聚合和分组
- 排序
- 子查询
- SQL函数
主键生成器
1 native 本地化,意味着无论底层是哪种数据库,hibernate会自动选择最合适的方式实现主键的自增。任何数据库都能使用。
2 increment 在插入数据之前,先查询当前表的最大id,在+1后作为插入数据的主键,任何数据库都能使用。
3 Identity 要求底层数据库必须支持主键自增,比如Mysql和SQL Server数据库
4 sequence 要求底层数据库要支持采用序列方式生成id,比如Oracle和DB2 数据库
5 assigned 要求主键id必须是String类型的值,且该id的值由程序员自己录入。
6 uuid-hex 由计算机生成的128bit的字符串id。采用该主键自增策略的优点:保证多并发环境下id值都是唯一的,且有利于数据库的合并。
关系关联映射
多对一:
在实体类,多的一方的属性要有一的方法的类对象;
在多的实体类映射文件中配置many-to-one节点
<!-- 在该节点配置外键对象 -->
<many-to-one name="person_role" cascade="all" lazy="false" ></many-to-one>
需要通过提交多的一方进而影响一的方法,得通过配置cascade=all来实现。如果需要通过查询多的一方,顺便取出一的方法,得通过配置lazy=false来实现(如果是默认懒加载方式,那么会出现no session问题)
一对多:
在实体类,一的一方编写set集合存储多的一方
在一的实体类映射文件