初入Hibernate框架

初入Hibernate框架<一>

需要的工具从官网下载: hibernate.org
Hibernate框架实际上就是:对象关系映射:通过描述对象和数据库之间映射的元数据,操作数据库,将Java程序中的对象自动持久化到数据库(自己不用写sql语句)。
是一个将持久化类与数据库表相映射的工具。
入门示例:
第一步 先建一个Java工程导入使用hibernate最小必要包。 —-lib/required
第二步 在src目录下创建配置文件hibernate.cfg.cml
第三步 编写一个会话工厂
注意:
Hibernate中的session不能关也关不了,和sessionFactory也不能关

新建一个值对象,在domain包下面建立一个Student.hbm.xml,映射文件,用来将值对象里面的属性与数据库的每一列对应。
这里写图片描述

后面附上需要的数据库创建语句——–

配置文件:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- 该配置文件站的立场是Object, 去配置自己和 数据库表之间的映射关系   -->
<!-- 根 hibernate-mapping-->
<hibernate-mapping package="cn.hncu.demo.domain">

    <class name="Student" table="students" catalog="hib">
        <!-- id标记是指Student类中的属性变量,该属性是表主键字段对应 -->
        <id name="studId" type="java.lang.String">
           <!-- column标记是指数据库表中的哪一列(字段)  -->
           <column name="id" length="8"></column>
        </id>

        <!-- 只有主键字段对应的属性变量才能用id,其它字段对应的属性变量都用property -->
        <property name="studName" type="java.lang.String">
           <column name="name" length="40"></column>
        </property>

        <property name="age" type="java.lang.Integer">
           <column name="age"></column>
        </property>

        <property name="depId" type="java.lang.String">
           <column name="deptId" length="8"></column>
        </property>

    </class>


</hibernate-mapping>

然后写一个在SRC下的配置文件 hibernate.cfg.xml:
告诉hibernate要怎样链接数据库,将你的连接信息给它,还有你对值对象的映射配置也要在此配置

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>
        <!-- Database connection settings -->
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://127.0.0.1:3306/hib</property>
        <property name="connection.username">root</property>
        <property name="connection.password"></property>

        <!-- SQL dialect方言:告诉它你是用的什么数据库语言-->
        <property name="dialect">
           org.hibernate.dialect.MySQLDialect
        </property>
        <!-- 其他在此用不上,就省略了-->

        <!-- 一定要把我们写的对象映射文件配置进来(可以配置多个),否则没法使用Hibernate的ORM功能 -->
        <mapping resource="cn/hncu/demo/domain/Student.hbm.xml"/>
    </session-factory>

</hibernate-configuration>

链接完 之后,写个类似于C3P0Ppool的Util,用来获取他的SessionFactory

HibernateUtil:

public class HibernateUtil {
    //单例
    private static SessionFactory sessionFactory =null;
    private static ThreadLocal<Session> t = new ThreadLocal<Session>();

    static{
        //类似于C3P0连接池
        try {
            Configuration config = new Configuration().configure();
            StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings( config.getProperties() ).build();
            sessionFactory = config.buildSessionFactory(serviceRegistry);
        } catch (HibernateException e) {
             throw new ExceptionInInitializerError(e);
        }
    }       



    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }

    public static Session getSession() throws HibernateException{
        Session session = t.get();
        if(session == null || !session.isOpen()){
            //没有sessionFactory哪来的session
            session=(sessionFactory!=null) ?sessionFactory.openSession() : null;
            t.set(session);
        }
        return session ; 
    }
    //关闭与数据库的会话
    public static void closeSession() {
        t.set(null);
    }
}

最后就是测试是否成功的操作数据库:

public class StudentManager {

    public static void main(String[] args) {

        //来自手册的方式---新测结果:不行
        Session session = HibernateSessionFactory.getSession();

        session.beginTransaction(); //开启事务

        Student stud = new Student();
        stud.setStudId("S006");
        stud.setStudName("刘备");
        stud.setAge(23);
        stud.setDepId("D003");
        session.save(stud);

        Student stud2 = new Student();
        stud2.setStudId("S007");
        stud2.setStudName("张飞");
        stud2.setAge(23);
        stud2.setDepId("D003");
        session.save(stud2);//如存在主键重复则会进行事务回滚

        session.getTransaction().commit();//事务提交 (如果出异常,Hibernate会帮我们回滚的,我们不用写rollback() )

        session.close();
    }
}

结果这里写图片描述
日志信息:
这里写图片描述

我所使用的Hibernate版本链接:

http://pan.baidu.com/s/1dEOGVx3

我所用的SQL语句

create database hib character set utf8;
use hib;
create table students(
  id varchar(8) primary key,
  name varchar(40),
  age int,
  deptId varchar(8)
);

insert into students values('S001','Jack',20,'D001');
insert into students values('S002','Tom', 21,'D001');
insert into students values('S003','张三',23,'D002');
insert into students values('S004','李四',24,'D002');
insert into students values('S005','王五',22,'D002');

CREATE TABLE depts(
  id VARCHAR(8) PRIMARY KEY,
  NAME VARCHAR(40)
);
insert into depts values('D001','信息科学与工程学院');
insert into depts values('D002','数学与计算机学院');
insert into depts values('D003','土木工程学院');

DELETE FROM students;
ALTER TABLE students ADD(
   CONSTRAINT fk_stu_dept FOREIGN KEY(deptid) REFERENCES depts(id)
);

使用Hibernate必须要导入的包(最小必要包):
这里写图片描述
最后一个为连接数据库的包

Hibernate最小必要包:路径为

hibernate-release-4.3.7.Final\lib\required

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章