hibernate学习(环境配置)

Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。

hibernate环境配置

1.下载hibernate:http://hibernate.org/orm/
2.添加需要的jar文件
解压下载的hibernate,会有一个required文件夹,将这里边的jar文件是需要的,同时还需要拷贝连接mysql的jar文件
antlr-2.7.6.jar
commons-collections-3.1.jar
dom4j-1.6.1.jar
hibernate-jpa-2.0-api-1.0.0.Final.jar
hibernate3.jar
javassist-3.12.0.GA.jar
jta-1.1.jar
slf4j-api-1.6.1.jar
mysql-connector-java-5.1.12-bin.jar
2.新建一个java工程,在src下创建一个hibernate.cfg.xml配置文件,用来配置hibernate连接数据库的基本信息。

<?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="connection.driver_class">
        com.mysql.jdbc.Driver
    </property>
    <!-- url -->
    <property name="connection.url">
        jdbc:mysql://localhost:3306/mydb
    </property>
    <!-- 用户名 -->
    <property name="connection.username">root</property>
    <!-- 密码 -->
    <property name="connection.password">root</property>
    <!-- 方言 -->
    <property name="hibernate.dialect">
        org.hibernate.dialect.MySQLDialect
    </property>
    <!-- 控制打印sql -->
    <property name="show_sql">true</property>
    <!-- 格式化sql -->
    <property name="format_sql">true</property>
    <!-- 配置自动根据映射文件更新数据库表 -->
    <property name="hbm2ddl.auto">update</property>
    <!-- 引入映射文件 -->
    <mapping resource="com/mydb/entity/UserInfo.hbm.xml" />
</session-factory>
</hibernate-configuration>  

这里需要注意:hbm2ddl.auto是配置的自动生成表,该值可以是create和update,区别如下:
1.create:每次生成新表,覆盖原来的表和数据
2.update:每次更新表,如果有数据或字段新增,都会对原来的表做更新操作。
4.创建实体类和映射文件
新建com.mydb.entity包,在该包下新创建一个UserInfo的类,主要该类需要和hibernate.cfb.xml文件中的映射文件的类名相同的。

package com.mydb.entity;

import java.io.Serializable;

public class UserInfo implements Serializable {
    private int userId;
    private String userName;
    private String userPass;

    public int getUserId() {
        return userId;
    }
    public void setUserId(int userId) {
        this.userId = userId;
    }
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public String getUserPass() {
        return userPass;
    }
    public void setUserPass(String userPass) {
        this.userPass = userPass;
    }

}

注意该类实现了Serializable接口,因为需要在网络上传输该实体类对象。
创建实体类的映射文件如下:

<?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">
<hibernate-mapping>
    <!-- name="全类名" table="表名" -->
    <class name="com.mydb.entity.UserInfo" table="userinfo">
        <!-- name="属性名" column="主键"-->
        <id name="userId" column="uid">
            <!-- 主键的生成策略:native(主键自增),assigned(指派) -->
            <generator class="assigned"></generator>
        </id>
        <!-- name="属性名" column="字段名" -->
        <property name="userName" column="uname"></property>
        <property name="userPass" column="upass"></property>
    </class>
</hibernate-mapping>    

5.创建测试代码插入一条数据

//解析hibernate.cfg.xml文件
        Configuration cfg = new Configuration().configure();
        //创建SessionFactory(创建连接池)
        SessionFactory factory = cfg.buildSessionFactory();
        //创建session
        Session session = factory.openSession();

        UserInfo userInfo = new UserInfo();
        userInfo.setUserId(1);
        userInfo.setUserName("张三");
        userInfo.setUserPass("111");

        //创建以及开启事物对象
        Transaction transaction = null;
        try {
            transaction = session.beginTransaction();
            //天剑userinfo对象
            session.save(userInfo);
            transaction.commit();
        } catch (HibernateException e) {
            if (transaction != null) {
                transaction.rollback();
            }
            e.printStackTrace();
        } finally {
            if (session != null) {
                session.close();
            }
        }

此时运行测试代码,会自动创建mydb数据库和userinfo表,并且插入一条记录,并且根据hibernate.cfg.xml中的配置,在控制台下也打印出来了一条插入的sql语句:

Hibernate: 
    insert into userinfo (uname, upass, uid) values (?, ?, ?)

6.创建测试代码根据id查询一条数据

//解析hibernate.cfg.xml文件
        Configuration cfg = new Configuration().configure();
        //创建SessionFactory(创建连接池)
        SessionFactory factory = cfg.buildSessionFactory();
        //创建session
        Session session = factory.openSession();

        //创建以及开启事物对象
        Transaction transaction = null;
        try {
            transaction = session.beginTransaction();
            //天剑userinfo对象
            UserInfo userInfo = (UserInfo) session.get(UserInfo.class,1);
            System.out.println(userInfo.toString());
            transaction.commit();
        } catch (HibernateException e) {
            if (transaction != null) {
                transaction.rollback();
            }
            e.printStackTrace();
        } finally {
            if (session != null) {
                session.close();
            }
        }

