hibernate框架简介

一:hibernate框架开发准备

1.简介

Hibernate是一个对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关 系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得可以以操作对象的方式来操作数据库。

2.资源下载

在 hibernate.org官网中 的 hibernate ORM开源项目进行下载

3.jar包添加

解压下载的包,然后将斌目录下的required文件夹中的所有包添加进来(注意:hibernate与其他框架综合使用时应注意jar包冲突问题),jar包如下

//以下jar包均为写版本号
antl.jar
classmate.jar
dom4j.jar
hibernate-commons-annotations-.Final.jar
hibernate_core_Final.jar
hibernate-jpa-api.Fina.jar
jandex-Final.jar
javassist-GA.jar(该包struts中也有)
jboss-logging.Final.jar
jboss-transaction-api_spec_Final.jar

4.添加核心配置文件

在根目录src下新建hibernate.cfg.xml,格式如下

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.driver_class">驱动串</property>
        <property name="hibernate.connection.password">用户密码</property>
        <property name="hibernate.connection.url">url</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.dialect">数据库方言设置</property>
        <property name="hibernate.show_sql">是否显示sql语句</property>
        <property name="hibernate.format_sql">是否对sql语句进行格式化显示</property>
        <property name="hibernate.hbm2ddl.auto">update</property>
        <mapping class="映射元文件"/>
    </session-factory>
</hibernate-configuration>
<!--hibernate.hbm2ddl.auto 该属性可设置四个值
1.create 
每次加载hibernate都会删除之前对应的表,然后根据model类进行重新生成新表
2.create drop
每次加载hibernate都会根据model新建对应的表.但是sessionFactory关闭,表会自动删除
3.update
第一次加载hibernate时,在已创建对应数据库的情况下会创建对应的表,以后每次加载会根据model的改变自动修改表结构,只会增不会删
4.validate
每次加载会根据model和数据库表相对应,如果不一样,则报出异常
-->

二:开发步骤

1.定义实体类和添加映射元文件

定义实体类


public class User_Bean {
    private int id;
    private String username;
    private String password;
    private Date birth;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public Date getBirth() {
        return birth;
    }
    public void setBirth(Date birth) {
        this.birth = birth;
    }

}

方式一.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">
<!-- Generated 2018-4-10 10:49:54 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
    <class name="对应的JavaBean类" table="数据库对应表名">
        <id name="id" type="int">
            <column name="ID" />声明主键
            <generator class="assigned" />主键生成策略
        </id>
        <property name="username" type="java.lang.String">映射对应的数据库字段
            <column name="USERNAME" />
        </property>
        <property name="password" type="java.lang.String">
            <column name="PASSWORD" />
        </property>
        <property name="birth" type="java.util.Date">date类型一定要指出数据类型,其不能自动识别,因为存在数据精度问题
            <column name="BIRTH" />
        </property>
    </class>
</hibernate-mapping>
//注意事项
映射应写为 <mapping resource="包名/类名"/>

方式二.注解

public class User implements Serializable{
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private int id;
    @Column(name="username",length=20,nullable=false,unique=true)
    private String username;
    @Column(name="password",length=20)
    private String password;
    @Temporal(TemporalType.DATE)
    @Column(columnDefinition="timestamp default current_timestamp")
    private Date birth;
//注意时项:映射应写为<mapping class="包名.类名">
主键生成策略
1.increment:由Hibernate以递增的方式为代理主键赋值。Hibernate在初始化阶段读取表中最大主键值,
然后再最大值的基础上递增,增量为12.identity:由底层DB来负责生成,要求底层DB把主键定义为自增类型,例如在SQL Server中,应该把主键
定义为identity类型,MySQL中,定义为auto_increment类型。数据库底层必须支持自增长类型,oracle不支
持,故不能使用(id必须为int long short 定义为byte会抛出异常)

3.sequence利用底层DB提供的序列生成。例如在Oracle中可以使用序列对象生成连续增长值(要求底层数据库必须支持序列oracle,db2支持 mysql sqlserver不支持 )

4.hilo高低位算法:由Hibernate按照一种high/low算法来生成标识符,Hibernate从DB的特定表的字段
中获取high值,hibernate自行维护了一个连续值充当低位值。

5.native:依据底层数据库自动生成标识符的能力,来选择使用identity、sequence标识符生成器。它能自动判断底层DB提供的生成标识符的机制。

6.assign表示由编程提供对应的id值,如果不定义生成器,则默认。一般用于自然主键

7.uuid表示通过全局唯一性算法提供一个全局唯一的必须是32位的16进制的字符串,一般用于分布式数据库,可以在网络范围类保证id唯一

2:编程调用

调用hibernate API

StandardServiceRegistry srr = new StandardServiceRegistryBuilder().configure().build();
SessionFactory factory = new MetadataSources(srr).buildMetadata().buildSessionFactory();
Session session = factory.openSession();
//使用session对象进行对数据的操作
Transaction tx = session.beginTransaction();//开启事务
tx.commit();//事务提交

session.persist(obj);//hibernate提供了JPA支持后新增的方法
session.save(obj);//hibernate的方法

session.remove(obj);//hibernate提供了JPA支持后的方法
session.delete(obj);//hibernate本身的方法

一般先通过id进行对象的获取有两个方法load()和get()方法
load()方法
在加载的时候,首先会在缓存中查找给对象,如果有立即返回,如果没有则返回一个代理对象并且不执行sql语句,当查询非键属性是才会执行,要求查询时session对象不能关闭,否则会报出异常
get()方法
在加载的时候,首先会在缓存中进行对象的查找,如果有该对象,立即返回,如果没有,立即执行查询操作返回对象
load()方法查询不存在的键值时会报出异常,而get()方法会返回一个nullsession.merge(obj);//session提供了JPA支持后的方法
session.update(obj);//session本身的方法
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值