Java常用三大框架
—— Hibernate 框架
项目的三层结构
一个完整的WEB项目,一般情况下都分为三层结构:WEB层、业务层、持久层。
WEB层:与客户端进行数据交互。客户端发送请求到WEB层, WEB层接收并简单的封装后传递给业务层。
业务层 :处理业务逻辑。将处理过后的数据交给持久层。
持久层 :负责与底层数据交互。主要体现在与数据库的交互。
JAVA三大框架简单介绍
JAVA 最常用最基础的两套框架分别是 SSH 和 SSM 框架。
本次主要学习 JAVA 的 SSH 三大框架。
SSH 三大框架是指:Struct2 + Spring + Hibernate。
Struct2 : 开源框架。主要体现在 WEB 层。当服务器启动后,根据配置文件加载服务到内存。
提供了数据实体(JAVABean)、视图(View)、控制器(Controller)的相关组件。
Spring: 主要体现在业务层。
提供了管理业务对象的一致方法,鼓励使用接口式编程。还提供了唯一的数据管理,包括JDBC框架。
Hibernate:开源的对象关系映射框架。主要体现在持久层。
对JDBC进行了轻量级的对象封装,更加方便的操作数据库。
Hibernate 框架介绍
对象关系映射)框架。可以自动生成SQL语句,自动执行SQL语句,使得程序员可以方便的使用操作对象的思维操作数据库。使用Hibernate框架主要用于完成数据的持久化。
优点:
1、对JDBC访问数据库的代码做了封装,极大的简化了数据访问层繁琐的重复性代码;
2、基于JDBC的主流持久化框架,是一个非常优秀的ORM实现,很大程度的简化了DAO层的编码工作;
3、性能非常好,因为它是一个轻量级框架,映射的灵活性非常出色,且支持很多关系型数据库,从一对一到一对多的各种复杂关系。
Hibernate 框架开发入门
Step 1 :下载Hibernate运行环境
https://sourceforge.net/projects/hibernate/files/hibernate-orm/5.0.7.Final/hibernate-release-5.0.7.Final.zip/download 点击打开链接
Step 2: 创建数据表结构(以MySQL数据库为例)
CREATE DATABASE db_hibernate_test;
USE db_hibernate_test;
CREATE TABLE `t_customer` (
`cust_id` BIGINT(32) NOT NULL AUTO_INCREMENT COMMENT '客户编号(主键)',
`cust_name` VARCHAR(32) NOT NULL COMMENT '客户名称(公司名称)',
`cust_user_id` BIGINT(32) DEFAULT NULL COMMENT '负责人id',
`cust_create_id` BIGINT(32) DEFAULT NULL COMMENT '创建人id',
`cust_source` VARCHAR(32) DEFAULT NULL COMMENT '客户信息来源',
`cust_industry` VARCHAR(32) DEFAULT NULL COMMENT '客户所属行业',
`cust_level` VARCHAR(32) DEFAULT NULL COMMENT '客户级别',
`cust_linkman` VARCHAR(64) DEFAULT NULL COMMENT '联系人',
`cust_phone` VARCHAR(64) DEFAULT NULL COMMENT '固定电话',
`cust_mobile` VARCHAR(16) DEFAULT NULL COMMENT '移动电话',
PRIMARY KEY (`cust_id`)
)
ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
Step 3: 搭建Hibernate开发环境
1、安装JDK + Myeclipse开发环境 + Tomcat
2、启动MyEclipse,新建Web项目。

3、导入MySQL驱动包 + Hibernate 驱动包 + 日志包

