第一章 Hibernate环境搭建

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

最开始实现O/R Mapping这个技术的是EJB技术中的CMP(实体Bean)技术,但是EJB是重量级的,它需要运行在特定的容器中,如WeblogicJBOSS等等,这些容器安装文件现在都差不多达到1G的大小容量,对于Tomcat 6M大小来说,易用性简直没有可比性(最重要的是Hibernate可以运行在Tomcat.)

Hibernate之父Gavin King发现CMP太复杂,并且过于庞大,于是开发了Hibernate,以下是Hibernate的诞生:

 

环境搭建的步骤

l           导包

    

如果是WEB工程,我们只需要将这些包复制到lib目录下即可,如果是Java工程,那这里我们就需要建一个User lib,将这些jar包添加到我们的UserLib,然后将Userlib库加入到我们的工程即可,注意一点,我们这里因为用到了SQLServer2005数据库,故我在这里还加入了sqljdbc4.jar这个包,

 

l           添加配置文件

在添加配置文件之前,我们先将数据库建立起来

create table Users(

              userId NVARCHAR(32),

              userName NVARCHAR(20),

              userPwd NVARCHAR(20),

              primary key(userId)

)

注意这里, 主键userId我用的是32位的一个字符串来存储的.

 

然后我们建立我们的model:

package chapter1.model;

 

public class User {

      private String userId;

      private String userName;

      private String userPwd;

 

      public User() {

           super();

      }

 

      public User(String userName, String userPwd) {

           super();

           this.userName = userName;

           this.userPwd = userPwd;

      }

 

      public User(String userId, String userName, String userPwd) {

           super();

           this.userId = userId;

           this.userName = userName;

           this.userPwd = userPwd;

      }

 

      public String getUserName() {

           return userName;

      }

 

      public void setUserName(String userName) {

           this.userName = userName;

      }

 

      public String getUserPwd() {

           return userPwd;

      }

 

      public void setUserPwd(String userPwd) {

           this.userPwd = userPwd;

      }

 

      public String getUserId() {

           return userId;

      }

 

      public void setUserId(String userId) {

           this.userId = userId;

      }

}

 

Hibernate需要知道怎样去加载(load)和存储(store)持久化类的对象。这正是Hibernate映射文件发挥作用的地方。映射文件告诉Hibernate它,应该访问数据库(database)里面的哪个表(table)及应该使用表里面的哪些字段(column)。

以下是配置文件内容:

<?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="chapter1.model.User" table="Users">

           <id name="userId" type="java.lang.String">

                 <column name="userId" length="32" />

                 <generator class="uuid.hex" />

           </id>

           <property name="userName" type="java.lang.String" column="userName" />

           <property name="userPwd" type="java.lang.String">

                 <column name="userPwd" />

           </property>

      </class>

</hibernate-mapping>

注意这里,配置文件的命名有一定的规则, ModelClassName.hbm.xml,一定要注意,dtd文件的引用不要删除.并且此文件必须和model存放在一个包下面.

<class name="chapter1.model.User" table="Users">

这一句是告诉Hibernate,我的这个Model和数据库中的哪张表对应起来

 

<id name="userId" type="java.lang.String">

      <column name="userId" length="32" />

      <generator class="uuid.hex" />

</id>

id标签是Hibernate中的主键标签,和数据库中的主键字段对应

name对应Model中的属性, type对应Model中属性的类型

标签column对应数据库中的主键字段,length为数据库中的长度,length属性可以不写.

generator是主键生成机制,因为我们现在用Hibernate来生成数据库中的数据,所以得告诉Hibernate,我用什么样的方式来生成主键,后面会介绍其他方式.

还有一个二合一的写法:

<id name="userId" type="java.lang.String" column="userId" length="32">

      <generator class="uuid.hex" />

</id>

 

<property name="userName" type="java.lang.String" column="userName" />

<property name="userPwd" type="java.lang.String">

      <column name="userPwd" />

</property>

property是非主键属性与数据库字段的对应关系,也是有两种写法,

