Hibernate(仅介绍数据库到对象的映射,对象到数据库的映射类似)
一、Hibernate
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。
二、核心接口和类
Hibernate的核心类和接口一共有6个,分别为:Session、SessionFactory、Transaction、Query、Criteria和Configuration。这6个核心类和接口在任何开发中都会用到。通过这些接口,不仅可以对持久化对象进行存取,还能够进行事务控制。
1、Session:Session接口负责执行被持久化对象的CRUD操作(CRUD的任务是完成与数据库的交流,包含了很多常见的SQL语句)。但需要注意的是Session对象是非线程安全的。同时,Hibernate的session不同于JSP应用中的HttpSession。这里当使用session这个术语时,其实指的是Hibernate中的session,而以后会将HttpSession对象称为用户session。
2、SessionFactory:SessionFactory接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象。这里用到了工厂模式。需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。
3、Transaction:Transaction 接口是一个可选的API,可以选择不使用这个接口,取而代之的是Hibernate 的设计者自己写的底层事务处理代码。 Transaction 接口是对实际事务实现的一个抽象,这些实现包括JDBC的事务、JTA 中的UserTransaction、甚至可以是CORBA事务。之所以这样设计是能让开发者能够使用一个统一事务的操作界面,使得自己的项目可以在不同的环境和容器之间方便地移植。
4、Query:Query接口让你方便地对数据库及持久对象进行查询,它可以有两种表达方式:HQL语言或本地数据库的SQL语句。Query经常被用来绑定查询参数、限制查询记录数量,并最终执行查询操作。
5、Criteria:Criteria接口与Query接口非常类似,允许创建并执行面向对象的标准化查询。值得注意的是Criteria接口也是轻量级的,它不能在Session之外使用。
6、Configuration:Configuration 类的作用是对Hibernate 进行配置,以及对它进行启动。在Hibernate 的启动过程中,Configuration 类的实例首先定位映射文档的位置,读取这些配置,然后创建一个SessionFactory对象。虽然Configuration 类在整个Hibernate项目中只扮演着一个很小的角色,但它是启动hibernate 时所遇到的第一个对象。
Hibernate 机制:
三、简单的hibernate+mysql的实例java开发
步骤一:安装jdk、myeclipse
步骤二:新建一个web项目
步骤三:在mysql数据库中新建数据库名usertab和表user,并增加几行数据到表中
步骤四:打开数据库视图
在MyEclipse上依次选择 :window|show view|other|选择DB Browser
选择DB Browser点击ok
步骤五:新建数据库连接
回到上述DB Browser
在DB Browser空白处右击,点击新建,弹出如下对话框
填写上述内容:
我们发现一个问题
这是因为没有使用mysql驱动包的缘故,新建数据库连接的时候,会用到mysql的驱动包,所以加入mysql的驱动包:
点击Add JARs按键
添加mysql的驱动包
看到此时已经加载mysql驱动包到web-inf/lib目录下
之前显示的错误已经不存在
我们可以点击Test Driver测试是否连接(之后所需输入密码都为mysql数据库密码)
点击下一步添加我们所需要的数据库
点击完成,建好后如图
步骤六:右击mysqlhibernate1,打开连接
步骤七:在项目中配置hibernate
点击菜单栏的Myeclipse | Project capabilities | add Hibernate Capabilities
下一步:
如上图所选,点击:完成
这样就已经自动生成了hibernate的配置文件,在src目录下可以找到
步骤八:现在使用hibernate自动生成永久类的java文件
在src目录下新建bean包(用来存自动生成的永久类java文件)
在DB Browser下,右键我们新建的user表,选择Hibernate Reverse Engineering
选择:下一步,弹出如下对话框
选择下一步:
点击:完成
现在在bean包下面有2个文件了,一个User.ava文件,一个User.hbm.xml配置文件
同时,看看hibernate.cfg.xml文件中是不是有User.hbm.xml的映射,这样就配置要了hibernate到数据库的链接,我们就可以通过操作User.hbm.xml这个文件中的表User(注意大写字母),来操作数据库的user表(这里小写字母)了
步骤九:现在我们测试使用hibernate操作数据库
新建一个op包,在op包下新建test.java类文件
test.java代码如下 //测试的是读取数据库中的记录(所以数据库中必须有数据,自己增加数据)
package op;
import java.util.Iterator;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import bean.Usertable;
public class testtable {
Session session = null;
Transaction tx = null;
public static voidmain(String[] args) {
try {
SessionFactory sf =new Configuration().configure()
.buildSessionFactory();
Session session =sf.openSession();
List<?> catlist= null;
catlist =session.createQuery("from User").list();
Transaction tx =session.beginTransaction();
if (catlist != null){
Iterator<?>it = catlist.iterator();
while(it.hasNext()) {
User user = (User) it.next();
System.out.println("id:"+ user.getId() + "姓名:"
+user.getName() + " 密码:"
+user.getPwd() + "\n");
}
}
tx.commit();
session.clear();
} catch(HibernateException e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
添加数据:
package bean;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
public class addtest {
public static voidmain(String[] args) {
try { User u = new User ();
u.setId(6);
u.setPwd("123456");
u.setName("username");
SessionFactory sf =new Configuration().configure()
.buildSessionFactory();
Session session =sf.openSession();
Transaction tx =session.beginTransaction();
session.save(u);
tx.commit();
session.clear();
} catch(HibernateException e) {
e.printStackTrace();
}
}
}
删除数据:
package bean;
import java.util.Iterator;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
public class deletetest{
public static voidmain(String[] args) {
try {
SessionFactory sf=newConfiguration().configure()
.buildSessionFactory();
Session session =sf.openSession();
Transaction tx =session.beginTransaction();
User u = (User)session.get(User.class, 2);
session.delete(u);
tx.commit();
session.clear();
} catch(HibernateException e) {
e.printStackTrace();
}
}
}
修改数据
package bean;
import java.util.Iterator;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
public class updatetest {
public static voidmain(String[] args) {
try {
SessionFactory sf =new Configuration().configure()
.buildSessionFactory();
Session session =sf.openSession();
Transaction tx =session.beginTransaction();
User u = (User)session.get(User.class, 2);
u.setPwd("222222222");
session.update(u);
tx.commit();
session.clear();
} catch(HibernateException e) {
e.printStackTrace();
}
}
}
补充:
User类:publicclassUser extendsAbstractUser implements
java.io.Serializable{
// Constructors
/**
*
*/
private static final long serialVersionUID= 1L;
/** default constructor */
public User() {
}
/** full constructor */
public User(String name,String pwd) {
super(name, pwd);
}
}
AbstractUser类:
package bean;
public abstractclassAbstractUser implements java.io.Serializable {
// Fields
private Integer id;
private String name;
private String pwd;
// Constructors
/** default constructor */
public AbstractUser() {
}
/** full constructor */
public AbstractUser (Stringname, String pwd) {
this.name = name;
this.pwd = pwd;
}
// Property accessors
public Integer getId() {
return this.id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this. name = name;
}
public String getPwd() {
return this.pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
}
通过类创建表:
1. package com.tgbnode.hibernate;
2.
3. import org.hibernate.cfg.Configuration;
4. import org.hibernate.tool.hbm2ddl.SchemaExport;
5.
6.
7. /**
8. * 将hbm生成ddl
9. * @author azj
10. *
11. */
12. public class ExportDB {
13.
14. public static void main(String[] args) {
15.
16. //默认读取hibernate.cfg.xml文件
17. Configuration cfg = new Configuration().configure();
18. //SchemaExport工具类接收配置对象(Configuration)导成DDL,把对象类导成表
19. SchemaExport export = new SchemaExport(cfg);
20. //打印到控制台,并输入到数据库
21. export.create(true, true);
22. }
23. }