hibernate简介
是一个开放源代码的对象关系映射框架,它对jdbc进行了封装,提供了强大、高性能的对象关系型数据库的持久化服务。
hibernate是能够实现ORM的框架,是一个优秀的java持久化解决方案,是当今主流的对象-关系映射ORM工具。
理解持久化
瞬时状态:在程序运行的时候,有些程序数据被保存在内存中,当程序退出的时候,这些数据就不复存在了,这些数据的状态称为瞬时状态
持久状态:在使用一些软件的时候,有些数据在程序退出后,以文件或其他形式保存在了硬盘中,这些数据的状态称为持久状态。
持久化:就是将程序中数据的瞬时状态与持久化状态之间转换的机制。如将数据保存在文件或者数据库中以及从数据库中读取出来。
ORM对象-关系映射
能在对象和关系型数据库之间进行数据转换的机制。如将关系型数据库中的表转换为面向对象编程的对象。
在eclipse中配置hibernate
1下载和导入jar包加载hibernate类库和依赖库
2 配置hibernate配置文件hibernate.cfg.xml:指定数据库连接信息和及其映射文件路径。
<hibernate-configuration> <session-factory> <!-- 数据库方言 --> <property name="dialect"> org.hibernate.dialect.Oracle9Dialect </property> <!-- 数据库URL --> <property name="connection.url"> jdbc:oracle:thin:@localhost:1521:MYORCL </property> <!-- 数据库用户名 --> <property name="connection.username">accp</property> <!-- 数据库密码 --> <property name="connection.password">accp</property> <!-- 数据库JDBC驱动 --> <property name="connection.driver_class"> oracle.jdbc.driver.OracleDriver </property> <property name="myeclipse.connection.profile">hjj</property> <!-- 表示是否 将运行期生成的sql输出到日志以供调试--> <property name="show_sql">true</property> <!-- 格式化输出sql --> <property name="format_sql">true</property> <!-- 与之对应的实体类配置文件 --> <mapping resource="entity/NewsUser.hbm.xml" /> </session-factory> </hibernate-configuration>
3。创建持久化类和映射文件。
<hibernate-mapping> <class name="entity.NewsUser" table="NEWS_USER" schema="ACCP"> <id name="id" type="java.lang.Integer"> <column name="ID" precision="10" scale="0" /> <generator class="assigned" /> </id> <property name="username" type="java.lang.String"> <column name="USERNAME" length="20" not-null="true" /> </property> <property name="password" type="java.lang.String"> <column name="PASSWORD" length="20" not-null="true" /> </property> <property name="email" type="java.lang.String"> <column name="EMAIL" length="100" /> </property> <property name="USERTYPE" type="java.lang.Integer"> <column name="USERTYPE" precision="5" scale="0" not-null="true" /> </property> </class> </hibernate-mapping>
4。创建hibernate连接工具类:hibernate主要接口和类。
在hibernate中执行持久化操作步骤(增删改)
1、读取并解析配置文件
Configuration config=new Configuration().configure();
2、读取并解析映射信息,创建SessionFactory:
SessionFactory factory=config.buildSessionFcatory();
3、打开session:
this.session=factory.openSession();
4、开始一个事务(增删改必须开启事务):
tran=session.beginTransaction();
5、持久化操作:
保存一个对象到数据库
this.session.save(对象);
修改数据库中的表的记录
this.session.update(对象);
删除数据库中的表的记录
this.session.delete(对象);
6、提交事务
tran.commit;
7、关闭session:
this.session.close();
通过hibernate修改、删除数据库信息
NewsUser user=new NewsUser();
user.setUsername("admin");
user.setId(4);
user.setPassword("123");
user.setUsertype(1);
//通过session工厂创建session对象
Session session=HibernateSessionFactory.getSession();
//开启一个事务
Transaction transaction=session.beginTransaction();
//调用SESSION的save()方法增加
try{
session.save(user);
//调用session.update()方法修改
session.update(user);
//调用session.delete()方法删除
session.delete(user);
//提交事务
transaction.commit();
System.out.println("修改成功");
}catch(HibernateException e){
transaction.rollback();
}finally{
//关闭session
session.close();
}
通过hibernate查询数据库
//通过session.creatgeQuery()方法查询数据库
NewsUser user=new NewsUser();
//编写HQL语句,并用?占位符
String hqlString="from NewsUser where username=?";
Session session=HibernateSessionFactory.getSession();
//调用session.creatgeQuery()方法
Query query=session.createQuery(hqlString);
//填充占位符,下标从0开始
query.setString(0, "admin");
//通过 query.list().iterator()方法获得结果集的迭代器
Iterator iterator=query.list().iterator();
//循环遍历结果集
while(iterator.hasNext()){
user=(NewsUser) iterator.next();
}
System.out.println(user.getUsername());
session.close();
模糊查询
hibernate实体映射
1、在hibernate中的关系-对象映射就是把实体类与数据库中的表相对应,实现实体类中的属性与数据库中的表的字段一一对应。
2、映射是按照持久化类的定义来创建的,而非表的定义。
hibernate基础语义也就是核心接口
1、configuration类负责管理配置文件信息,创建sessionFactory实例
Configuration con=new configuration.configure();搜寻默认的配置文件
=new configuration.configure(new file("url"));搜寻指定的配置文件
sessionFactory sf =con.buildSessionFactory()
2、sessionFactory类负责创建session实例
sessionFactory实例一旦创建,就被赋予配置信息。
Session session=sf.openSession();
3、session类 是持久层操作的基础,完成其save、update等方法完成持久层操作。
session.flush()清空缓存,在事务中不需要,提交事务和关闭session的时候自动清空
hibernate事务管理
1、hibernate是jdbc轻量级封装,本身不具备事务管理能力,将事务管理委托给最底层的jdbc或者jta
在配置文件中指定委托jdbc事务管理
<property name="hibernate.transaction.factory_class">
net.sf.hibernate.transaction.JDBC.........
</property >
基于jdbc的事物管理,由jdbc的connection实现,事务周期限于Connection生命周期
Transaction tr=session.beginTransaction()
tr.commit()提交事务
tr.rollback()回滚事务。
基于JTA(事务管理构架)的事务管理
1、跨session生命周期
事务管理的锁机制
1、业务逻辑的实现过程中,往往需要保证数据访问的排他性,给我们选定的目标上所,保证其不会被其他程序修改
2、分悲观锁和乐观锁
悲观锁:指的是对数据被外界修改保持保守状态,在整个数据处理过程中,将数据处于锁定状态。
hibernate的加锁模式
内部实现的锁1、LockMode.NONE 无锁机制 2、、LockMode.WRITE 在inser和update记录的时候自动获取 3、LockMode.READ 读取数据的时候自动获取
外部使用 3、 LockMode.UPGRADE 利用数据库的for update子句上锁
4。 LockMode.UPGRADE_NOWAIT Oracle的特定实现,利用ORACLE的for update_NOWAIT子句实现上锁
加锁模式Query.setLockMode Criteria.setLockMode Session.lock
例 Query query=session.createQuery(HQL);//上锁
query.setLockMode(user, LockMode.UPGRADE);
//必须在获取数据之前上锁
query.list()//执行、获取