Hibernate原理与应用(一)

来源:互联网 发布:mac外置光驱读不了光盘 编辑:程序博客网 时间:2024/06/05 10:23
 

Hibernate原理与应用(一)

引入

模型不匹配(阻抗不匹配)

Java面向对象语言,对象模型,其主要概念有:继承、关联、多态等;数据库是关系模型,其主要概念有:表、主键、外键等

 

解决办法

1、使用JDBC手工转换:重复性较高

把关系模型转换成对象模型

rs结果集对象----à移动游标if(rs.next()){//把读取到的封装到对象中

       user.setId(rs.getInt(1));

}

对象模型转换成关系模型

String sql=”insert into user values(?,?)”;

ps=con.preparedStatement(sql);

……….

ps.setObject(index++,entity.getId());

……….

 

2、使用ORM(Object Relation Mapping对象关系映射)框架来解决,主流的ORM框架有Hibernate、TopLink、OJB

实际上就是把对象模型转换成关系模型或者把关系模型转换为对象模型

 

把对象持久化到表中

(1)      创建一个实体类User

(2)      将hibernate所需的jar包都构建到项目中

MySQL的驱动、hibernate3.jar、hibernate文件夹的lib/required/所有jar文件、lib/hpa/jar文件

(3)       配置文件:在初始化时读取配置文件中的信息进行初始化的工作

配置文件的两种类型:Hibernate.cfg.xm和hibernate.propertities

Hibernate.cfg.xml的优先级高于hibernate.propertities, Hibernate.cfg.xml会覆盖hibernate.propertities

驱动、数据库的url地址、用户名、密码-------最基本的4项配置

数据库的方言-----到底采用怎样的数据库

驱动、数据库的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">1234</property>

       <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">----单独声明主键

           <generator class="native"/>

       </id>

       <property name="name"/>

       <property name="birthday"/>

    </class>

</hibernate-mapping>

<hibernate-mapping package="com.hbsi.domain">想要映射的java类在哪个包下

class name="User" table="Items"

name="User":哪个Java类来映射   table="Items":用来映射成为哪张表

如果table属性省略,说明类名与数据库名相同

Java类中的属性映射成表的字段

    <id name="id" column="id">

Java类中想要作为主键的相应的属性的名字name="id";

要映射成二维关系表中的哪一列column="id"

当java类中的属性名与关系表中的列名相同时,column属性可以省略

主键是怎么生成的:指定一个名为native的主键的生成器

<generator class="native"/>

映射普通的java属性:指明java类中普通属性的名字,要映射成哪一列

列名与属性值名相同时,列名可以省略      

(5)      写Java代码

       Configuration cfg=new Configuration();//设置配置对象

       cfg.configure();//用来完成hibernate的初始化----读取配置文件,里面的参数表示配置文件的位置,如果配置文件名字与路径均为现在这样,参数省略

       //SessionFactory对象----相当于DriverManager驱动器管理器

       SessionFactory sf=cfg.buildSessionFactory();

       //得到session对象

       Session s=sf.openSession();

       //通过事务提交-----如果没有开启和提交事务,不会插入到数据库中

       Transaction tx=s.beginTransaction();//开启事务

       User user=new User();

       user.setName("tom");

       user.setBirthday(new Date());

       //将user对象保存到数据库中

       s.save(us

       tx.commit();//提交

       s.close();

 

可能会出现的问题

(1)驱动找不到-----没有导驱动那个包

(2)unknow entity:不认识user实体类---在配置文件中没有指明映射在什么地方

在配置文件中加上<mapping resource="com/hbsi/domain/User.hbm.xml"/>

(3)Table “demo.user” doesnot exist:---表格不存在

解决方法1:自己建一个表

Create table user(

Id int auto_increment;

Name varchar(20);

Birthday date;

)

解决方法2:让hibernate自己建一个表

在配置文件中增加配置:

<property name="hibernate.hbm2ddl.auto">create</property>

这个属性的取值可以为:

create-drop:在hibernate初始化时创建表格,程序运行结束时表会被删除

create:在hibernate初始化时创建表格,程序运行结束不删掉,在下一次运行时把原来的表格删掉

update:只是根据映射文件去和数据库中的表对应起来,如果不一致就更新表结构

validate:校验映射文件和数据库中的表是否能够对应起来,如果不能对应,不会更新表,会报错-----更安全更保险

(4)表建好了,表格中没有记录

<property name="hibernate.show_sql">true</property>,让hibernate在执行过程中产生的sql语句显示出来

可能是因为事务回滚了,所以没有插进去

事务

    Session s=sf.openSession();

    Transaction tx=s.beginTransaction();//开启事务

…………………………..

tx.commit();//提交

原创粉丝点击