〇 路线图
一 CRM
1. 概述
Customer Relationship Management 客户关系管理
2. CRM的模块
二 框架
相当于是一个软件的半成品,已经完成了一部分的功能。
2. EE的三层架构
- WEB层(servlet、JSP)
- 业务(service)层(JavaBean)
- 持久层(DAO)(JDBC)
这套架构可以以开发市面上所有应用。但是在企业中不会使用(过于底层)。企业中开发一般使用SSH(Structs+Spring+Hibernate)、SSM(SpringMVC+Spring+Mybatis)。
二 hibernate
1. 概述
Hibernate框架是当今主流的java持久层框架之一。是一个开放源代码的ORM(Object Relational Mapping对象关系映射)。
2.优点
- Hibernate对JDBC访问数据库的代码做了轻量级的封装,大大简化了数据访问层繁琐的重复性代码,并且减少了内存消耗,加快了运行效率。
- Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现,它很大程度的简化了DAO(Data Access Object,数据访问对象)层编码工作。
- Hibernate的性能非常好,映射的灵活性很出色。它支持很多关系型数据库,从一对一到多对多的各种复杂关系。
- 可扩展性强,由于源代码的开源以及API的开放,当本身功能不够用时,可以自行编码进行扩展。
3.开始前的准备工作。
(1)创建项目,引入jar包
- 数据库驱动包
- Hibernate开发必须的包
- Hibernate引入日志记录包
(2)创建表
CREATE TABLE `cst_customer` (
`cust_id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '客户编号(主键)',
`cust_name` varchar(32) NOT NULL COMMENT '客户名称(公司名称)',
`cust_source` varchar(32) DEFAULT NULL COMMENT '客户信息来源',
`cust_industry` varchar(32) DEFAULT NULL COMMENT '客户所属行业',
`cust_level` varchar(32) 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;
(3)创建实体类
public class Customer {
private Long cust_id;
private String cust_name;
private String cust_source;
private String cust_industry;
private String cust_level;
private String cust_phone;
private String cust_mobile;
setXxx();
getXxx();
}
(4)创建映射
映射需要通过XML的配置文件来完成,这个配置文件可以任意命名。尽量统一命名规范(类名.hbm.xml)
DOCTYPE 来自 lib/hibernate-core-5.0.7.Final.jar/org/hibernate/hibernate-mapping-3.0.dtd
建立字段 来自类中的属性和表中的字段
<?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.jingt.hibernate.demo1.Customer" table="cst_customer">
<!-- 建立类中的属性与表中的主键对应 -->
<id name="cust_id" column="cust.id">
<generator class="native"/>
</id>
<!-- 建立类中的普通属性和表的字段的对应 -->
<property name="cust_name" colum="cust_name"/>
<property name="cust_source" colum="cust_source"/>
<property name="cust_industry" colum="cust_industry"/>
<property name="cust_level" colum="cust_level"/>
<property name="cust_phone" colum="cust_phone"/>
<property name="cust_mobile" colum="cust_mobile"/>
</class>
</hibernate-mapping>
(5)创建hibernate的核心配置文件(在src下创建)
Hibernate的核心配置文件的名称:hibernate.cfg.xml
DOCTYPE 来自 lib/hibernate-core-5.0.7.Final.jar/org/hibernate/hibernate-configuration-3.0.dtd
基本参数来自 hibernate-release-5.0.7.Final\project\etc\hibernate.properties
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 连接数据库的基本参数 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql:///hibernate_day01</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">7426</property>
<!-- 配置Hiberbate的方言 -->
<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>
<!-- 可选配置=============== -->
<mapping resoure="com/jingt/hibernate/demo1/Customer.hbm.xml"/>
</session-factory>
</hibernate-configuration>
4. 编写代码。
创建Configuration对象,并通过它来读取并解析配置文件hibernate.cfg.xml。然后创建SessionFactory读取解析映射文件信息,并将Configuration对象中的所有配置信息拷贝到SessionFactory内存中。接下来打开Session,让SessionFactory提供连接,并开启一个事务,之后创建对象,向对象中添加上数据,通过session.save()方法完成想数据库中保存数据的操作。最后提交事务,并且关闭资源。
public class HibernateDemo1 {
//使用Hibernate保存客户信息
@Test
public void run() {
//1 加载配置文件
Configuration configuration = new Configuration().configure();
//2 创建一个SessionFactory对象
SessionFactory sessionFactory = configuration.buildSessionFactory();
//3 创建一个Session对象,类似于JDBC中的Connection
Session session = sessionFactory.openSession();
//4 开启事务
Transaction transaction = session.beginTransaction();
//5 执行相关操作
Customer customer = new Customer();
customer.setCust_name("黄麒宁");
session.save(customer);
//6 提交事务
transaction.commit();
//7 释放资源
session.close();
}
}
5. hibernate的常见配置。
(1)hibernate映射的配置
- class标签的配置
- 用来建立类与表的映射关系
- 属性:
- name :类的全路径
- table :表名(如果类名和表名一致,table可以省略)
- catlog :数据库名(可以不填)
- id标签的配置
- 用来建立类中的属性与表中的主键的对应关系
- 属性:
* name :类中的属性名
* column :表中的字段名(类中的属性名和表中的字段名一直,column可以省略)
* length :长度 (用于创建映射的表)
* type :类型 (可以不用写)
- property标签的配置
- 用来建立类中的普通属性与表的字段的对应关系
- 属性:
- name :类中的属性名
- column :表中的字段名
- length :长度
- type :类型
- not-null :设置true非空
- unique :设置true唯一
(2)hibernate核心的配置
- 必须的配置
- 连接数据库的基本参数(在hibernate-release-5.0.7.Final\project\etc\hibernate.properties文件中找)
- 驱动类 com.mysql.jdbc.Driver
- url路径 jdbc:mysql:///项目名(三个/代表省略了项目路径)
- 用户名
- 密码
- 方言(在hibernate-release-5.0.7.Final\project\etc\hibernate.properties文件中找)
- 连接数据库的基本参数(在hibernate-release-5.0.7.Final\project\etc\hibernate.properties文件中找)
- 可选的配置
- 显示sql语句
<property name="hibernate.show_sql">true</property>
- 格式化sql语句
<property name="hibernate.format_sql">true</property>
- 自动建表
<property name="hibernate.hbm2ddl.auto">update</property>
- none:不使用hibernate的自动建表
- create:如果数据库中已经有表了,删除原有表重新创建。没有就新建。(测试)
- create-drop:如果数据库中已经有表了,删除原有表执行操作,删除这个表。没有就新建,使用完了删除该表。(测试,需要关sessionFactory)
- update:如果数据库中已经有表了,使用原有表。没有就新建。(可以更新表结构)
- validate:如果没有表不创建,只会使用数据库中原有的表。它会校验表结构,如果表结构不对会报错。
- 显示sql语句
- 映射文件的引入
- 通过< mapping>标签引入映射文件的位置
<mapping resource="com/jingt/hibernate/demo1/Customer.hbm.xml"/>
- 通过< mapping>标签引入映射文件的位置
(3)hibernate核心配置的两种方式
i 属性文件的配置
hibernate.properties
hibernate.connection.driver_class=com.mysql.jdbc.Driver
...
hibernate.connection.password=abc
属性文件的方式不能引入映射文件(手动编写代码加载映射文件)
ii xml文件的配置
hibernate.cfg,xml
通过上面核心配置的标签
6. hibernate的核心API。
(1)Configuration:Hibernate的配置对象
通过该类的对象对Hibernate进行配置,对它进行启动。在Hibernate启动过程中,Configuration类的实例首先定位映射文件的位置,读取这些配置,然后创建一个SessionFactory对象。是启动hibernate时所遇到的第一个对象。
- 作用:
- 加载核心配置文件
- 加载映射文件
(2)SessionFactory:Session工厂对象
SessionFactory接口负责Hibernate的初始化和建立Session对象。用到了工厂模式。一般情况下,一个项目通常只需要一个SessionFactory,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。
SessionFactory内部维护了Hibernate的连接池和Hibernate的二级缓存。是线程安全的对象。一个项目创建一个对象即可。
抽取一个工具类
public class HibernateUtils {
//Hibernate的工具类
public static final Configuration cfg;
public static final SessionFactory sf;
static {
cfg = new Configuration().configure();
sf = cfg.buildSessionFactory();
}
public static Session openSession() {
return sf.openSession();
}
}
(3)Session:类似Connection对象是连接对象
Session代表的是Hibernate与数据库连接的对象,是非线程安全的(必须定义在方法内部,否则会有线程安全问题)。与数据库交互的桥梁。
Session中的API
Serializable save(Object obj); //向数据库保存数据,返回可序列化的ID。
<T> T get(Class c,Serializable id); //查询对象
<T> T load(Class c,Serializable id); //查询对象
void update(Object obj); //修改对象,建议先查询再删除
void delete(Object obj); //删除对象,先查询再删除
void saveOrUpdate(); //保存或更新
- get()方法和load()方法的区别:
- get()方法
- 立即加载,执行到这行代码就会马上发送SQL语句进行查询。
- 返回的是真实对象本身。
- 查询找不到的对象时,返回null
- load()方法
- 采用延迟加载(lazy懒加载),执行到这行代码不会发送SQL语句,到真正使用这个对象的时候才会发送SQL语句。
- 查询返回的是代理对象。
- 查询找不到的对象时,返回ObjectNotFoundException
- get()方法
(4)Transaction:事务对象
Hibernate中管理事物的对象
Transaction的API
void commit(); //提交事务
void rollback(); //回滚事务
7. 抽取工具类
public class HibernateUtils {
public static final Configuration c;
public static final SessionFactory sf;
static {
c = new Configuration().configure();
sf = c.buildSessionFactory();
}
public static Session openSession() {
Session s = sf.openSession();
return s;
}
}