hibernate

本文详细介绍了如何使用Hibernate框架进行数据库操作,包括配置环境、创建实体类、生成映射文件及测试类,同时深入探讨了Session缓存、隔离级别、对象状态转换及各种方法如save、persist、get等的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//1、加入相关jar包
//2、src下创建hibernate.cfg.xml文件
	<session-factory>
    	//<!-- 数据库基本信息 -->
    	<property name="connection.username">root</property>
    	<property name="connection.password">root</property>
    	<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
    	<property name="connection.url">jdbc:mysql:///h</property>
    	
    	//<!-- Hibernate基本信息 -->
    	//<!-- Hibernate方言 -->	 
    	<property name="dialect">org.hibernate.dialect.MySQLDialect</property>//hibernate-release-4.3.9.Final\project\etc\hibernate.properties
    	//<!-- 执行操作时是否在控制台打印SQL -->
    	<property name="show_sql">true</property>
    	//<!-- 是否对SQL进行格式化 -->
    	<property name="format_sql">true</property>
    	//<!-- 自动生成数据表策略 -->
    	<property name="hbm2ddl.auto">update</property>//update更新不删除原有的列名,create删除原有的表重新创建,create-drop当sessionFactory
														//一旦关闭表就自动删除		
    	//<!-- 指定关联的hbm.xml文件 -->
    	<mapping resource="com/gmy/h1/News.hbm.xml"/>
		
		//<!-- 配置C3P0数据源 -->
    	<property name="c3p0.max_size">2</property>
    	<property name="c3p0.min_size">2</property>
    	<property name="c3p0.timeout">5000</property>
    	<property name="c3p0.max_statements">100</property>
    	<property name="c3p0.idle_test_period">300</property>
    	<property name="c3p0.acquire_increment">2</property>
    	<property name="c3p0.validate">false</property>
    </session-factory>
//3、写一个实体类
	public class News {
		private Integer id;
		private String title;
		private String author;
		private Date date;
		public Integer getId() {
			return id;
		}
		public void setId(Integer id) {
			this.id = id;
		}
		public String getTitle() {
			return title;
		}
		public void setTitle(String title) {
			this.title = title;
		}
		public String getAuthor() {
			return author;
		}
		public void setAuthor(String author) {
			this.author = author;
		}
		public Date getDate() {
			return date;
		}
		public void setDate(Date date) {
			this.date = date;
		}
		public News(String title, String author, Date date) {
			super();
			this.title = title;
			this.author = author;
			this.date = date;
		}
		public News() {
		}
		@Override
		public String toString() {
			return "News [id=" + id + ", title=" + title + ", author=" + author
					+ ", date=" + date + "]";
		}
		
	}
//4、生成News.hbm.xml映射文件
	<class name="com.gmy.h1.News" table="NEWS">
        <id name="id" type="java.lang.Integer">
            <column name="ID" />
            <generator class="native" />
        </id>
        <property name="title" type="java.lang.String">
            <column name="TITLE" />
        </property>
        <property name="author" type="java.lang.String">
            <column name="AUTHOR" />
        </property>
        <property name="date" type="java.util.Date">
            <column name="DATE" />
        </property>
    </class>
//5、写一个测试类
	SessionFactory sessionFactory = null;
	//创建Configuration获取配置信息和映射关系
	Configuration configure = new Configuration().configure();
	//创建ServiceRegistry对象任何配置都需要注册才生效
	ServiceRegistry buildServiceRegistry = new ServiceRegistryBuilder().applySettings(configure.getProperties())
								.buildServiceRegistry();
	//创建SessionFactory对象
	sessionFactory = configure.buildSessionFactory(buildServiceRegistry);
	//创建Session对象
	Session openSession = sessionFactory.openSession();
	//开启事物
	Transaction beginTransaction = openSession.beginTransaction();
	//执行保存操作
	News news = new News("Java","gmy",new Date(new java.util.Date().getTime()));
	openSession.save(news);
	//提交事务
	beginTransaction.commit();
	//关闭Session
	openSession.close();
	//关闭SessionFactory对象
	sessionFactory.close();
	
