Hibernate核心知识点

持久化类

Hibernate框架中的持久化类与数据库表对应,可以有多种实现方式,较多使用POJO编程模式实现。

POJO模式的持久化类往往有如下规范:

1、必须提供public的无参构造方法

2、必须提供一个表示属性(Identifier Property)

持久化类中必须提供一个表示属性,与表的主键对应。数据类型可以使基本数据类型,如int,double等,也可以是java.util.Date、java.lang.String类型。

有的表也可能是复合主键。

3、类的属性都是private权限

4、为属性提供getXXX方法,没有参数但是又返回值

5、为属性提供setXXX方法,有个一形式参数,无返回值

对象状态

对象有以下三张状态:

1、瞬时状态(transient state)

当通过new操作符实例化了一个对象,而这个对象并没有被Session对象操作,也就是该对象没有与一个Session对象关联时,那么这个对象就称为瞬时状态对象。

瞬时状态的对象不能被持久化数据库中,也不会被赋予持久化标识(Identifier)。

也就是说瞬时状态的对象与普通对象没有区别,没有与数据库的记录有映射关系。

public static void main(String[] args){
	Customer cust = new Customer("BeiBei","abc",21,"LiaoNing");
}
2、持久状态(persistent state)

如果一个对象与一个Session对象关联,例如被Session对象刚加载的、刚保存的、刚更新的,那么该对象就称为持久状态对象。

持久状态的对象与数据库中一条记录对应,并拥有持久化表示(Identifier)。

当持久状态对象有改变时,当前事务提交后,Hibernate会自动检测到对象的变化,并持久化到数据库中。

public class TestHibernate{
	public static void main(String[] args){
	Session session = HibernateSessionFactory.getSession();
	Transaction tran = session.beginTransaction();
	Customer cust = (Customer)session.get(Customer.class, "BeiBei");
	c.setPwd("password")
	tran.commit();
	session.close();
	}
}
3、脱管状态(detached state)

当与持久状态对象关联的session关闭后,该对象就变成脱管状态(detached state)。

脱管状态的对象引用依然有效,可以继续使用。

当脱管状态的对象再次与某个Session关联后,脱管状态对象将转变为持久状态对象,托管期间进行的修改将被持久化到数据库中。

Hibernate属性配置

Hibernate应用的数据库连接信息都通过Hibernate属性进行配置,可以再hibernate.properties文件中配置,也可以在hibernate.cfg.xml中配置,二者是等价的。

当二者同时存在时,后者将覆盖前者。

Hibernate框架使用连接池维护数据库连接,Hibernate发布包中包含了C3P0和Proxool连接池,只要在属性文件中配置相关属性即可使用。

Hibernate.cfg.xml文件的几本结构如下:

<hibernate-configuration>
	<session-factory>
	<property name=""></property>
	<mapping resource=""/>
	</session-factory>
</hibernate-configuration>
1、使用Hibernate框架自带连接池

<hibernate-configuration>
	<session-factory>
	<property name="connection.username">root</property>
	<property name="connection.url">jdbc:mysql://127.0.0.1:3306/demo</property>
	<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
	<property name="connection.password">password</property>
	<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
	<property name="connection.pool_size">20</property>
	<mapping resource="vo/Customer.hbm.xml"/>
	</session-factory>
</hibernate-configuration>

2、使用 C3P0连接池

要使用C3P0连接池,首先需要在工程中引入C3P0连接池的jar包,然后修改hibernate.cfg.xml文件,配置连接池的信息。

<hibernate-configuration>
	<session-factory>
	<property name="connection.username">root</property>
	<property name="connection.url">jdbc:mysql://127.0.0.1:3306/demo</property>
	<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
	<property name="connection.password">password</property>
	<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
	<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
	<property name="hibernate.c3p0.max_size">20</property>
	<property name="hibernate.c3p0.min_size">5</property>
	<property name="hibernate.c3p0.timeout">120</property>
	<property name="hibernate.c3p0.max_statements">100</property>
	<property name="hibernate.c3p0.idle_test_period">120</property>
	<property name="hibernate.c3p0.acquire_increment">2</property>
	<property name="show_sql">true</property>
	<mapping resource="vo/Customer.hbm.xml"/>
	</session-factory>
</hibernate-configuration>

ORM映射基础

Hibernate框架是一个ORM框架,能够以对象的视角操作数据库。对象和数据库之间的映射关系都在映射文件中配置。