name指定Model中的属性名, type指定属性在Java中的类型, 如果在映射文件中没有设置type属性的话,Hibernate会自己试着去确定正确的转换类型和它的映射类型。在某些情况下这个自动检测机制(在Java 类上使用反射机制)不会产生你所期待或需要的缺省值。date属性就是个很好的例子,Hibernate无法知道这个属性(java.util.Date类型的)应该被映射成:SQL date,或timestamp,还是time 字段。

 

l           添加hibernate.cfg.xml文件

此配置文件是告诉Hibernate连接数据库的信息, 以及一些全局环境的设置,

<?xml version='1.0' encoding='utf-8'?>

<!DOCTYPE hibernate-configuration PUBLIC

        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"

        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

      <session-factory>

           <!-- 设置使用数据库的语言 -->

           <property name="dialect">org.hibernate.dialect.SQLServerDialect</property>   

           <!-- 确定以何种方式产生Session-->

           <property name="current_session_context_class">thread</property>

           <!-- 关闭缓存-->

           <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>

           <!-- 是否自动创建对应的数据库表-->

           <property name="hbm2ddl.auto">create</property>

           <!-- 设置是否显示执行的语言 -->

           <property name="show_sql">true</property>

           <!-- 数据库连接属性设置 -->

           <property name="connection.driver_class">com.microsoft.sqlserver.jdbc.SQLServerDriver</property>

           <property name="connection.url">jdbc:sqlserver://localhost:1433;DatabaseName=Hibernate</property>

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

           <property name="connection.password">wdpc</property>

           <!-- 设置 c3p0连接池的属性-->

           <property name="connection.useUnicode">true</property>

           <property name="hibernate.c3p0.max_statements">100</property>

           <property name="hibernate.c3p0.idle_test_period">3000</property>

           <property name="hibernate.c3p0.acquire_increment">2</property>

           <property name="hibernate.c3p0.timeout">5000</property>

           <property name="hibernate.connection.provider_class">

org.hibernate.connection.C3P0ConnectionProvider

           </property>

           <property name="hibernate.c3p0.validate">true</property>

           <property name="hibernate.c3p0.max_size">3</property>

           <property name="hibernate.c3p0.min_size">1</property>

 

           <!-- 加载映射文件-->

           <mapping resource="chapter1/model/User.hbm.xml" />

      </session-factory>

</hibernate-configuration>

 

<property name="hbm2ddl.auto">create</property>

设置此属性后,每次都会先执行drop table ***的操作,故第一次创建表成功后,就要去掉此操作.

 

HibernateUtil,相当于我们以前获取Connection类的DbManager

package commons.util;

 

import org.hibernate.SessionFactory;

import org.hibernate.cfg.Configuration;

 

public class HibernateUtil {

      private static final SessionFactory sessionFactory;

      private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";

 

      static {

           try {

                 // 根据hibernate.cfg.xml创建SessionFactory会话工厂

                 sessionFactory = new Configuration()

                            .configure(CONFIG_FILE_LOCATION).buildSessionFactory();

           } catch (Throwable ex) {

                 // Make sure you log the exception, as it might be swallowed

                 System.err.println("Initial SessionFactory creation failed." + ex);

                 throw new ExceptionInInitializerError(ex);

           }

      }

 

      public static SessionFactory getSessionFactory() {

           return sessionFactory;

      }

}

 

Dao:

package chapter1.dao;

 

import org.hibernate.Session;

 

import chapter1.model.User;

 

import commons.util.HibernateUtil;

 

public class UserDao {

      public void create(User user) {

           Session session = HibernateUtil.getSessionFactory().getCurrentSession();

           session.beginTransaction();

           session.save(user);

           session.getTransaction().commit();

           HibernateUtil.getSessionFactory().close();

      }

 

      public static void main(String[] args) {

           UserDao userDao = new UserDao();

           userDao.create(new User("wdpc2", "791126"));

      }

}

 

 

核心接口简介

Hibernate的核心接口一共有5个,分别为:SessionSessionFactoryTransactionQueryConfiguration。这5个核心接口在任何开发中都会用到。通过这些接口,不仅可以对持久化对象进行存取,还能够进行事务控制。下面对这五个核心接口分别加以介绍。

 

Session接口:

Session接口负责执行被持久化对象的CRUD操作(CRUD的任务是完成与数据库的交流,包含了很多常见的SQL语句。)。但需要注意的是Session对象是非线程安全的。同时,Hibernate

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值