Hibernate原理和基本操作总结
一 基础介绍
1.引入
(1)引入的原因:模型不匹配(阻抗不匹配)
Java面向对象语言,对象模型,主要概念有:继承、关联、多态等;数据库的关系模型,主要概念有:表、主键、外键
(2)解决的办法
使用JDBC手工转换:关系模型转换成了对象模型、对象模式转换为关系模型
使用对象关系映射框架ORM(Object Relation Mapping对象关系映射)来解决,主流的ORM框架有Hibernate TopLink OJB
2.安装配置
(1)下载地址:http://www.hibernate.org
(2)将下载目录/hibernate3.jar和/lib下的hibernate运行时必须的包加入classpath中:
antlr.jar,cglib.jar,asm.jar,commons-collections.jar,commons-logging.jar,jta.jar,dom4j.jar
(3)配置文件hibernate.cfg.xml
包括:驱动、url 、用户名、密码、方言
实例:
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql:///demo</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">qiao</property>
<!-- 方言 针对哪个数据库Mysql-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
</session-factory>
</hibernate-configuration>
(4)映射文件
把实体类中的属性映射成二维表存储
<hibernate-mapping package="com.hbsi.domain">
<class name="java中是实体类的类名2" table="表名">
<!-- 将java类中的属性映射成表的字段 -->
<id name="id">
<generator class="native"/>
</id>
<property name="java类中普通属性的名字"/>
</class>
</hibernate-mapping>
二 基本操作总结
1.创建一个实体类User
2.将hibernate所需的jar包构建到项目中
MySQL驱动
hibernate3.jar
lib/required/所有jar文件
lib/jpa/jar文件
3.配置文件
(1)配置文件的使用
默认的名字是hibernate.cfg.xml
也可以使用Hibernate.properties
如果两种都配,前者优先
(2)配置文件的信息
驱动、url、用户名、密码、方言(用的是什么数据库)、自动的创建表、显示在hibernate工作的过程中产生的sql语句显示出来、指定映射文件的为
例子:
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql:///demo</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">qiao</property>
<!-- 方言 针对哪个数据库Mysql-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 在程序运动的时候,增加自动创建表的属性,在程序终止 的时候销毁,但是在表格再次使用时,会重新建 -->
<property name="hibernate.hbm2ddl.auto">create</property>
<!-- 执行的sql语句显示出来 -->
<property name="hibernate.show_sql">true</property>
<!-- 指定映射文件的位置 -->
<mapping resource="com/hbsi/domain/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
4.映射文件 --- 将实体类和二维的关系表关联起来
命名的规范:User ---- User.hbm.xml
例子:
<hibernate-mapping package="com.hbsi.domain"> ---- 指定java实体类的包名
<class name="User" table="user"> --- 说明实体类怎么映射成二维表
<id name="id" column=”id”>
<!-- 解决主键的生成器,classs中 native是主键的生成器 自动递增-->
<generator class="native"/>
</id>
<property name="name" />
<property name="birthday" />
</class>
</hibernate-mapping>
5.编写代码
public static void main(String[] args) {
// 使用Hibernate完成将对象存入到表中
//配置对象
Configuration cfg = new Configuration();
cfg.configure();//用来完成Hibernate的初始化---用来读取配置文件中的信息,可以指定配置文件的位置 cfg.configure("");
//得到sessionFactoroy的工厂对象,相当于DirverManager,
SessionFactory sf = cfg.buildSessionFactory();
//通过sessionFactory得到session,与会话中的session没有关系
Session s =sf.openSession();
//开启事务
Transaction tx = s.beginTransaction();
//得到User对象
User user = new User();
user.setName("Tom");
user.setBirthday(new Date());
s.save(user);
tx.commit();//提交事务
s.close();
System.out.println("end");
}
6.遇到的问题
(1)驱动找不到
(2)没有找到配置文件 unknown entity 不认识User实体类,原因没有在配置文件中指明配置文件的位置,应该增加一条语句:
<!-- 指定映射文件的位置 -->
<mapping resource="com/hbsi/domain/User.hbm.xml"/>
(3)Table demo.user doesnot exist
在配置文件中增加:
<property name="hibernate.hbm2ddl.auto"></property>
它的取值有:
(1)<property name="hibernate.hbm2ddl.auto"> create-drop </property>
create-drop:表示在hebarinate初始化时创建表格,程序运行结束的时候会删除相应的表格,在实际项目中不用
(2)<property name="hibernate.hbm2ddl.auto">create</property>
在hibernate初始化时会创建表格,在运行结束之后不删除表格,而是在下一次运行的时候如果有旧的删掉,没有旧的,重新建表格
(3)<property name="hibernate.hbm2ddl.auto">update</property>
只是根据映射文件去和数据库中的表对应起来,如果不一致,就更新表的结构
(4)<property name="hibernate.hbm2ddl.auto">validate</property>
校验映射文件和数据库中的表是不是能对应起来,不能对应报错,实际中常用
(4)表建好了,但是表格中没有记录,可以想到是事务的回滚所致
<!-- 执行的sql语句显示出来 -->
<property name="hibernate.show_sql">true</property>
开启事务
Transaction tx = s.beginTransaction();
提交事物
tx.commit();//提交事物