第一章 Hibernate环境搭建

如果是WEB工程,我们只需要将这些包复制到lib目录下即可,如果是Java工程,那这里我们就需要建一个User lib库,将这些jar包添加到我们的UserLib库,然后将Userlib库加入到我们的工程即可,注意一点,我们这里因为用到了SQLServer2005数据库,故我在这里还加入了sqljdbc4.jar这个包,
[img]http://dl.iteye.com/upload/attachment/241727/1787a11d-51bd-3d1b-8237-d867da7b5091.bmp[/img]
添加配置文件
在添加配置文件之前,我们先将数据库建立起来
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 字段。

 添加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个,分别为:Session、SessionFactory、Transaction、Query和Configuration。这5个核心接口在任何开发中都会用到。通过这些接口,不仅可以对持久化对象进行存取,还能够进行事务控制。下面对这五个核心接口分别加以介绍。

Session接口:
Session接口负责执行被持久化对象的CRUD操作(CRUD的任务是完成与数据库的交流,包含了很多常见的SQL语句。)。但需要注意的是Session对象是非线程安全的。同时,Hibernate的session不同于JSP应用中的HttpSession。这里当使用session这个术语时,其实指的是Hibernate中的session,而以后会将HttpSesion对象称为用户session。

SessionFactory接口:
SessionFactory接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象。这里用到了工厂模式。需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。

Configuration接口:
Configuration接口负责配置并启动Hibernate,创建SessionFactory对象。在Hibernate的启动的过程中,Configuration类的实例首先定位映射文档位置、读取配置,然后创建SessionFactory对象。

Transaction接口:
Transaction接口负责事务相关的操作。它是可选的,开发人员也可以设计编写自己的底层事务处理代码。

Query和Criteria接口:
Query和Criteria接口负责执行各种数据库查询。它可以使用HQL语言或SQL语句两种表达方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值