Hibernate的基本使用学习
1、 基本了解:
我们先概念性的了解一下什么是hibernate,hibernate的中文翻译是蛰伏,冬眠的意思,看这意思是,当你睡觉的时候是不是不喜欢被打扰。那么这个框架则是被用来操作一些不能别暴露的持久层文件,也就是数据库。
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。
这里要说的是,虽然hibernate已经发布到了第5版,但是最常用的仍然是hibernate3例如win8,win10即使发布了,但是win7的占有量依旧很高,hibernate3可以说是很稳定的一个版本,所以在学习的话最好3是一个很好的选择,myeclipse10中最高的版本是4.1,所以我使用了最高版本。
2、 语言特点以及
(1)将对数据库的操作转换为对Java对象的操作,从而简化开发。通过修改一个“持久化”对象的属性从而修改数据库表中对应的记录数据。
(2)提供线程和进程两个级别的缓存提升应用程序性能。
(3)有丰富的映射方式将Java对象之间的关系转换为数据库表之间的关系。
(4)屏蔽不同数据库实现之间的差异。在Hibernate中只需要通过“方言”的形式指定当前使用的数据库,就可以根据底层数据库的实际情况生成适合的SQL语句。
(5)非侵入式:Hibernate不要求持久化类实现任何接口或继承任何类,POJO即可。
3、 核心接口(核心API)
Hibernate的API一共有6个,分别为:Session、SessionFactory、Transaction、Query、Criteria和Configuration。通过这些接口,可以对持久化对象进行存取、事务控制。
Session
Session接口负责执行被持久化对象的CRUD操作(CRUD的任务是完成与数据库的交流,包含了很多常见的SQL语句)。但需要注意的是Session对象是非线程安全的。同时,Hibernate的session不同于JSP应用中的HttpSession。这里当使用session这个术语时,其实指的是Hibernate中的session,而以后会将HttpSession对象称为用户session。
SessionFactory
SessionFactory接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象。这里用到了工厂模式。需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。
Transaction
Transaction 接口是一个可选的API,可以选择不使用这个接口,取而代之的是Hibernate 的设计者自己写的底层事务处理代码。 Transaction 接口是对实际事务实现的一个抽象,这些实现包括JDBC的事务、JTA 中的UserTransaction、甚至可以是CORBA 事务。之所以这样设计是能让开发者能够使用一个统一事务的操作界面,使得自己的项目可以在不同的环境和容器之间方便地移植。
Query
Query接口让你方便地对数据库及持久对象进行查询,它可以有两种表达方式:HQL语言或本地数据库的SQL语句。Query经常被用来绑定查询参数、限制查询记录数量,并最终执行查询操作。
Criteria
Criteria接口与Query接口非常类似,允许创建并执行面向对象的标准化查询。值得注意的是Criteria接口也是轻量级的,它不能在Session之外使用。
Configuration
Configuration 类的作用是对Hibernate 进行配置,以及对它进行启动。在Hibernate 的启动过程中,Configuration 类的实例首先定位映射文档的位置,读取这些配置,然后创建一个SessionFactory对象。虽然Configuration 类在整个Hibernate 项目中只扮演着一个很小的角色,但它是启动hibernate 时所遇到的第一个对象。
4、 基本原理图
注:Student可以看作为任何一个Bean。
5、
既然我们要学习hibernate,我们先学习配置,然后再进行接下来的学习。在这里我选用的是Myeclipse10进行实验。 新建项目,右键点击新建的项目。Myeclipse Add Hibernate Capabilities
然后,我们就到了这一步,勾选3.3版本或者4.1版本都可以满足我们的要求,我在这里选择的是4.1,选择使用的是Mysql数据库,引用hibernate之后依然需要使用Mysql的connect的jar包,不要忘记。经过几部next之后,因为没事特殊选择,直接next到下面这个界面。
在上面填写上述路径,驱动,用户名,密码,勾选可自动生成表。我操作数据库的名字为hibernate。
继续next指定配置文件所在的包。
经过上述几步之后,我们的hibernate基本配置就做完了,这时项目里就已经生成好配置文件了。
建立类:ExportDB.java
package hibernate;
import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;
public class ExportDB {
/**
*将hbm生成ddl,读取cfg.xml中的mapping来动态建表,已有表将不会被重复创建
*表名将默认设置为类名
*/
public void Exportdb()
{
//默认读取hibernate.cfg.xml文件
Configuration cfg = new Configuration().configure();
SchemaExport export = new SchemaExport(cfg);
export.create(true, true);
}
}
建立User.java
接下来创建一个User.hbm.xml(我们暂时不用反向生成的方式来创建,先手动建立,反向生成方法,后续介绍)
该xml文档中代码如下
<?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="hibernate.User ">
<id name="id">
<generator class="uuid"/>
</id>
<property name="name"/>
<property name="password"/>
</class>
</hibernate-mapping>
这时要在hibernate.cfg.xml中加入
<mapping resource="hibernate/User.hbm.xml"/>
如同使用struts中增加action一样,保证读取xml文件是可以找到实体类进行建表等一系列操作
那么我们写一个实体类来测试一下吧。
因为在一个class中,所以,我分开增删改查的代码,以及运行结果。
一、 增加一条或者多条记录。
public static void add(String name,String password)
{
try {
//打开session并开启事务
session = factory.openSession();
session.beginTransaction();
//新建对象
User user = new User();
user.setName(name);
user.setPassword(password);
//增加对象
session.save(user);
//提交事务
session.getTransaction().commit();
} catch (Exception e) {
// TODO: handle exception
System.out.println(e.getMessage());
//事务回滚
session.getTransaction().rollback();
}finally{
if(session.isOpen())
{ // 关闭session
session.close();
}
}
}
在Main函数中调用三次add()方法,给出name,password。id我们设置的属性是uuid自动添加长度32的串,无实际意义,保证添加的主键都不同,如果想自定义主键,那么久像下面就可以,其他的可以自行百度。uuid的通用性很好。
<generator class="assigned"/>
二、 删除一条或者多条记录。
public static void delete()
{
try {
session = factory.openSession();
session.beginTransaction();
User user = new User();
user.setId("402828815afa7cca015afa7ccd800001");
session.delete(user);
session.getTransaction().commit();
} catch (Exception e) {
// TODO: handle exception
System.out.println(e.getMessage());
session.getTransaction().rollback();
}finally{
if(session.isOpen())
{
session.close();
}
}
}
在这里我们要注意的是,session.delete(user);根据id的值进行删除,如果想进行条件删除,则需要配合HQL语言来进行。后续介绍
三、 查询一条或者多条记录
public static void select(String name)
{
try {
session = factory.openSession();
session.beginTransaction();
Criteria cta = session.createCriteria(User.class);
cta.add(Restrictions.eq("name", name));
List<User> list = cta.list();
for(User user : list)
{
System.out.println(user.name);
System.out.println(user.password);
}
} catch (Exception e) {
// TODO: handle exception
System.out.println(e.getMessage());
session.getTransaction().rollback();
}finally{
if(session.isOpen())
{
session.close();
}
}
}
Criteria是一个叼的不得了的接口,其中封装了很多查询方法,例如模糊查询,分页查询,关联查询等,详见此博客
http://blog.csdn.net/dragonpeng2008/article/details/45865717
四、 更新一条记录
public static void update()
{
try {
session = factory.openSession();
session.beginTransaction();
//指定id后进行修改
User user = (User)session.load(User.class, "402828815afa7cca015afa7ccdf30002");
user.setName("oliver");
user.setPassword("hello");
session.update(user);
session.getTransaction().commit();
} catch (Exception e) {
// TODO: handle exception
System.out.println(e.getMessage());
session.getTransaction().rollback();
}finally{
if(session.isOpen())
{
session.close();
}
}
}
在这里我指定一个特定id的记录作为例子,千万不要以为复制粘贴就能运行,自动生成id是不可能相同的。
总结:
到这里,hibernate的简单增删改查例子就写完了,是不是发现,通过hibernate封装的接口与方法,免去了很多冗余代码,不用在纠结sql语句中的字符差错,代码可读性变得超级强!上述的例子只是一个开始。其实hibernate中还有HQL语句,也是66的,还有hibernate六大API做封装的方法,以及缓存操作。都将在后续指出。