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();