持久化类
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>
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();
}
}