hibernate:
定义:ORM:Object Relational Mapping 对象 关系 映射
使用hibernate时几个必要的:
1、实体类
2、映射文件(类 -数据库表,属性-字段)【实体类名.hbm.xml】
3、配置文件:数据库连接信息(两个配置:hibernate.cfg.xml(数据库配置文件)和实体类名.hbm.xml(映射配置文件))
4、必要架包
- hibernate(主框架)
- ojdbc jdbc
- jta 允许应用程序执行分布式事务处理——在两个或多个网络计算机资源*问并且更新数 据:针对数据读取
- commons-collections 各种集合类和集合工具类封装
- dom4j xml解析
- javassist 分析、编辑和创建Java字节码的类库:针对字节码的
- slf4j-api 记录hibernate的日志接口
- slf4j-nop 、、
其他笔记:
在代码中都会有注释
hibernate.cfg.xml(数据库配置文件):
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration>
<session-factory> <!-- 指定oracle对应得dialect -->
<property name="dialect">
org.hibernate.dialect.Oracle10gDialect
</property>
<!-- 数据库jdbc驱动 -->
<property name="connection.driver_class">
oracle.jdbc.driver.OracleDriver
</property> <!-- 数据库url -->
<property name="connection.url">
jdbc:oracle:thin:@localhost:1521:XE
</property>
<!-- 用户名 -->
<property name="connection.username">user_admin</property>
<!-- 用户密码 -->
<property name="connection.password">abc123</property> <!-- session范围和上下文 -->
<property name="current_session_context_class">thread</property>
<!-- 是否在运行期间生成的SQL输出到日志以供调试 -->
<property name="show_sql">true</property>
<!-- 是否格式化sql -->
<property name="format_sql">true</property>
<!-- 映射 -->
<mapping resource="cn/cy/Hibernate/entity/Dept.hbm.xml" />
</session-factory>
</hibernate-configuration>
hibernate.cfg.xml
实体类名.hbm.xml(映射配置文件):
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping>
<!-- 与关键字冲突 ”~~“解决 -->
<class name="cn.cy.Hibernate.entity.Dept" table="dept">
<!-- 当数据库里面的列明与java属性一致时,我们可以省略colnumn -->
<id name="deptno" column="deptno">
<generator class="sequence">
<!--索引-->
<param name="sequence">seq_index</param>
</generator>
</id>
<property name="deptname" column="deptname" type="java.lang.String" />
<property name="loc" column="loc" type="java.lang.String"/>
</class>
</hibernate-mapping>
映射配置
实体类:
package cn.cy.Hibernate.entity; import java.io.Serializable; public class Dept implements Serializable{
//属性
private int deptno;
private String deptname;
private String loc;
//构造方法
public Dept(){ }
//
public int getDeptno() {
return deptno;
} public void setDeptno(int deptno) {
this.deptno = deptno;
} public String getDeptname() {
return deptname;
} public void setDeptname(String deptname) {
this.deptname = deptname;
} public String getLoc() {
return loc;
} public void setLoc(String loc) {
this.loc = loc;
} }
实体类
测试类:
使用hibernate的几个步骤:
package cn.cy.Hibernate.Test; import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration; import cn.cy.Hibernate.entity.Dept; /**
* 测试类
* @author Administrator
*
*/
public class Test {
public static void main(String [] args){
/**
* 测试方法
*/
if(addDept()){
System.out.println("保存成功");
} }
/**
*测试hibernate框架的测试类
**/
public static boolean addDept(){
boolean flag=false;
Configuration conf=null;
SessionFactory factory=null;
Session session=null;
Transaction trans=null;
try {
//读取配置文件
conf=new Configuration().configure();
//创建sessionfactory
factory=conf.buildSessionFactory();
//打开会话
session=factory.openSession();
//开启事务
trans=session.beginTransaction();
Dept dept=new Dept();
//当设置了gennerator为sequence时,不给参数是以指定sequence填值
dept.setDeptno(200);
dept.setDeptname("开发部");
dept.setLoc("成都");
//持久化
//session.save(dept);
//session.delete(dept);
//Dept dp=(Dept)session.get(Dept.class, 1);//没有数据,返回空值
//System.out.println(dp.getDeptname());
Dept dp=(Dept)session.load(Dept.class, 1);//没有数据,报异常
System.out.println(".....");
System.out.println(dp.getDeptname()); //提交事务
trans.commit(); flag=true;
} catch (Exception e) {
e.printStackTrace();
trans.rollback();
}finally{
if(session!=null){
session.close(); }
} return flag; }
}
在测试中遇到的exception:
因为在上课时忘记将错误信息保存下来,所以在这里不做详细错误描述:
配置文件一定严格书写,地址一定准确!
总之如果按照上述的配置过程配置,出现错误时:
- 方法alt不出来,检查架包是否build;
- 运行代码后,如果提示sequence不存在的,检查param节点;
- 如果是其他与数据库相关的,检查自己数据库的约束等等
- 以上是我遇到的错误,其他的错误暂时没遇到!