//Session缓存(一级缓存)
	//flush():使数据表中的记录和对象的状态保持一致,可能会发出对应的SQL语句
		//1、如果数据没有变则不发送,如果改变,则发送SQL语句
	//refresh():会强制发送SELECT语句,已使Session缓存中的对象的状态和数据表中对应的记录保持一致
		//注意Hibernate的隔离级别
	//clear():清理缓存
	
//隔离级别
	//1、READ UNCOMMITED(读未提交)   
	//2、READ COMMITED(读已提交)	
	//4、REPEATABLE READ(可重复读)	 
	//8、SERIALIZEABLE(串行化)
//<property name="connection.isolation">2</property>   默认为4
	
//持久化对象状态
	//持久化状态
	//临时状态
	//游离状态
	//删除状态
	
//游离状态
	//News news = new News();
	//news.setId(1);

//持久化状态
	//News news = (News)session.get(News.class,1);

//对象状态转换图

	get()
	Load()	
	Query.list()
	Query.uniqueResult()
	Query.iterator()	
	Query.scoll()						new 语句
	//持久化状态	<---------------	//临时状态	
		|	^			save()	
		|	|		 saveOrUpdate()	
		|	|			persist()
		|	|			merge()
		|	|
		|	|
evict()	|	| update()
close()	|	| saveOrUpdate()
clear()	|	| merge()
		|	|
		v	|
				   delete()
	//游离状态	 ----------->	//删除状态
		
		
//save()方法
	//临时对象变为持久化对象,并为对象分配ID
	//在save()方法前设置ID无效
	//对于持久化对象的ID不允许修改

//persist()方法:
	//save设置对象ID无效但是不抛出异常,而persist会抛出异常
	
//get()方法:
	//获取一个对象

//get()和load()区别
	//1、执行get方法会立即返回一个对象,而执行load方法,若不使用对象,则不会立即执行查询而返回一个代理对象
	//2、如果数据表中没有对应的记录,get返回null,load,当使用对象时,抛出异常
	//3、load方法可能会抛出懒加载异常
	
//update()方法
	//1、更新持久化对象,不需要显示调用update方法,但事物提交时,会先执行session的flush方法
	//2、更新游离对象时,需要显示调用session中的update方法,可以把游离对象变成持久化对象

//saveOrUpdate()方法
	//游离对象则执行update,临时对象则执行save

//delelte()方法
	//删除对象

//evict()方法
	//从缓存中移除指定的持久化对象
	
//set:映射set类型属性
//inverse:指定由哪一方维护关联关系
//cascade:级联操作,不建议使用,建议手工
//order-by:	排序操作,order-by中存放的是列名

//注意
	//单向一对多
		//插入:单向一对多应该先插入多的一方,在插入一的一方
		//删除:可以直接删除一的一方,直接删除多的一方会有异常,必须在一的一方设置级联删除<set cascade="delete">
	//双向一对多
		//双向一对多,让一的一方放弃维护关联关系<set inverse="true">
		//设定集合是要将集合初始化,防止发生空指针异常
	//一对一
		//先保存没有外键的一方
	//单向多对多
		//注意懒加载异常
	//双向多对多
		
	//继承映射	
		//join-subclass
		//union-subclas 
	
//检索策略
	//类级别
		//立即检索:立即加载检索方法的指定对象
		//延迟检索:延迟加载检索方法的指定对象

//检索方式
	//导航对象图检索方式:根据已经加载的对象导航到其他对象
	//OID检索方式:按照对象的OID来检索对象
	//HQL检索方式:使用面向对象的HQL查询语言
	//QBC检索方式:使用QBC API来检索对象
	//本地SQL检索方式:使用本地数据库的SQL查询语句

//HQL分页
	query.setFirstResult((pageNo-1)*pageSize).setMaxResults(pageSize).list()
//HQL命名查询
	getNamedQuery();
	
//常见错误
错误:数据表无法生成
原因:注意检查映射文件的路径,还有Hibernate的方言配置,Hibernate可以自动见表,但是不能自动建数据库

 

转载于:https://my.oschina.net/MoreYoungGavin/blog/677714

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值