Step 4:编写JavaBean实体类
package com.mcd.domain;
/**
* 客户的JavaBean实体类
* @author
*/
public class Customer {
private Long cust_id; //建议使用包装类型,包装类型的默认值是null, 而基本类型的默认值是 0。
private String cust_name;
private Long cust_user_id;
private Long cust_create_id;
private String cust_source;
private String cust_industry;
private String cust_level;
private String cust_linkman;
private String cust_phone;
private String cust_mobile;
// ... Set/Get方法自动生成 这里省略
}Step 5:创建类与表结构之间的映射
1、建议映射的配置文件与JavaBean放置在同一目录;
2、建议映射文件名称为 JavaBean的名字 + .hbm.xml; (hbm:意为 :Hibernate Map)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<!-- 配置类和表结构的映射 -->
<class name="com.mcd.domain.Customer" table="t_customer">
<!-- 配置id
name属性,JavaBean的属性
column属性,是表结构的字段
-->
<id name="cust_id" column="cust_id">
<!-- 主键的生成策略 -->
<generator class="native"/>
</id>
<!-- 配置其他的属性 -->
<property name="cust_name" column="cust_name"/>
<property name="cust_user_id" column="cust_user_id"/>
<property name="cust_create_id" column="cust_create_id"/>
<property name="cust_source" column="cust_source"/>
<property name="cust_industry" column="cust_industry"/>
<property name="cust_level" column="cust_level"/>
<property name="cust_linkman" column="cust_linkman"/>
<property name="cust_phone" column="cust_phone"/>
<property name="cust_mobile" column="cust_mobile"/>
</class>
</hibernate-mapping>Step 6 : 创建Hibernate核心配置文件
核心配置文件整个项目只需要写一个。
1、核心配置文件必须放在src的根目录下;
2、核心配置文件名必须为:hibernate.cfg.xml; (cfg:意为:configuration)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<!-- 先配置SessionFactory标签,一个数据库对应一个SessionFactory标签 -->
<session-factory>
<!-- 必须要配置的参数有5个,4个连接参数(驱动 + 数据库名 + 用户名 + 密码) + 数据库的方言参数 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql:///db_hibernate_test</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<!-- 数据库的方言 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 可选配置 -->
<!-- 显示SQL语句,在控制台显示 -->
<property name="hibernate.show_sql">true</property>
<!-- 格式化SQL语句 -->
<property name="hibernate.format_sql">true</property>
<!-- 生成数据库的表结构
update:如果没有表结构,创建表结构。如果存在,不会创建,添加数据
-->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 映射配置文件,需要引入映射的配置文件 -->
<mapping resource="com/mcd/domain/Customer.hbm.xml"/>
</session-factory>
</hibernate-configuration>Step 7 :测试一下框架搭建是否正常
1、创建测试包,导入单元测试的Jar, 创建单元测试
package com.mcd.test;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;
import com.mcd.domain.Customer;
/**
* 测试 Hibernate 框架
* @author
*
*/
public class TestDemo1 {
/**
* 单元测试 测试保存客户功能
*/
@Test
public void testSave(){
//1、加载配置文件
Configuration config = new Configuration();
//默认加载src目录下 hibernate.cfg.xml 配置文件
config.configure();
//2、创建SessionFactory对象, 生成Session对象
SessionFactory factory = config.buildSessionFactory();
//3、创建Session对象
Session session = factory.openSession();
//4、开启事务
Transaction tr = session.beginTransaction();
//5、编写保存客户的代码
Customer c = new Customer();
// c.setCust_id(cust_id); 主键 由框架自动管理 且自动递增 这里不需要手动设置
c.setCust_name("测试用户");
c.setCust_user_id(1000000);
c.setCust_create_id(1680502);
c.setCust_industry("系统开发");
c.setCust_level("A");
c.setCust_linkman("MCD");
c.setCust_mobile("188********");
c.setCust_phone("496203");
c.setCust_source("");
//保存数据 操作对象就相当于操作数据库表的结构
session.save(c);
//6、提交事务
tr.commit();
//7、释放资源
session.close();
factory.close();
}
}2、Run AS "JUint Test" 运行单元测试, 控制台会有以下提示
log4j:WARN No appenders could be found for logger (org.jboss.logging).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Hibernate:
insert
into
t_customer
(cust_name, cust_user_id, cust_create_id, cust_source, cust_industry, cust_level, cust_linkman, cust_phone, cust_mobile)
values
(?, ?, ?, ?, ?, ?, ?, ?, ?)同时, 数据库中多出一条数据

说明框架搭建没有问题。
step 8 :Session对象的CRUD操作
1、 为了方便操作,先写一个工具类
package com.mcd.utils;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
/**
* Hibernate 框架 的工具类
*/
public class HibernateUtils {
private static final Configuration CONFIG;
private static final SessionFactory FACTORY;
static {
//加载XML的配置文件
CONFIG = new Configuration().configure();
//构造工厂
FACTORY = CONFIG.buildSessionFactory();
}
/**
* 从工厂中获取Session对象
* @return
*/
public static Session getSession() {
return FACTORY.openSession();
}
}
2、测试 Session 对象的 CRUD 操作(TestDemo1 类中)
/**
* 单元测试 3 测试Session对象的CRUD
*/
@Test
public void testSave3(){
Session session = HibernateUtils.getSession();
Transaction tr = session.beginTransaction();
//查询 :第一个参数是JavaBean的反射, 第二个参数是需要查询的数据的 主键 (因为我们定义的主键是Long类型的,所以加L后缀)
Customer c = session.get(Customer.class, 1L);
System.out.println(c);
//修改:参数为对象
//★ 修改 删除 都建议先查询 后进行改删操作
c.setCust_create_id(1234567);
c.setCust_phone("7654321");
session.update(c);
//删除:参数为对象
session.delete(c);
//新增或修改:如果存在则修改,如果不存在则新增
c.setCust_create_id(987); //★新增:主键由Hibernate自动处理,切记不要操作主键
session.saveOrUpdate(c);
tr.commit();
session.close();
}3、控制台输出内容
log4j:WARN No appenders could be found for logger (org.jboss.logging).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Hibernate:
select
customer0_.cust_id as cust_id1_0_0_,
customer0_.cust_name as cust_nam2_0_0_,
customer0_.cust_user_id as cust_use3_0_0_,
customer0_.cust_create_id as cust_cre4_0_0_,
customer0_.cust_source as cust_sou5_0_0_,
customer0_.cust_industry as cust_ind6_0_0_,
customer0_.cust_level as cust_lev7_0_0_,
customer0_.cust_linkman as cust_lin8_0_0_,
customer0_.cust_phone as cust_pho9_0_0_,
customer0_.cust_mobile as cust_mo10_0_0_
from
t_customer customer0_
where
customer0_.cust_id=?
Customer [cust_id=1, cust_name=测试用户, cust_user_id=1000000, cust_create_id=1680502, cust_source=, cust_industry=系统开发, cust_level=A, cust_linkman=MCD, cust_phone=496203, cust_mobile=188********]
Hibernate:
delete
from
t_customer
where
cust_id=?
Hibernate:
insert
into
t_customer
(cust_name, cust_user_id, cust_create_id, cust_source, cust_industry, cust_level, cust_linkman, cust_phone, cust_mobile)
values
(?, ?, ?, ?, ?, ?, ?, ?, ?)4、刚才查询到的数据已经被删除

step 9 : Session 对象的综合查询
@Test
public void testSave4(){
Session session = HibernateUtils.getSession();
Transaction tr = session.beginTransaction();
//创建查询接口
Query query = session.createQuery("from Customer");
//查询所有数据 select * from Customer
List<Customer> list = query.list();
for (Customer item : list) {
System.out.println(item);
}
tr.commit();//事务的提交方法
// tr.rollback(); // 事务的回滚方法 -- 一般写在 catch 语句中
session.close();
}
















