1 什么是CRM?

客户关系管理,面向客户,以客户为中心的企业客户管理

客户关系管理的具体内容为:

客户信息管理,联系人管理,客户拜访管理,综合查询,统计分析,系统管理

具体分析如下:

综合查询:客户信息查询,联系人信息查询,商机信息查询

统计分析:按客户来源,按行业,按客户数量

系统管理:数据字典,账户管理,角色管理,权限管理,操作日志管理

2 什么是CRUD?

增(create)查(retrieve)改(update)刪(delete)

3 JavaEE开发三层架构:

web层 业务逻辑层 持久层

早期为: jsp+servlet javaBean jdbc

现在: SSH Struts2(Struts1+webwork) spring hibernate springJDBC的模板

SSM SpringMvc spring Mybatis

4 Hibernate框架简述:

Hibernate是一个开源全自动的,基于JDBC的持久化,ORM(对象关系映射)框架,它对象JDBC进行轻量级封装,封装后好处为:

它将POJO与数据库建立映射关系,可以自动生成sql语句,自动执行,使之可以用面向对象思维操作数据库。

注:POJO:plain Ordinary Java Object简单的Java对象,其命名是为了与EJB(Enterprise JavaBean 编好核心代码的java类)的命名区分开来

除此之外,它可以应用在 使用JDBC的客户端程序和WEB应用程序。

最具有革命意义的是,Hibernate可以在应用EJB的JavaEE架构中取代CMP,来完成数据持久化


5 Hibernate与传统的JDBC:

(1) 为什么要使用Hibernate?

JDBC适合小型应用程序开发,大型应用开发需要使用Hibernate(它提高数据访问层效率,也就是操作数据库的效率)

(2) Hibernate是ORM框架,何为ORM(对象关系映射)?

它是描述java对象和关系型数据库表之间的元数据,可以自动把java对象持久化到关系型数据库表中(通过操作java对象完成数据库表操作)

它相当于java对象和关系型数据库中的一个纽带,如下:

业务逻辑模型 持久层 数据存储层

javaBean对象 <---> O/R映射(ORM) <--> 关系型数据库

速记:ORM O Object代表Java对象; R Relation关系 代表关系型数据库; M Mapping映射 代表一种映射关系

(3) Hibernate和其他操作数据库的技术相比的优势:

1>对JDBC访问数据库代码进行轻量级封装,它简化了DAO层(data access object 数据访问层)操作 (从而减少内存消耗,加快运行效率)

2>Hibernate映射性能好,支持很多种关系型数据库,且代码开源可扩展。

6 Hibernate目录简要介绍:

documentation文件夹:存放Hibernate相关的API参考文档

lib文件夹: 存放 Hibernate编译和运行所依赖的jar包,其子目录required下为 运行Hibernate框架必备的jar包

project文件夹: 存放Hibernate框架源代码

7 Hibernate使用POJO进行持久化 POJO(plain ordinary java object 简单的java对象)

(1)何为持久化类?

持久化类是应用程序中的业务实体类,这里的持久化是指该类的对象可以被持久化保存到数据库中

(2)POJO持久化类

POJo持久化类对象中包含与数据库表的字段相对应的属性,这些属性通过 getter/setter方法进行访问,对外部隐藏了实现细节

8 Hibernate相关配置之实体类映射文件配置(Xxx.hbm.xml,存放在POJO包下):

概述:创建完POJO实体类并不马上具备持久化操作能力,Hibernate框架需要知道该实体类映射到关系型数据库中那个表,以及类中属性对应库表中哪个字段

这都需要在映射文件中进行配置

实体类映射文件配置(反映了持久化类和数据库表的映射信息):

(1)导入Hibernate框架约束:

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

(2)orm元数据配置:

1>头标签 <hibernate-mapping package="xxx"></hibernate-mapping>

package属性: 填写包名,在元素内部凡是需要书写完整类名的属性,使用其后可以直接写简单类名

2>子标签<class name="" table="" catalog=""></class>

配置实体类和表对应的关系

name属性: 实体全类名

table属性: 对应的表名

catalog属性: 对应的数据库名(一般可以省略)

3><class></class>下的子标签:

1. <id name="" column="" length="" type="" length=""></id>

主键属性的映射:

name(必写):与主键对应的实体类中的属性名

column(可选):表中主键对应的列名

length(可选):表中对应字段最大长度

type(可选):表中对应字段类型

其子标签<generator class=""></generator>主键生成策略,class默认值为 native

注: 可选项,若没有填写,Hibernate会进行默认值设置

2.<property name="" column="" length="" type="" length="" not-null=""></property>

普通属性映射:

name(必写): 与主键对应的实体类中的属性名

column(可选): 表中主键对应的列名

length(可选): 表中对应字段最大长度

not-null(可选): 配置该表中列(属性)是否不能为空,默认值为:false(即可以为空)