映射文件都与其对应的类名相同,后缀是.hbm.xml。映射文件的基本结构如下所示:

<hibernate-mapping>
	<class name="" table="" catalog="">
		<id name="" type="" >
			<column name="" length=""/>
			<generator class=""/>
		</id>
		<property name="">
		</property>
		<component name=""></component>
		<subclass></subclass>
		<joined-subclass></joined-subclass>
		<union-subclass></union-subclass>
	</class>
</hibernate-mapping>
1、class元素

class元素用来定义一个持久化类。class元素的主要属性有:

①name:持久化类的完整名字。

②table:与持久化类对应的表名字。

③discriminator-value:置顶区分支区分不同的子类。

④polymorphism:多态性,默认值为implicit,可以指定为explicit。

⑤lazy:延迟加载,可以指定为true或false。

⑥abstract:抽象类,指定该类是否为抽象类。

2、id元素

①name:持久化类中的标识属性名字。

②type:标识属性的Hibernate类型。

③column:表中的主键字段。

3、generator元素

id元素下必须存在generator元素,用来指定标识属性的生成类,这些生成类都实现了IdentifierGenerator接口。

①increment:自动增加,用于为long/short/int类型生成唯一标识。

②identity:对DB2、MySQL等数据库的内置标识字段进行支持。

③native:根据数据库底层能力,悬着适合的生成方式。

④assigned:通过应用程序指定标识属性,是默认的生成策略。

⑤foreign:使用另外一个关联对象的标识作为标识属性。

4、property元素

class元素下往往存在大量的property元素。property元素映射了持久化类非标识属性与表字段的映射关系。

property元素的主要的属性有:

①name:持久化类中的属性名。

②type:属性的Hibernate类型。

③column:属性对应的表字段。

④update/insert:默认为true。定义当执行update以及insert操作时是否包含该属性。

⑤lazy:该属性是否延迟抓取。。

5、component元素

如果某个持久类的属性非常多,可以将某些属性封装到新的类中。

在映射文件中,即可使用component元素映射新类的属性和表字段。

6、subclass元素

如果持久化类存在子类,但是子类并没有映射具体的表,那么可以使用subclass元素定义子类属性与表字段的映射关系。

7、joined-subclass元素

如果持久化类对应一张表,同时持久化类存在子类,而且该子类对应具体的表,子类与父类对应的表存在关联关系,则使用joined-subclass元素定义子类属性与表字段的映射关系。

8、union-subclass元素

如果持久化类没有对应的表,而持久化类存在子类,子类都对应具体的表,那么可以使用union-subclass元素定义自雷属性与表字段的映射关系。

HQL语言

Hibernate框架定义了HQL(Hibernate Query Language)语言,可以完成复杂的数据库操作。

HQL语言和SQL语言在语法上类似,主要区别有如下几点:

1、HQL语言中出现的是类名、属性名;SQL语言中出现的是表名、字段名;

2、HQL语言严格区分大小写;SQL语言不区分大小写;

3、HQL语言理解集成、多态等面向对象的概念。


1、获得Query对象。

public class TestHql{
	public static void main(String[] args){
		Session session = HibernateSessionFactory.getSession();
		Query query = session.createQuery("from Customer");
		Query query2 = session .createQuery("from Customer where age>?");
	}
}

2、使用Query对象执行查询HQL

public class TestHql{
	public static void main(String[] args){
		Session session = HibernateSessionFactory.getSession();
		Query query = session.createQuery("from Customer");
		Query query2 = session .createQuery("from Customer where age>?");
		query2.setInteger(0,20);
		List<Customer> list = query.list();
		List<Customer> list2 = query2.list();
		form(Customer c:list){
			System.out.println(c.getCustname()+" "+c.getPwd()+" "+c.getAge()+" "+c.getAddress());
		}
		System.out.println("==========================");
		for(Customer c:list2){
			System.out.println(c.getCustname()+" "+c.getPwd()+" "+c.getAge()+" "+c.getAddress());
		}
	}
}

3、使用Query对象执行更新HQL

public class TestHql{
	public static void main(String[] args){
		Session session = HibernateSessionFactory.getSession();
		Transaction tran = session.beginTransaction();
		Query query = session.createQuery("update Customer set age=30 where custname='BeiBei'");
		query.executeUpdate();
		tran.commit();
	}
}











  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值