hibernate基本配置

来源:互联网 发布:电动汽车销售量数据 编辑:程序博客网 时间:2024/05/22 16:05

hibernate框架:

1、hibernate框架应用在javaee三层结构中dao层框架

2、在dao层里面做对数据库crud操作,使用hibernate实现crud操作,hibernate底层代码就是jdbchibernatejdbc进行封装,使用hibernate好处,不需要写复杂jdbc代码了,

不需要写sql语句实现

3、hibernate开源的轻量级的框架

什么是orm思想:

orm:objectrelational mapping,对象关系映射

(1)让实体类和数据库表进行一一对应关系

让实体类首先和数据库表对应

让实体类属性和表里面字段对应

(2)不需要直接操作数据库表,而操作表对应实体类对象

搭建hibernate环境:

1、导入hibernate的jar包

2、创建实体类

public class User {private int id;private String name;private String pwd;private String address;public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}...
3、配置实体类和数据库表一一对应关系(映射关系)

(1)创建xml格式的配置文件

- 映射配置文件名称和位置没有固定要求

- 建议:在实体类所在包里面创建,实体类名称.hbm.xml

(2)配置是xml格式,在配置文件中首先引入xml约束

- 学过约束dtd、schema,在hibernate里面引入的约束dtd约束

(3)配置映射关系

<?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"><!-- package对应实体类的包 --><hibernate-mapping><!-- 对应的实体类,domain对象,pojo --><class name="com.jredu.entity.User" table="h_user"><id name="id" column="id" type="java.lang.Integer"><!-- 主键生成策略 --><!-- 序列的形式生成主键 --><generator class="sequence"><!-- 指定参数:指定序列的名称 --><param name="sequence">SEQ_USER</param></generator></id><property name="name" column="name" type="java.lang.String"/><property name="pwd" column="pwd" type="java.lang.String"/><property name="address" column="address" type="java.lang.String"/></class></hibernate-mapping>
4、创建hibernate的核心配置文件

(1)核心配置文件格式xml,但是核心配置文件名称和位置固定的

- 位置:必须src下面

- 名称:必须hibernate.cfg.xml

(2)引入dtd约束

<!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/Hibernate Configuration DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

(3)hibernate操作过程中,只会加载核心配置文件,其他配置文件不会加载

第一部分:配置数据库信息必须的

<property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property><property name="connection.url">jdbc:oracle:thin:@localhost:1521:jredu</property><property name="connection.username">hibernate</property><property name="connection.password">hibernate</property>

第二部分:配置hibernate信息可选的

<!-- 通常设置为update,当表不存在时自动创建 --><property name="hbm2ddl.auto">update</property><!-- 输出底层sql语句 --><property name="hibernate.show_sql">true</property><!-- 输出底层sql语句格式 --><property name="hibernate.format_sql">true</property><!-- 配置数据库方言在mysql里面实现分页 关键字 limit,只能使用mysql里面在oracle数据库,实现分页rownum让hibernate框架识别不同数据库的自己特有的语句 --><property name="dialect">org.hibernate.dialect.Oracle10gDialect</property><!-- 在hibernate核心配置文件中配置 --><property name="hibernate.current_session_context_class">thread</property><property name="hibernate.c3p0.validate">true</property><property name="hibernate.temp.use_jdbc_metadata_defaults">false</property>

第三部分:把映射文件放到核心配置文件中

<mapping resource="com/jredu/entity/User.hbm.xml"/>
实现添加操作:

第一步加载hibernate核心配置文件

第二步创建SessionFactory对象

第三步使用SessionFactory创建session对象

第四步开启事务

第五步写具体逻辑 crud操作

第六步提交事务

第七步关闭资源

