Hibernate的概述
是一个标准ORM框架
操作对象就相当于操作表结构
通过映射文件吧对象与表关联到一起
对jdbc的一个封装
优点:简化了jdbc的繁琐代码
对面向对象特性的良好支持
缺点:不支持动态sql,灵活性较低
不适合大规模的数据处理
Hibernate 开发环境搭建
1.导入jar包 lib下required包下的所有jar包,还有log4j.jar及数据库连接
project-etc下找约束
配置映射文件User.hbm.xml
a.列名子标签形式存在
b.列名可以不写,默认和实体类名字段一样
c.type可以不写,默认和实体字段属性一致
主键生成策略:native(根据本地数据支持主键生成方式)
uuid(根据uuid算法生成一个32位16进制的字符串,推荐使用,使用此算法,主键必须为字符串)
<?xml version="1.0" encoding="UTF-8"?>
<!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.hemi.bean.User" table="tb_user">
<id name="id" column="id">
<generator class="native"></generator></id>
<property name="name" column="name"></property>
<property name="age" column="age"></property>
</class>
</hibernate-mapping>
主配置文件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>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql:///bank</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password"></property>
<!-- 配置方言 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 选配 -->
<!-- 自动生成表 -->
<property name="hbm2ddl.auto">update</property>
<!--显示hibernate执行的sql语句 -->
<property name="show_sql">true</property>
<!-- 格式化sql输出 -->
<property name="format_sql">true</property>
<!-- 引入映射文件 -->
<mapping resource="com/hemi/bean/User.hbm.xml" />
</session-factory>
</hibernate-configuration>
测试类
Configuration con=new Configuration();
con.configure();//加载配置文件
SessionFactory factory = con.buildSessionFactory();//得到 SessionFactory对象
System.out.println(factory);
crud操作
a.得到工厂对象
b.打开session
c.开启事物
d.crud操作
e.提交事务
f.关闭资源
快照机制
从数据库查询出的额数据会在缓存和快照区各一个 当调用flush或者close方法刷新缓存,来和快照区数据比对,有更新就推入数据库
对象的三种状态
a.瞬时态 (1)new出来的,不和 Session 实例关联(2) 在数据库中没有和瞬时对象关联的记录
b.持久态 瞬时对象转为持久对象:
(1) 通过 Session 的 save() 和 saveOrUpdate() 方法把一个瞬时对象与数据库相关联,这个瞬时对象就成为持久化对象。
(2) 使用get(),load() 待方法查询到的数据对象,将成为持久化对象。
持久化对象的特点:
(1) 和 Session 实例关联
(2) 在数据库中有和持久对象关联的记录
c.游离态:数据库有记录,但是脱离了session,缓存中没有
- 本质上和瞬时对象相同
(2) 只是比瞬时对象多了一个数据库记录标识值 id.
持久对象转为游离对象:
当执行 close() 或 clear(),evict() 之后,持久对象会变为游离对象。
瞬时对象转为持久对象:
通过 Session 的 update(),saveOrUpdate() 和 lock() 等方法,把游离对象变为持久对象。
要先查后改
修改方法:
1.update
2.saveOrUpdate
当没设置存入数据的主键时执行save
设置了就执行update,主键在数据库找不到时,就会报状态异常
3.merge
当没有主键时,执行插入,当有主键时,先查询,判断是否存在,存在就修改,不存在就执行插入
瞬时态的数据被merge操作后变成游离态,返回的数据为持久态
查询方法
Session session = HibernateUtil.getsession();
Transaction transaction = session.beginTransaction();
User user = new User();
user.setAge(208);
user.setName("ewjj");
User user2 = session.get(User.class, 5);
//一发送就执行sql语句
User load = session.load(User.class, 1);
//使用结果时,才执行sql语句,推荐
session.saveOrUpdate(user);
transaction.commit();
session.close();
Configuration con = new Configuration();
con.configure();// 加载配置文件
SessionFactory factory = con.buildSessionFactory();// 得到
// SessionFactory对象
System.out.println(factory);
Session session = factory.openSession();
Transaction transaction = session.beginTransaction();
User user = new User();
try {
user.setAge(20);
user.setName("ew");
session.save(user);
transaction.commit();
} catch (Exception e) {
if (transaction != null) {
transaction.rollback();
}
} finally {
session.close();
}
工具类
private HibernateUtil() {
}
static SessionFactory factory;
static {
Configuration con = new Configuration();
factory = con.configure().buildSessionFactory();
}
public static Session getsession(){
return factory.openSession();
}
```
网友评论