7.根据id删除一条记录
如果需要根据id删除一条记录,我们首先需要根据id查询该条记录,然后删除查询出来的实体类对象即可

//解析hibernate.cfg.xml文件
        Configuration cfg = new Configuration().configure();
        //创建SessionFactory(创建连接池)
        SessionFactory factory = cfg.buildSessionFactory();
        //创建session
        Session session = factory.openSession();

        //创建以及开启事物对象
        Transaction transaction = null;
        try {
            transaction = session.beginTransaction();
            UserInfo userInfo = (UserInfo) session.get(UserInfo.class,1);
            session.delete(userInfo);
            transaction.commit();
        } catch (HibernateException e) {
            if (transaction != null) {
                transaction.rollback();
            }
            e.printStackTrace();
        } finally {
            if (session != null) {
                session.close();
            }
        }

8.根据id更新

//解析hibernate.cfg.xml文件
        Configuration cfg = new Configuration().configure();
        //创建SessionFactory(创建连接池)
        SessionFactory factory = cfg.buildSessionFactory();
        //创建session
        Session session = factory.openSession();

        //创建以及开启事物对象
        Transaction transaction = null;
        try {
            transaction = session.beginTransaction();
            UserInfo userInfo = (UserInfo) session.get(UserInfo.class,1);
            userInfo.setUserName("wangwu");
            userInfo.setUserPass("333");
            transaction.commit();
        } catch (HibernateException e) {
            if (transaction != null) {
                transaction.rollback();
            }
            e.printStackTrace();
        } finally {
            if (session != null) {
                session.close();
            }
        }

说明一下:在这里,通过session查询出来的对象是一个持久化对象,就是该对象就存放在session缓存当中,当我们将该对象进行更改的时候,缓存中的对象,会自动同步到数据库当中的。
9.查询结果集

//解析hibernate.cfg.xml文件
        Configuration cfg = new Configuration().configure();
        //创建SessionFactory(创建连接池)
        SessionFactory factory = cfg.buildSessionFactory();
        //创建session
        Session session = factory.openSession();

        //创建以及开启事物对象
        Transaction transaction = null;
        try {
            transaction = session.beginTransaction();
            Query query = session.createQuery("from UserInfo");
            List<UserInfo>lists =  query.list();
            for (UserInfo userInfo : lists) {
                System.out.println(userInfo);
            }
            transaction.commit();
        } catch (HibernateException e) {
            if (transaction != null) {
                transaction.rollback();
            }
            e.printStackTrace();
        } finally {
            if (session != null) {
                session.close();
            }
        }

说明一下:这里query中传入的字符串是一个hql语句,其实和sql是一样的,就是将表名改为对应的实体类名,将需要查询的字段改为对应的属性即可。

到现在为止,基本的增删改查就到这里了,可是我们上边的代码是有很大的冗余和重复性代码,下面利用单例模式来进行优化。

package com.mydb.factory;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtils {
    private static Configuration cfg = null;
    private static SessionFactory factory = null;
    static {
        if (cfg == null) {
            cfg = new Configuration().configure();
        }
        if (factory == null) {
            factory = cfg.buildSessionFactory();
        }
    }

    public static SessionFactory getSessionFactory() {
        return factory;
    }

    public static Session getSession() {
        return factory.openSession();
    }

    public static void closeSession(Session session) {
        if (session != null) {
            session.close();
        }
    }
}

可以看到,这里我封装了几个方法,分别用来得到session,factory,关闭session等操作。

说了那么多,现在来看看configuration,sessionfactory,session,到底有什么用??
configuration:负责管理hibernate的配置信息
sessionfactory:缓存了sql语句,和映射的元数据,元数据就是从类中的属性到表里的字段
session:也称之位持久化管理器,session不是线程安全的,他代表与数据库之间的一次或多次操作

总结

hibernate开发分为三个准备和七个步骤:
1.准备hibernate开发需要的jar文件
2.在src下添加hibernate的配置文件(hibernate.cfg.xml)
3.编写实体和映射文件(Xxx.hbm.xml)
七个步骤如下:

//1.创建Configuration对象
Configuration cfg = new Configuration().configure();//解析hibernate.cfg.xml配置文件
//2.创建SessionFactory 
SessionFactory sf = cfg.buildSessionFactory();//解析xxx.hbm.xml映射文件
//3.获取Session,类似于jdbc的Connection
Session session =  sf.openSession();
//4.开启事务
Transaction tx = session.beginTransaction();
//5.做持久化操作
session.save(user);
//6.提交事务
tx.commit();
//7.关闭session
session.close();

好了,hibernate的入门学习就到这里了。
源码下载

你可能感兴趣的:(Hibernate,配置,J2EE,环境)