type(可选): 填写表中列(属性)的类型,若不填写,hibernate会自动检测出 实体的属性类型

若填写,则有三种类型写法: java类型|hibernate类型|数据库类型(只做了解,不建议自己填写)

java类型 :<property ... type="String"></property>

hibernate类型:<property...type="string"></property>

数据库类型(较特殊),格式如下:

<property ..>

<column name="cust_name" sql-type="varchar"></column>

</property>

4>模版示例:

<!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="cn.XXX.domain.Customer" table="cst_customer" >

<id name="cust_id" column="cust_id" >

<generator class="native" ></generator>

</id>

<property name="cust_name" column="cust_name" ></property>

<property name="cust_source" column="cust_source"></property>

<property name="cust_industry" column="cust_industry"></property>

<property name="cust_level" column="cust_level"></property>

<property name="cust_linkman" column="cust_linkman"></property>

<property name="cust_phone" column="cust_phone"></property>

<property name="cust_mobile" column="cust_mobile"></property>

</class>

</hibernate-mapping>

9 Hibernate相关配置之核心配置文件配置(hibernate-cfg.xml,存放到src下):

概述: Hibernate(核心)主配置文件主要用于配置数据库连接和Hibernate运行时所需属性

方式一:XML配置

(1)导入约束:

<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

(2)主配置:

1>主标签<hibernate-configuration></hibernate-configuration>

2>子标签<session-factory></session-factory>:

其子标签下进行的数据库连接配置:

必选配置(5项):

<!--数据库驱动-->

<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>

<!--数据库url-->

<property name="hibernate.connection.url">jdbc:mysql:///数据库名</property>

<!--数据库用户名-->

<property name="hibernate.connection.username">数据库用户名</property>

<!--数据库密码-->

<property name="hibernate.connection.password">数据库密码</property>

<!--数据库方言

不同的数据库中,sql语法略有区别,指定方言可以让hibernate框架针对数据库的方言生成sql语句

所有的数据库语言都遵循 sql99标准

hibernate.dialect org.hibernate.dialect.MySQLDialect

hibernate.dialect org.hibernate.dialect.MySQLInnoDBDialect

hibernate.dialect org.hibernate.dialect.MySQLMyISAMDialect

注意:MYSQL在选择方言时:请选择最短的方言

-->

<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

可选项配置(3项):

<!--将hibernate生成的sql语句打印到控制台-->

<property name="hibernate.show_sql">true</property>

<!--将hibernate生成的sql语句格式化(语法缩进,否则就很长的一行显示)-->

<property name="hibernate.format_sql">true</property>

<!--

auto schema export 自动导出表结构,根据实体自动建表

hibernate.hbm2ddl.auto create 自动建表且每次框架运行完后都会创建出新的表,以前的表会被覆盖掉,表数据会丢失(通常只在开发环境的测试中才使用)

hibernate.hbm2ddl.auto create-drop 自动建表且每次框架运行完都会把所有表删除(通常只在开发环境的测试中才使用)

hibernate.hbm2ddl.auto update(推荐使用) 自动生成表,如果已经存在则不会再生成,如果表有变动,则自动更新表(不会删除任何数据)

hibernate.hbm2ddl.auto validate 校验,不自动生成表(框架每次启动 会校验数据库中表是否正确)校验失败会抛出异常

-->

<property name="hibernate.hbm2ddl.auto">update</property>

(2)引入orm元数据:

<!--路径书写:填写src下 orm配置文件(Customer.hbm.xml)的路径-->

<mapping resource="cn/itheima/domain/Customer.hbm.xml"/>

方式二: hibernate.properties文件属性配置

把数据库连接数据写入hibernate.properties文件,然后在hibernate.cfg.xml配置文件里进行配置

但在实际开发中,一般使用xml配置方式,因为xml的配置格式更易于修改,当改变底层应用配置时不需要重新改变和编译代码

而properties的文件不具备这样的优点

10 Hibernate相关的API

(1)Configuration(配置对象) ------加载核心配置文件

概述: Configuration类的作用主要是对Hibernate框架进行配置,以及启动。

在Hibernate框架启动时,首先会创建Configuration类实例(该实例主要用于启动,加载,管理hibernate的配置文件信息)

Configuration类实例会首先定位主配置文件(hibernate.cfg.xml)的位置, 读取其中配置后,就会创建一个SessionFactory对象后完成使命

具体细节:

创建实例代码

Configuration config=new Configuration().configure();

此种方式默认会到src下读取 hibernate.cfg.xml文件,如想使用指定目录下的配置文件,则需要在configure()方法中传递一个文件路径,如下:

Configuration config=new Configuration().configure("hibernate.cfg.xml所在路径");

扩展理解: 如果主配置中未引入映射配置,可进行手动加载, 如下:

conf.addResource(resourceName)

conf.addClass(persistentClass 持久化类)

