J2EE体系结构分为三层:
1.表示层(JSP/Servlet)
2.业务层(EJB/Session Bean)
3.数据层(JDBC/EJB(Entiry Bean))。
EJB诞生于98/99年,性能存在很大问题,占用服务器资源多,导致机器瘫痪等严重后果.EJB对数据层的解决方案:实体Bean,使用的是代理模式.
EJB3.0:持久层,没有实体Bean,发布于2006年5月8号,吸收了Hibernate的思想,但是EJB必须要在服务器上才能运行,Hibernate脱离服务器.
Servlet存在的问题:编写HTML代码非常困难,2000年5月诞生了Struts解决了表示层的问题.
Hibernate所在的层次:位于数据层,解决怎么连接数据库.更确切的说是解决ORM,性能高,完整的ORM解决方案.它诞生于2001年,是Gavin King
业余时间的作品.从此,java开发人员对EJB的狂热追捧结束。
业务层:2004年出来的Spring解决了业务层的问题.
调用 调用 调用
Struts-------->Spring-------->Hibernate--------->Database
Hibernate核心思想:将数据库中的数据映射到JavaBean对象上,并可直接将对象属性上的数据写到数据库相应字段上。
下面来开始写第一个Hibernate程序:
1.创建一个JavaBean,User.java,提供一些了getter,setter方法来操作里面的属性,此Bean对应数据库中的users表:
package cn.itcast;
public class User {
private int id;
private String name;
private int age;
private int gender;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getGender() {
return gender;
}
public void setGender(int gender) {
this.gender = gender;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
2.创建Hibernate配置文件:
<?xml version="1.0" encoding="gb2312"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd" >
<hibernate-configuration>
<!-- SessionFactory配置 -->
<session-factory>
<!-- 指定jdbc驱动 -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- 指定URL -->
<property name="connection.url">jdbc:mysql:///hibernate</property>
<!-- 指定用户名 -->
<property name="connection.username">root</property>
<!-- 指定密码 -->
<property name="connection.password">tianxiangdong</property>
<!-- 指定MYSQL对应的Dialect以匹配其平台特性 -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 是否将运行期生成的SQL语句输出到控制台 -->
<property name="show_sql">true</property>
<!-- 是否格式化输出的SQL语句 -->
<property name="format_sql">true</property>
<!-- 映射文件配置,注意文件名必须包含其相对于根的全路径 -->
<mapping resource="cn/itcast/User.hbm.xml" />
</session-factory>
</hibernate-configuration>
3.创建类表映射配置文件:
<?xml version="1.0" encoding="gb2312"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- 根元素,这是固定的 -->
<hibernate-mapping>
<!-- name属性指定映射类名,table属性指定此类所对应的数据库表名-->
<class name="cn.itcast.User" table="users">
<!-- id子元素定义了实体的标识列,指定了当前映射类名的id对应表中的id -->
<id name="id" column="id">
<!-- 因为各种数据库的标识列生成方式有所不同,这里指定id生成方式 -->
<generator class="identity" />
</id>
<!--
属性/字段映射,如果名字相同,可以忽略后面的cloumn,
例如下面的<property name="gender" column="gender" />
可以换成<property name="gender"/>
-->
<property name="name" column="user_name" />
<property name="age" column="use_age" />
<property name="gender" column="gender" />
</class>
</hibernate-mapping>
4.编写客户端的类来测试:
package cn.itcast;
import java.util.Iterator;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class Client {
public static void main(String[] args) {
/**
* Configuration负责管理Hibernate配置信息.当我们调用下面这条语句时,
* Hibernate会在当前的CLASSPATH中搜寻hibernate.cfg.xml文件,并将
* 其加载到内存中.
* Configuration对象的configure方法,提供了不同的形式:
* Configuration configure()
* Configuration configure(org.w3c.dom.Document document)
* Configuration configure(File configFile)
* Configuration configure(String resource)
* Configuration configure(URL url)
* 在使用时,可以根据不同的需要做不同的配置。
*/
Configuration config = new Configuration().configure();
/**
* Configuration实例config会根据配置信息构造出SessionFactory实例.
* Hibernate建议一个应用程序只能有一个SessionFactoty实例
*/
SessionFactory factory = config.buildSessionFactory();
/**
* Session是Hibernate持久化操作的基础.它的实例由SessionFactory
* 负责创建.Hibernate建议一个线程只创建一个session,
*/
Session session = null;
try {
session = factory.openSession();
/**
* 开始一个事务
*/
session.beginTransaction();
/**
* session的save方法
*/
// User user = new User();
// user.setName("lisi");
// user.setAge(56);
// user.setGender(0);
// session.save(user);
/**
* get方法
*/
//User user = (User)session.get(User.class,2);
/**
* update方法
*/
//User user = (User)session.get(User.class,2);
//user.setAge(33);
/**
* delete方法
*/
// User user = (User)session.get(User.class,2);
// session.delete(user);
//也可以通过HQL指定删除条件
// session.createQuery("delete User where id=2").executeUpdate();
/**
* 通过Query接口进行数据查询
*/
List list = session.createQuery(" from User").list();
Iterator iterator = list.iterator();
User user = new User();
while (iterator.hasNext()) {
user = (User) iterator.next();
System.out.println(user.getId() + "/t" + user.getName() + "/t"
+ user.getAge() + "/t" + user.getGender());
}
/**
* 提交事务
*/
session.getTransaction().commit();
} catch (Exception e) {
/**
* 发生异常则回滚
*/
session.getTransaction().rollback();
e.printStackTrace();
} finally{
/***
* 关闭session
*/
session.close();
/**
*
*/
session = null;
}