hibernate (一)

本文详细介绍了如何配置Hibernate的hibernate.cfg.xml文件,包括数据库连接信息、二级缓存设置、ORM映射文件等内容,并展示了如何编写实体类及配置orm.xml文件,最后提供了通过HibernateAPI访问数据库的示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.配置 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>
    <!-- 配置hibernate jdbc 属性 -->
    <property name="hibernate.connection.driver_class">
        oracle.jdbc.OracleDriver
    </property>

    <property name="hibernate.connection.url">
        jdbc:oracle:thin:@localhost:1521:orcl
    </property>

    <property name="hibernate.connection.username">hibernate</property>

    <property name="hibernate.connection.password">test</property>

    <!-- 根据entity 类 与 orm 映射关系 创建数据库表 -->
    <property name="hbm2ddl.auto">create</property>
    <!-- 在console 显示 sql -->
    <property name="hibernate.show_sql">true</property>

    <property name="hibernate.jdbc.fetch_size">100</property>

    <property name="hibernate.jdbc.batch_size">30</property>
    <!-- 将session 绑定线程 -->
    <property name="hibernate.current_session_context_class">thread</property>

    <!-- 格式化sql -->
    <property name="hibernate.format_sql">true</property>

    <!-- hibernate.cache.use_second_level_cache启动二级缓存 -->
    <property name="hibernate.cache.use_second_level_cache">true</property>

    <!--hibernate.cache.region.factory_class 二级缓存处理类  -->
    <property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory</property>


    <!-- 引入 orm 文件 -->
    <mapping resource="orm_mapping.xml" />
</session-factory>
</hibernate-configuration>

2.编写 entity 持久化类

package com.hibernate.orm;

public class Student {
    private int s_Id;
    private String s_Name;
    private String s_Class;
    private int s_Score;



    public int getS_Id() {
        return s_Id;
    }
    public void setS_Id(int id) {
        s_Id = id;
    }
    public String getS_Name() {
        return s_Name;
    }
    public void setS_Name(String name) {
        s_Name = name;
    }
    public String getS_Class() {
        return s_Class;
    }
    public void setS_Class(String class1) {
        s_Class = class1;
    }
    public int getS_Score() {
        return s_Score;
    }
    public void setS_Score(int score) {
        s_Score = score;
    }

3.配置 orm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- 在mapping 上配置了包 下面的Student就可以省略包名 -->
<hibernate-mapping package="com.hibernate.orm" >
    <!-- name是entity的名字(包名+类名)table 是数据库表名(大小写不敏感) -->
    <class name="Student" table="student"  >
        <!-- 配置 id 映射数据库表 主键 id -->
        <id name="s_Id" column="sid" >
            <!-- id 生成策略 -->
            <generator class="increment"></generator>
        </id>
        <!-- 属性映射到列名 -->
        <property name="s_Name" column="sname" ></property>
        <property name="s_Class" column="sclass"></property>
        <property name="s_Score" column="sscore"></property>

    </class>
</hibernate-mapping>

4.通过 hibernate api 编写访问数据库代码

package com.hibernate.orm;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
import org.junit.Test;

public class TestOrm {
    private static Session session;
    public synchronized static Session getSession(){
        if(session==null){
            /*
             * 这个方法默认要使用同步锁
             * 
             * 因为 默认引用 /hibernate.cfg.xml 所以这样的 new Configuration().configure() 
             * 可以不传人参数
             * public Configuration configure() throws HibernateException {
                    configure( "/hibernate.cfg.xml" );
                    return this;
                }
             * 
             * */
            //创建configuration
            Configuration conf =new Configuration().configure();
            //创建ServiceRegistryBuilder
            ServiceRegistryBuilder builder = new ServiceRegistryBuilder();
            //获取 build 的 ServiceRegistry
            ServiceRegistry serviceRegistry =builder.applySettings(conf.getProperties()).buildServiceRegistry();
            //获取sessionFactory
            SessionFactory sessionFactory = conf.buildSessionFactory(serviceRegistry);
            //手工开启session
            session=sessionFactory.openSession();
            //获取线程session ,操作该session 必须启动一个事务
            //session=sessionFactory.getCurrentSession();
        }   

        return session;
    }
    /**
     * 
     * 
     * 对象的三种状态
     * 1.瞬时态
     * 2.持久态
     * 3.游离态
     * 
     * session 是应用程序与数据库交互操作的一个单线程对象 ,相当于 jdbc 的connection;
     * 
     * 取得持久对象的方法 get(),load();
     * 持久化对象的保存,更新,删除的方法 save(),update(),saveOrUpdate(),delete(),marge();
     * 
     * 管理 session 的方法 isOpen(),flush(),clean(),evict(),close();
     * 
     * 管理事务的 方法 commit(),rollback(),wasCommitted();
     * 
     * hbm2dll.auto 由java 代码生成数据库表 可选用create/update
     * 取值如下:create 每次运行覆盖上次的表
     *         update 如果发现数据库表不一致,会添加指定列,不会删除原始列
     *         create-drop 在运行时创建 sessionFactory 关闭时删除
     *         validate 会进行自动校验,列不一致会抛出异常
     *         
     * session 缓存有效减少对数据库访问的频率
     * 
     * hibernate 索引从0 开始
     * 入参 ? 
     *     :key
     * 
     * 检索方式
     * oid 检索方式 get(),load()
     * 导航对象图像 检索方式 持久化对象.getXXX();
     * 本地sql createSqlQuery(statement)
     * hsq 检索方式 createQuery(statement)
     * Qbc 检索方式 createCriteria(statement)
     */

    public void add(){
        Session session = getSession();
        //开启事务
        Transaction transact = session.beginTransaction();
        Student stu = new Student();
        stu.setS_Name("dynamic");
        stu.setS_Class("1406");
        stu.setS_Score(1);

        //保存 瞬时态对象
        session.save(stu);

        //提交事务
        transact.commit();
    }

    public void update (){
        Session session = getSession();

        Transaction transact = session.beginTransaction();
        Student stu = new Student();//(Student)session.load(Student.class, 1);
        stu.setS_Id(999);
        stu.setS_Class("1800");
        stu.setS_Name("小王");
        stu.setS_Score(20);

        session.update(stu);

        transact.commit();
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值