jdbc方式存储数据库缺点:需要每次连接数据库
Hibernate是对JDBC进行了非常轻量级的对象封装,是中小型项目使用的最多的一种持久化技术。而它最重要的概念就是ORM(对象-关系映射)。hibernate对关系数据库的数据操作转化成对对象属性的操作。
Hibernate的核心接口一共有5个,分别为:Configuration、SessionFactory、Session、Transaction和Query。
·Configuration接口:Configuration接口负责配置并启动Hibernate,创建SessionFactory对象。在Hibernate的启动的过程中,Configuration类的实例首先定位映射文档位置、读取配置,然后创建SessionFactory对象。
·SessionFactory接口:SessionFactroy接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象。这里用到了工厂模式。需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。
·Session接口:Session接口负责执行被持久化对象的CRUD操作(CRUD的任务是完成与数据库的交流,包含了很多常见的SQL语句。)。但需要注意的是Session对象是非线程安全的。同时,Hibernate的session不同于JSP应用中的HttpSession。这里当使用session这个术语时,其实指的是Hibernate中的session,而以后会将HttpSesion对象称为用户session。
·Transaction接口:Transaction接口负责事务相关的操作。它是可选的,开发人员也可以设计编写自己的底层事务处理代码。
·Query和Criteria接口:Query和Criteria接口负责执行各种数据库查询。它可以使用HQL语言或SQL语句两种表达方式。
一。*.cfg.xml文件。它描述了Hibernate和数据库之间的配置信息
1。连接数据库 2。自动生成连接池 3。指定数据库方言 4。用于管理持久类和映射文件之间关系
二。映射文件*.hbm.xml,它描述了数据库中的表的信息。
三。持久类*.java
public class User {
private String id;
private String password;
private String userName;
public String getId() {
return id;
}
public void setId(String id) {
this.id= id;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
以上这些都只是使用Hibernate的准备工作,接下来就可以操作Hibernate来实现数据库的逻辑。
首先必须创建一个Configuration对象来加载我们的*.cfg.xml文件。
Configuration cfg = new Configuaration();
cfg.configure("/cfg/hibernate.cfg.xml");//cfg包下面
然后用这个对象来创建SessionFactory对象。这个对象很重要,它是用来创建Hibernate会话和其他类的重要类。
SessionFactory factory = cfg.buildSessionFactory();
Session session = factory.openSession();
有了Session之后,我们就可以用它来创建各种操作数据库的类。先来说说查询吧。我们需要使用一种叫做HQL的查询语言,它是Hibernate特有的一中查询语言,和我们熟悉的SQL很象。当然Hibernate还提供了其他的查询方式,等下次有机会的时候再说吧。
Query query = session.createQuery("from User");
List list = query.list();//执行查询并获得集合
//迭代数据
Iterator it = list.iterator();
while(it.hasNext()){
User u = (User)it.next();
System.out.println(u.getUserName());
}
这就是一个简单的查询。这里需要注意的是,查询语句中的表必须和*.hbm.xml中映射的表名一样,其他的字段也是。下面说说插入、更新和删除。
想要修改和更新,或者删除,我们必须先得到要修改的对象。所以先要使用查询来获取对象。而且修改的过程当中有可能会报错,所以我们要使用事务处理。
Transaction trans = session.beginTransaction();
trans.begin();//开始事务
String hql="from User where ID=1";
Query query = session.createQuery(hql);
List list = query.list();
if (!list.isEmpty()) {
Iterator it = list.iterator();
User u = (User) it.next();
u.setUserName("tutu");
session.update(u);//修改更新,删除是session.delete(u);
trans.commit();//提交事务
session.close();//关闭会话
}
注意:1。这里的表映射是没有主外键关系的,如果表和其他表有主外键关系的话,在创建SessionFactory对象的时候是会报错的。要处理这种情况必须在建立映射关系的时候考虑一对多映射。
2。中文处理
(1)query.setParam(0,"***");
(2)query.setString("name","***");
(3)like处理,
例如:hql="select a.* from User a where a.username like :name"; query.setString("name","%中%");