问题?如何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>
3.建立hibernate.cfg.xml数据库配置文件:首先在mysql中建一个数据库:itcast_sh_hibernate 注:数据库是布恩那个自动生成的,而表我们可以通过配置文件、隐身文件、持久化类之间进行自动生成表(在开发中就不用生成表了。数据库都是提前搭建好的。)
<?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>
4.写一个test测试类
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配置文件的对象*/
Configuration configuration=new Configuration();
configuration.configure();//调用方法加载配置文件
//configure():调用这种方式的话,有两个条件,
//1:hibernate.cfg.xml文件必须放在根目录下
//2:名字必须为:hibernate.cfg.xml因为它的父类方法就是这样写的
configuration.buildSessionFactory();
错误:经过测试两个持久化类对象不同,但是标识符相同,这种情况是不允许产生的。
@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两种读取配置文件方式:
1.
2.
整个ormapping的流程:
注意事项:
1、一个类是否是持久化类
1、加载配置文件
2、在配置文件中加载映射文件
3、解析映射文件中class元素的name属性,找到对应的类
2、在客户端的参数的类必须是持久化类