1.2 Hibernate特点?
1.基于面向对象思想的,不需要写sql语句
2.高性能(延迟加载策略,抓取策略等。。。。)
3.scalability 可伸缩性
4.可靠性强(稳定性)
5.可拓展性
6.数据库平台移植性好。(通过配置可以使用不同的数据库平台)
7.hibernate开源免费,适合大中型系统
缺点:
1.不是批量操作
2.效率比jdbc略差。
2.添加jar包(11个):
hibenernate(10个:下载库的lib/required/xx) mysql驱动
3.写一个持久化Student类。
/* 持久化类(pojo类:一个简单的java对象 plain ordinary java object )
书写原则:
* 1.必须有无参构造方法
* 2.成员变量必须是private的
* 3.属性方法(set/get)是public
* 4.成员变量的类型尽量使用包装类型(包装类具有对象的属性和方法,可以方便的去操作基本类型)
* 5.必须要有一个oid(Object InDetitifer 唯一标识)与表的主键对应
* 6.该类不能用final修饰(final修饰的变量不可改变,final修饰的方法不可重写, final修饰的类不可继承)
*
备注: Hibernate中延迟加载的机制用到了动态代理模式,动态代理中的类很可能要被继承。
*/
4.元数据配置文件
持久化类的映射文件
备注: 文件名称: 持久化类名称.hbm.xml 和持久化类必须在同一个目录下
<?xml version="1.0" encoding="UTF-8"?>
<!-- 查找映射文件的xml约束规则:
hibernate-core.xx.jar中查找:org.hibernate包hibernate-mapping-3.0.dtd-->
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.qf.domain.Student" table="stu">
<id name="stu_id" column="stu_id">
<generator class="native"></generator>
</id>
<property name="stu_name" column="stu_name"></property>
<property name="stu_birthday" column="stu_birthday"></property>
</class>
</hibernate-mapping>
5.主配置文件(hibernate.cfg.xml)
4(数据库连接信息)+1(数据库方言)+2(显示数据库)+1(数据库生成策略)+1(数据库隔离级别)+1(Session)+1(加载映射文件)
<?xml version="1.0" encoding="UTF-8"?> <!-- 加载并启动初始化hibernate框架: 约束规则: hibernate-core.xx.jar/org.hibernate/hibernate-configuration-3.0.dtd --> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!-- 以下配置的依据查找:下载的库projectetchibernate.properties中查找 --> <!-- 配置连接数据库的信息:驱动,地址,用户名,密码 --> <property name="hibernate.connection.driver_class"> com.mysql.jdbc.Driver </property> <property name="hibernate.connection.url"> jdbc:mysql://localhost:3306/1715_hibernate01 </property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">123456</property> <!--配置数据库的方言 mysql5.0之后的方言 org.hibernate.dialect.MySQL5InnoDBDialect 表示创建表的类型是: engine=InnoDB --> <property name="hibernate.dialect"> org.hibernate.dialect.MySQL5InnoDBDialect </property> <!--配置在后台显示hibernate生成的sql语句(过程)--> <property name="hibernate.show_sql">true</property> <property name="hibernate.format_sql">true</property> <!--配置数据库生成的策略(4个) --> <property name="hibernate.hbm2ddl.auto">update</property> <!--设置数据库隔离级别 mysql默认级别为4 --> <property name="Hibernate.connection.isolation">4</property> <!-- 目的:要使用getCurrentSession()获取当前线程绑定的Session,必须要做如下配置--> <property name="hibernate.current_session_context_class">thread</property> <!--加载持久化类的映射文件: resource: src下资源目录--> <mapping resource="com/qf/domain/Student.hbm.xml"/> </session-factory> </hibernate-configuration>
6.创建测试类测试
package com.itqf.test; import java.util.Date; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import com.qf.domain.Student; public class TestHibernate01 { public static void main(String[] args) { //1.加载主配置文件Hibernate.cfg.xml(主配置文件又加载了映射文件(元数据配置文件)) //1.1 创建配置类的对象 Configuration configuration =new Configuration(); //1.2 加载配置文件(加载hibernate.cfg.xml文件) configuration.configure(); //2.从配置文件中得到sessionFactory对象 SessionFactory factory = configuration.buildSessionFactory(); //3.工厂生成session(Hibernate中的session) Session session = factory.openSession(); //4.session可以增删查改 Student student =new Student(); student.setStu_name("皮皮虾"); student.setStu_birthday( new Date()); session.save(student); //关闭资源 session.close(); } }
1.Configuration
Configuration: 配置Hibernate且启动初始化Hibernate框架。
示例:
Configuration c =new Configuration();
c.configure(); //加载src下的hibernate.cfg.xml文件
2.SessionFactory
从配置中得到SessionFactory对象,生产Session对象:
c.buildSessionFactory();
备注:SessionFacotry不是轻量级的。一个数据库对应一个SessionFactory对象。
如果一个程序有多个数据库一定要有多个SessionFactory对象。
SessionFactory线程安全的。
3.Session
Session负责增删改查。Session是非线程安全的。此处的Session指的是Hibernate的session(不同于HttpSession,唯一标识用户,用户session)
factory.openSession()
备注:Session使用结束需要关闭。
4.Query
负责查询,本地SQL语句查询和HQL查询。
5.Transaction
事务操作。
6.Criteria
查询(在线查询和离线查询)
1.6 主键生成策略:
<!-- 当不指定table的时候表名就是持久化类的名称 --> <!--如果没有指明column属性,表中的列名就是持久化类中成员变量的名称 --> 示例: <?xml version="1.0" encoding="UTF-8"?> <!-- 查找映射文件的xml约束规则: hibernate-core.xx.jar中查找:org.hibernate包hibernate-mapping-3.0.dtd --> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <!--hibernate映射的说明 --> <hibernate-mapping package="com.qf.domain"> <!-- 当不指定table的时候表名就是持久化类的名称 --> <class name="Student2"> <!--如果没有指明column属性,表中的列名就是持久化类中成员变量的名称--> <id name="stu_id"> <generator class="uuid"></generator> </id> <property name="stu_name"></property> <property name="stu_birthday"></property> </class> </hibernate-mapping>
主键的分类
1.自然主键 开发者自己维护主键
表中有一个列,不为空,不重复,而且不能随意修改,当作主键使用。
需要用户手动插入主键值(主键由开发者来维护,hibernate不维护)
特点:业务逻辑复杂的时候,数据库的维护难度增加,不推荐。
assigned:必须自己手动插入主键值,不插入报异常。
2.代理主键 hibernate维护主键
表中没有符合主键的列,创建一个列作为主键,且该键在业务处理中不具有任何意义(只是用来标识数据)。
特点:显然代理主键
常见代理主键如下:
native:本地策略。数据库平台不同。自动选择指定数据的策略。
例如:mysql数据默认选择的是identity
orcale数据库默认选择的是sequence
increment:适用于int,long,short类型的主键。自动增长机制是:
1.先查询数据库中最大的id值 select max(id) from stu;
2.在最大的id值上加1作为新的id值插入
identity:只能用在支持自动增长的数据中使用。如mysql支持自动增长,orcale不支持自动增长。
uuid:适用于char,varchar类型的主键。长度为32位的16进制的字符串。占空间大。
效率高保证唯一性,数据库移植性更好。
sequence:oralce数据库使用的策略。
备注:hibernate所有操作加事务
开启事务 Transaction t = session.beginTransaction(); try{ //做自己的事
........ 提交事务 t.commit(); }catch(Exception e){ 事务回滚(异常的时候) if(t!=null){ t.rollback(); } }
1.7 数据库生成策略:
create:先删除表后创建表,再操作
create-drop:先判断有就删除,没有就创建,但是使用完该表删除。(关掉sessionFactory)
update:没有表就创建表,如果有表了直接进行数据库操作(插入,删除,修改,查询)
validate:校验。不会自动创建表。主要是校验持久化类中的变量和数据库表的列名是否一致。
正式运行的项目使用update.
测试:create-drop