SessionFactory sessionFactory=null;Session session=null;Transaction tx=null;try {//1、调用工具类得到sessionFactorysessionFactory= HibernateUtils.getSessionFactory();//2、获取sessionsession=HibernateUtils.getSessionobject();//3、开启事务tx=session.beginTransaction();//4、添加用户                        User user=new User();        user.setName("东方不败");        user.setPwd("123456");        user.setAddress("japan");session.save(user);                        //5、提交事务tx.commit();                    } catch (Exception e) {                       //事务回滚tx.rollback();                    }finally{                       //6、关闭                       //session.close();                       //当session与线程捆绑一块时,不需要再关闭sessionFactory.close();                    }

Hibernate核心api:

Configuration1、代码
                //加载核心配置文件cfg = new Configuration();cfg.configure();
(1)到src下面找到名称hibernate.cfg.xml配置文件,创建对象,把配置文件放到对象里面(加载核心配置文件)
SessionFactory
1 使用configuration对象创建sessionFactory对象
(1)创建sessionfactory过程中做事情:
- 根据核心配置文件中,有数据库配置,有映射文件部分,到数据库里面根据映射关系把表创建
2创建sessionFactory过程中,这个过程特别耗资源的
(1)在hibernate操作中,建议一个项目一般创建一个sessionFactory对象
3 具体实现
(1)写工具类,写静态代码块实现
* 静态代码块在类加载时候执行,执行一次
public class HibernateUtils {static Configuration cfg = null;static SessionFactory sessionFactory = null;//静态代码块实现static {//加载核心配置文件cfg = new Configuration();cfg.configure();StandardServiceRegistry serviceRegistry=new StandardServiceRegistryBuilder().applySettings(cfg.getProperties()).build();sessionFactory = cfg.buildSessionFactory(serviceRegistry);}//提供返回与本地线程帮的session的方法public static Session getSessionobject() {return sessionFactory.getCurrentSession();}//提供方法返回sessionFactorypublic static SessionFactory getSessionFactory() {return sessionFactory;}}
Session
1 session类似于jdbc中connection
2 调用session里面不同的方法实现crud操作
(1)添加 save方法
(2)修改 update方法
(3)删除 delete方法
(4)根据id查询 get方法
3 session对象单线程对象
(1)session对象不能共用,只能自己使用
Transaction
1、事务对象
//3、开启事务
tx=session.beginTransaction();
2、事务提交和回滚方法
//提交事务
  tx.commit();
//事务回滚
  tx.rollback();
3、事务概念
(1)事务四个特性
原子性、一致性、隔离性、持久性
实体类编写规则:
1 实体类里面属性私有的
2 私有属性使用公开的set和get方法操作 
3 要求实体类有属性作为唯一值(一般使用id值)
4 实体类属性建议不使用基本数据类型,使用基本数据类型对应的包装类
(1)八个基本数据类型对应的包装类
- int – Integer
- char—Character、
- 其他的都是首字母大写比如double – Double
(2)比如表示学生的分数,假如 int score;
- 比如学生得了0分,intscore = 0;
- 如果表示学生没有参加考试,int score = 0;不能准确表示学生是否参加考试
解决:使用包装类可以了, Integer score = 0,表示学生得了0分,
表示学生没有参加考试,Integer score = null;
hibernate主键生成策略:
1 hibernate要求实体类里面有一个属性作为唯一值,对应表主键,主键可以不同生成策略
2 hibernate主键生成策略有很多的值
3 在class属性里面有很多值
(1)native:根据使用的数据库帮选择哪个值,用于数值型自动增加
(2)uuid:之前web阶段写代码生成uuid值,hibernate帮我们生成uuid值,独一无二的字符串
(3)sequence:oracle使用
                       <!-- 主键生成策略 --><!-- 序列的形式生成主键 --><generator class="sequence"><!-- 指定参数:指定序列的名称 --><param name="sequence">SEQ_USER</param></generator>
对实体类crud操作:
添加操作
               User user=new User();user.setName("东方不败");user.setPwd("123456");user.setAddress("japan");        session.save(user);
根据id查询
User user= (User) session.get(User.class, 4);
修改操作
User user= (User) session.get(User.class, 4);user.setName("岳不群");session.update(user);
删除操作
User user= (User) session.get(User.class, 4);session.delete(user);
实体类对象状态:
1 实体类状态有三种
(1)瞬时态:对象里面没有id值,对象与session没有关联
User user=new User();user.setName("东方不败");user.setPwd("123456");user.setAddress("黑木崖");
(2)持久态:对象里面有id值,对象与session关联
User user= (User) session.get(User.class, 4);
(3)托管态:对象有id值,对象与session没有关联
User user=new User();user.setId(4);
2 演示操作实体类对象的方法
(1)saveOrUpdate方法:实现添加、实现修改
User user = new User();user.setUsername("jack");user.setPassword("520");user.setAddress("朝鲜");//实体类对象状态是瞬时态,做添加                session.saveOrUpdate(user);//              User user = new User();//              user.setUid(6);//              user.setUsername("rose");//              user.setPassword("1314");//              user.setAddress("阿尔巴尼亚");                //实体类对象状态是托管态,做修改//              session.saveOrUpdate(user);//              User user = session.get(User.class, 7);//              user.setUsername("lilei");                //实体类对象状态是持久态,做修改//              session.saveOrUpdate(user);

Hibernate缓存:

1 hibernate框架中提供很多优化方式,hibernate的缓存就是一个优化方式

2 hibernate缓存特点:

第一类 hibernate的一级缓存

(1)hibernate的一级缓存默认打开的

(2)hibernate的一级缓存使用范围,是session范围,从session创建到session关闭范围

(3)hibernate的一级缓存中,存储数据必须持久态数据

 

第二类 hibernate的二级缓存

(1)目前已经不使用了,替代技术 redis

(2)二级缓存默认不是打开的,需要配置

(3)二级缓存使用范围,是sessionFactory范围