hibernate基本配置

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、调用工具类得到sessionFactory
			sessionFactory= HibernateUtils.getSessionFactory();
			//2、获取session
			session=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();
	}
	
	//提供方法返回sessionFactory
	public 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范围

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值