问题?如何Hibernate环境搭建
首先我们来谈谈,为什么要用hibernate框架,为什么不用jdbc来连接数据库直接操作数据库?各自有缺点在哪儿?如何搭建环境?
hibernate框架又称ormapping框架优缺点:
Jdbc的优缺点
由上面的优缺点比较,我们选择用hibernate框架的理由,在于我们能更加操作数据库,更加的灵活,也不用去写冗长的sql语句,移植性也好。
实际上我们用ormapping框架也是基于jdbc连接数据库,只是在上面更加进步了。它对数据的操作是讲数据以缓存二进制数据的形式存储到内存中,然后进行数据库的操作。
ormapping框架的作用:对象关系映射
让关系型数据库和对象发生关联 如下结构图:
hibernate的配置文件:
作用是用来连接数据库的
二、搭建环境
1.加入必须要用的jar包。这里所使用的jar都是一些开发中常用的jar,所需依情况而定。jar下载:jar下载
2.建立实体类:
package cn.itcast.hibernate.web.domain; import java.io.Serializable; /** * 对象的序列化的作用:让对象在网络上传输,以二进制的形式传输 * @author Administrator * Serializable标示接口 * */ public class Person implements Serializable { private Long pid; private String pname; private String psex; public Long getPid() { return pid; } public void setPid(Long pid) { this.pid = pid; } public String getPname() { return pname; } public void setPname(String pname) { this.pname = pname; } public String getPsex() { return psex; } public void setPsex(String psex) { this.psex = psex; } }实体类(持久化类)中的属性名和数据库表中的列字段名相同,而实体类的名字一般与数据库的表面相同,若是不同在映射文件中用table属性来特别指定
3.建立 实体类名.hbm.xml映射文件:这个是用来将实体类(持久化类)和数据库配置文件进行一个映射关系
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <!--@class 描述持续化类 name 类的全名 table 数据库表名,可以不写 默认值和类名一样 catalog 数据库的名称 一般不写 --> <class name="cn.itcast.hibernate.web.domain.Person"> <!-- @id *id标示属性 和数据库中的主键对应 name 属性的名称(跟映射的实体类相同) column 列的名称(布尔歇默认跟name的相同) type 类型(可以填写两种类型,一种是Java类型如:long,该类型效率更高) <span style="white-space:pre"> </span>另外一种是hibernate类型如:java.lang.Long <span style="white-space:pre"> </span>注:大小写 --> <id name="pid" column="pid" length="5" type="java.lang.Long"> <!-- @generator 主键的产生器 就该告诉hibernate容器用什么样的方式产生主键 --> <generator class="increment"></generator> </id> <!-- @property 描述一般属性 --> <property name="pname" column="pname" length="20" type="java.lang.String"> </property> <property name="psex" column="psex" length="10" type="java.lang.String"> </property> </class> </hibernate-mapping>
<?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <!-- 一个session-factory只能连接一个数据库 --> <session-factory> <!-- 数据库的用户名 --> <property name="connection.username">root</property> <!-- 密码 --> <property name="connection.password">root</property> <!-- url --> <property name="connection.url"> jdbc:mysql://localhost:3306/itcast_sh_hibernate </property> <!-- @property name="hbm2ddl.auto" 作用:根据持久化类和映射文件生成表 validate:验证持久化类在映射文件中描述正不正确,只验证 create-drop:hibernate容器开启的时候生成表,关闭的时候删除表(不用) create:hibernate容器开启的时候生成表(不用) update:表示hibernate开启的时候,先检查持久化类和映射问件和表到底对应不对应, 不对应的话,我新建一个表。对应的话,验证描述正不正确(validate) --> <property name="hbm2ddl.auto">update</property> <!-- 显示hibernate内部生成的sql语句 --> <property name="show_sql">true</property> <!--@mapping resource 表示和映射文件相对应 --> <mapping resource="cn/itcast/hibernate/web/domain/Person.hbm.xml" /> </session-factory> </hibernate-configuration>
package cn.itcast.hibernate.web.test; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import org.junit.Test; import cn.itcast.hibernate.web.domain.Person; public class TableTest { @Test public void testadd(){ Configuration configuration=new Configuration(); configuration.configure(); SessionFactory sessionfactory=configuration.buildSessionFactory(); //打开数据库连接池 Session session=sessionfactory.openSession(); //开始事物 Transaction transaction=session.beginTransaction(); //cud操作 Person person=new Person(); person.setPname("Mr_Li13"); person.setPsex("MAN"); //save中的参数必须是持久化对象类 session.save(person); //提交事务 transaction.commit(); //关闭数据库连接池 session.close();//因为整个过程是缓存中的io流,需要关闭事物的 } }
常见的数据库没连接错误:
/**
* Configuration 读取hibernate配置文件的对象
错误:经过测试两个持久化类对象不同,但是标识符相同,这种情况是不允许产生的。
@Test public void testIndenty(){ //两个持久化对象不同,但是标识符相同,这种情况是不允许产生的。 Session session=sessionfactory.openSession(); Transaction transaction=session.beginTransaction(); Person person=(Person)session.get(Person.class, 2L); Person person1=new Person(); person1.setPid(2L); session.update(person1); transaction.commit(); session.close(); }
用这个就可以检测是否搭建成功了。
案例:案例下载
hibernate两种读取配置文件方式:
2.
整个ormapping的流程:
注意事项:
1、一个类是否是持久化类
1、加载配置文件
2、在配置文件中加载映射文件
3、解析映射文件中class元素的name属性,找到对应的类
2、在客户端的参数的类必须是持久化类