(2)SessionFactory(Session工厂类)

概述: SessionFactory接口负责Hibernate框架的初始化和创建Session对象,它不是轻量级的,一个项目只需一个SessionFactory就够了, 操作多个数据库时可为每一个库指定一个

它在Hibernate框架中起到一个缓冲区作用,Hibernate可以将自动生成的sql语句,映射语句,以及某些可重复利用的数据放在这个缓冲区

同时它还保存了对数据库配置的所有映射关系,维护了当前的二级缓存

具体细节:

通过Configuration获取SessionFactory

SessionFactory sessionFactory=config.buildSessionFactory();

释放资源--把它看作JDBC的连接池对象会更好理解

sessionFactory.close()

特点:

1>它是重量级的,不能随意创建和销毁它的实例

2>它是线程安全的,同一个实例可以提供多个线程共享

衍生出的工具类:

由于Hibernate的特点,一个项目只需一个SessionFactory,当应用程序中存在多个数据源,才为每个数据源指定SessionFactory实例,

为此,在实际开发中,通常会抽取一个HibernateUtils工具类来提供Session对象

HibernateUtils的代码如下:

public class HibernateUtils {

/* 工厂对象 SessionFactory负责保存和使用所有配置信息,消耗内存资源非常大,开发中要保证它只能被创建一次

* 所以使用了 static{}让它在类加载器中只创建一次

*/

private static final SessionFactory factory;

static {

//1 获取 配置加载类 Configuration。并读取src下的主配置文件

Configuration conf=new Configuration().configure();

//2 获取 hiberate数据库核心对象 session 的工厂

factory = conf.buildSessionFactory();

}

//获得全新session

public static Session openSession() {

// 3 获取 hibernate核心对象 session

Session openSession = factory.openSession();

return openSession;

}

//获得与线程绑定的session

public static Session getCurrentSession() {

// 3 获取 hibernate核心对象 session

Session currentSession = factory.getCurrentSession();

return currentSession ;

}

}

(3)Session(应用程序与数据库之间交互操作的一个单线程对象,是Hibernate框架操作数据库的核心对象)

注:(它和会话技术的用户session和javaMail的session没半点毛线关系,Session类似于JDBC年代的Connection)

概述:Session接口负责执行持久化对象的CRUD操作(对持久化对象的创建,读取,删除),所有持久化对象必须在Session管理下才可进行持久化操作

具体细节:

通过SessionFactory工厂类获取Session

方式一:获取全新的Session实例,使用完毕需要调用close()方法进行手动关闭

Session newSession=sessionFactory.openSession( )

方式二:获取与当前线程绑定的Session实例,它在事务提交或回滚时会自动关闭

Session currentSession=sessionFactory.getCurrentSession()

特点分析:

1 Session线程不安全,多个并发线程同时操作一个Session实例易导致Session数据存取的混乱,因此设计软件架构时,应要避免多个线程共享一个Session实例

2 Session是轻量级的,Session实例的创建和销毁不需耗费太多内存

3 Session拥有Hibernate的一级缓存,这个缓存主要存放当前工作单元加载的对象

session的增删改查:

1.增---向数据库表中增加一个名为 xxx 的Customer对象

Customer c=new Customer();

c.setCust_name("xxx");

session.save(c);

2.删---删除id为1的Customer对象

//1 获得要删除的对象

Customer c=session.get(Customer.class,1l);

//3 执行 删除

session.delete(c);

3.改--修改id为1的Customer对象的name属性

//1 获得要修改的对象

Customer c=session.get(Customer.class,1l);

//2 进行修改操作

c.setCust_name("YYY");

//3 执行 update

session.update(c);

4.查--查询id为1的Customer对象

//通过 数据库的主键获取指定的 实体(Customer)

Customer customer = session.get(Customer.class,1l);

System.out.println(customer);

Session的API扩展:

1 save() , update() 和 saveOrUpdate()方法,用于增加和修改对象

2 delete()方法 用于删除对象

3 get() 和 load()方法,根据主键查询

4 createQuery() 和 createSQLQuery() 方法 用于数据库操作

5 createCriteria()方法:条件查询

(4)Transaction(用于管理事务)

概述:它是Hibernate的数据库事务接口,对底层的事务接口进行了封装。

使用Session对数据库操作后,要使用Transaction接口的commit()方法进行事务提交,才能真正将数据同步到数据库.发生异常时,可通过Transaction的rollback()

事务回滚方法,避免数据错误。

在进行持久化操作后,如果没有开启事务,则每一个Session操作都相当一个独立操作。

具体细节:

创建并开启事务方式一:

Transaction transaction=session.getTransaction();

transaction.begin(); ---开启事务

创建并开启事务方式二(建议使用):

Transaction transaction=session.beginTransaction()

事务提交

transaction.commit();

事务回顾

transaction.rollback();

释放资源

transaction.close();