Hibernate框架入门(1)

1、什么是JavaEE的三层架构

  

1.1、三层架构

表现层(web层)

业务层(service层)

持久层(dao层)

1.2.1 需求

需求:
        1)、保存一个学生对象
        2)、查询一个学生对象
        
        
    学生表:
        create table student(
            id int primary key auto_increment,
            name varchar(200),
            gender varchar(10)
        );

    学生对象:
        public class Student{
            private Integer id;
            private String name;
            private String gender;
            
            //省略get和set方法
        }

 

 

1.2.2 还没有学框架之前,能用的两种技术是什么?

JDBC 与 DBUtils

1.2.3 第一种技术:JDBC

1)保存:
        String sql = "insert into student(name,gender) values (?,?)";
        Connetion conn = getConnetion();
        PreparedStatement pstm = conn.getPrepareStatement(sql);
        pstm.setString(1,stu.getName());
        pstm.setString(2,stu.getGender());
        pstm.executeUpdate();

        
    2)查询:
        String sql = "select * from student where id = ?";
        Connetion conn = getConnetion();
        PreparedStatement pstm = conn.getPrepareStatement(sql);
        pstm.setString(1,stu.getId());
        ResultSet rs = pstm.executeQuery();
        Student s = new Student;
        if(rs.next()){
            s.setId(rs.getInt("id"));
            s.setName(rs.getString("name"));
            s.setGender(rs.getString("gender"));
        }

1.2.4 第二种技术:DBUtils

1)保存:
        String sql = "insert into student(name,gender) values (?,?)";
        QueryRunner qr = new QueryRunner(ds);
        qr.update(sql,stu.getName(),stu.getGender());
    
    
    
    2)查询:
        String sql = "select * from student where id = ?";
        QueryRunner qr = new QueryRunner(ds);
        qr.query(sql,new BeanHandler(),stu.getId());

1.2.5 这两种技术有啥问题?

JDBC:痛苦而且容易出错

DBUtils:麻烦 要不断写sql语句和javaBean

1.2.6 是不是想不想写sql语句,也不想写过多的JavaBean呢?

保存: save(student);  保存一个对象,能把这个对象保存到数据库

查询: Student s= get(id);  直接根据id查询一个对象,只用一个方法,不写sql

 

1.2.7 怎么实现?

把对象保存到数据库表中

对象                表

Save(对象)      insert into table

 

配置文件: xml和properties

 

用xml :为啥用xml?  Xml能够描述对象的层级结构

 

Xml怎么设计?

 

<class name=”cn.itcast.entity.Student” table=”数据库表名:student”>

        对象中的属性  --------------  表中的字段

</class>

 

配置文件:映射文件

 

2、ORM映射

 

Object Relation Mapping 对象关系映射。

 

O: object 对象

R:relation 关系型数据库表

M:mapping 映射

 

 

简单的说就是把我们程序中的实体类和数据库表建立起来对应关系。

 

使用了ORM之后,我们操作对象就相当于操作数据库表。

 

3、Hibernate的框架

Hibernate框架是当今主流的Java持久层框架之一,由于它具有简单易学、灵活性强、扩展性强等特点,能够大大地简化程序的代码量,提高工作效率,因此受到广大开发人员的喜爱。 
Hibernate是一个开放源代码的ORM框架,它对JDBC进行了轻量级的对象封装,使得Java开发人员可以使用面向对象的编程思想来操作数据库。 

  

4、CRM介绍

 

CRM(Customer Relationship Management)客户关系管理,是利用相应的信息技术以及互联网技术来协调企业与顾客间在销售、营销和服务上的交互,向客户提供创新式的个性化的客户交互和服务的过程。 
 	 	其最终目标是将面向客户的各项信息和活动集成起来,组建一个以客户为中心的企业,实现对面向客户的活动的全面管理。 

2.1 功能模块划分:

CRM 系统实现了对企业销售、营销、服务等各阶段的客户信息、客户活动进行统一管理。 CRM 系统功能涵盖企业销售、营销、用户服务等各各业务流程,业务流程中与客户相关活动都会在 CRM 系统统一管理。 
下边列出一些基本的功能模块,包括:客户信息管理、联系人管理、商机管理、统计分析

 

客户信息管理 
 	 	 	对客户信息统一维护,客户是指存量客户或拟营销的客户,通过员工录入形成公司的
“客户库”是公司最重要的数据资源。 
 	 	联系人管理 
   对客户的联系人信息统一管理,联系人是指客户企业的联系人,即企业的业务人员和客户的哪些人在打交道。 
 	 	客户拜访管理  	 	 	业务员(用户)要开发客户需要去拜访客户,客户拜访信息记录了业务员与客户沟通
交流方面的不足、采取的策略不当、有待改进的地方或值得分享的沟通技巧等方面的信息。 
 	 	综合查询 
 	 	 	客户相关信息查询,包括:客户信息查询、联系人信息查询、商机信息查询等。 
 	 	统计分析 
 	 	 	按分类统计客户信息,包括:客户信息来源统计、按行业统计客户、客户发展数量统计等。 
 	 	系统管理 
   系统管理属于 crm 系统基础功能模块,包括:数据字典、账户管理、角色管理、权限管理、操作日志管理等。 

  

3.2 开发包和版本介绍       下载网址:http://sourceforge.net/projects/hibernate/files/hibernate-orm/5.0.7.Final/

官网打开找到

 

 

 

需求: 保存一个客户实体到数据库

5.1 开发包介绍

 

 

 

1)导入开发包

 

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_address` varchar(128) DEFAULT NULL COMMENT '客户联系地址',
  `cust_phone` varchar(64) DEFAULT NULL COMMENT '客户联系电话',
  PRIMARY KEY (`cust_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

/*创建联系人表*/
CREATE TABLE `cst_linkman` (
  `lkm_id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '联系人编号(主键)',
  `lkm_name` varchar(16) DEFAULT NULL COMMENT '联系人姓名',
  `lkm_gender` char(1) DEFAULT NULL COMMENT '联系人性别',
  `lkm_phone` varchar(16) DEFAULT NULL COMMENT '联系人办公电话',
  `lkm_mobile` varchar(16) DEFAULT NULL COMMENT '联系人手机',
  `lkm_email` varchar(64) DEFAULT NULL COMMENT '联系人邮箱',
  `lkm_position` varchar(16) DEFAULT NULL COMMENT '联系人职位',
  `lkm_memo` varchar(512) DEFAULT NULL COMMENT '联系人备注',
  PRIMARY KEY (`lkm_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

 

在实体类的同级目录创建映射文件

位置:实体类的同级目录

名称:实体类名称.hbm.xml    实体类LinkMan对应表cst_linkman

package com.itheima.entity;

import java.io.Serializable;

/**
 * 实体类LinkMan对应表cst_linkman
 *
 */
public class LinkMan implements Serializable {
    private int id;    //id编号
    private String name; //姓名
    private String genber; //性别
    private String phone; //办公电话
    private String  mobile; //手机
    private String email; //邮箱
    private String position; //职位
    private String memo; //备注
    public LinkMan() {
        super();
    }
    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;
    }
    public String getGenber() {
        return genber;
    }
    public void setGenber(String genber) {
        this.genber = genber;
    }
    public String getPhone() {
        return phone;
    }
    public void setPhone(String phone) {
        this.phone = phone;
    }
    public String getMobile() {
        return mobile;
    }
    public void setMobile(String mobile) {
        this.mobile = mobile;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public String getPosition() {
        return position;
    }
    public void setPosition(String position) {
        this.position = position;
    }
    public String getMemo() {
        return memo;
    }
    public void setMemo(String memo) {
        this.memo = memo;
    }
    @Override
    public String toString() {
        return "LinkMan [id=" + id + ", name=" + name + ", genber=" + genber
                + ", phone=" + phone + ", mobile=" + mobile + ", email="
                + email + ", position=" + position + ", memo=" + memo + "]";
    }
    
}

 

<?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属性:配置类的全名
    table属性:表名
    
     -->
    <class name='com.itheima.entity.LinkMan' table='cst_linkman'>
        <!-- 
        配置的是主键关系,类中的主键属性与表中的主主键字段的关系
        
         -->
        <id name='id' column='lkm_id'>
            <!-- 
                generator:配置主键生成策略
                    class属性:指定主键的生成策略,里面是固定的
                        native:使用数据【mysql】的自增长
             -->
             
             <generator class="native"></generator>
        </id>
        
        <!-- 普通属性 类的属性与表的字段一一对应 -->
        
        <property name="name" column="lkm_name"></property>
        <property name="genber" column="lkm_genber"></property>
        <property name="phone" column="lkm_phone"></property>
        <property name="mobile" column="lkm_mobile"></property>
        <property name="email" column="lkm_email"></property>
        <property name="position" column="lkm_position"></property>
        <property name="memo" column="lkm_memo"></property>
    </class>
</hibernate-mapping>

 

package com.itheima.util;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
/*
 * 获取session工具类
 */
public class HibernateUtil {
    
    private static SessionFactory factory;
    //重量级只需要创建一次
    static{
         Configuration configuration = new Configuration();
         configuration.configure();
         factory = configuration.buildSessionFactory();
    }
    
    /**
     * 使用工厂产生一个session
     * 每一次创建都是新的session
     */
    public static Session operSession(){
        return factory.openSession();
    }
}

 

Hibernate的主配置文件

<?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">
    <!-- 
        主要三部分信息
        1.数据库链接信息
        2.hibernate的配置信息
        3.映射文件位置
     -->
<hibernate-configuration>
    <session-factory>
    <!-- 
        1. 这里面的配置都能从   \hibernate-release-5.0.7.Final\project\etc\hibernate.properties中找到
        连接数据库四要素
        #hibernate.connection.driver_class com.mysql.jdbc.Driver 驱动
        #hibernate.connection.url jdbc:mysql:///test 域名ip
        #hibernate.connection.username gavin 数据库用户名
        #hibernate.connection.password 登陆密码
    -->
    <property name="hibernate.connection.driver_class">
        com.mysql.jdbc.Driver
    </property>
    <property name="hibernate.connection.url">
        jdbc:mysql://localhost:3306/hibernate_day01
    </property>
    <property name="hibernate.connection.username">root</property>
    <property name="hibernate.connection.password">root</property>

    <!-- 2.hibernate的配置信息 -->
    <!-- 配置数据库方言 -->
    <!-- 
        #hibernate.dialect org.hibernate.dialect.MySQLDialect
    -->
    <property name="hibernate.dialect">
        org.hibernate.dialect.MySQLDialect
    </property>

    <!-- 配置显示sql语句  hibernate.show_sql true -->
    <property name="hibernate.show_sql">true</property>

    <!-- 格式化sql语句 hibernate.format_sql true -->
    <property name="hibernate.format_sql">true</property>

    <!-- 
        自动维护表结构
        #hibernate.hbm2ddl.auto create-drop :创建完表就删除
        #hibernate.hbm2ddl.auto create :创建表
        #hibernate.hbm2ddl.auto update :没有表就创建表,有表就更新表
        #hibernate.hbm2ddl.auto validate :验证表
    -->

    <property name="hibernate.hbm2ddl.auto">update</property>
    <!-- 配置c3p0链接池 -->
    <!-- 
        org.hibernate.c3p0.internal.C3P0ConnectionProvider
        #hibernate.connection.provider_class org.hibernate.connection.C3P0ConnectionProvider 错误的 要使用新版的
    -->
    <property name="hibernate.connection.provider_class">
        org.hibernate.c3p0.internal.C3P0ConnectionProvider
    </property>

    <!-- 3.映射文件位置 -->
    <mapping resource="com/itheima/entity/LinkMan.hbn.xml" />

    </session-factory>
</hibernate-configuration>

 

 

操作实例1

package com.itheima.dao;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;

import com.itheima.entity.LinkMan;
import com.itheima.util.HibernateUtil;

public class HibernateTest01 {
    //测试
    
    
    /**
     * 保存一个客户实体类
     * 1.加载配置文件
     * 2.创建SessionFactory
     * 3.打开一个新的Session
     * 4.打开事务
     * 5.保存客户实体
     * 6.提交事务
     * 7.释放资源
     */
    @Test
    public void test01(){
//        //创建配置文件对象
//        Configuration configuration = new Configuration();
//        //调用方法加配置文件
//        configuration.configure();
//        //创建SeesionFactory
//        SessionFactory factory = configuration.buildSessionFactory();
//        //打开一个Session
        Session session = HibernateUtil.operSession();
        //打开事务
        Transaction transaction = session.beginTransaction();
        LinkMan man = new LinkMan();
        man.setName("不是超人也会飞");
        man.setGenber("男");
        man.setPhone("06627583222");
        man.setMobile("13760855501");
        man.setEmail("123@qq.com");
        man.setPosition("程序员");
        man.setMemo("King");
        //保存对象
        session.save(man);
        //提交事务
        transaction.commit();
        //释放资源
        session.close();
        
    }
}

 

 

操作实例2

package com.itheima.dao;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;

import com.itheima.entity.LinkMan;

public class HibernateTest02 {
    //测试
    
    
    /**
     * 保存一个客户实体类
     * 1.加载配置文件
     * 2.创建SessionFactory
     * 3.打开一个新的Session
     * 4.打开事务
     * 5.保存客户实体
     * 6.提交事务
     * 7.释放资源
     */
    @Test
    public void test01(){
        //创建配置文件对象
        /**
         * Configuration
         * 默认构造函数:它只能加载类的根路径下,名称是hibernate.properties的配置文件,不能
         * 加载xml
         * configure() 它用于加载类路径下,名称为hibernate.cfg.xml的配置文件
         * buildSessionFactory():根据配置文件,构建SeesionFactory
         * addResource(String url):指定映射的位置
         * addClass(Class clazz)
         * 指定实体类的字节码
         */
        Configuration configuration = new Configuration();
        //调用方法加配置文件
        configuration.configure();
        //创建SeesionFactory
        /**
         * SessionFactory 接口负责 Hibernate 的初始化和建立 Session 对象。它在 Hibernate 
         * 中起到一个缓冲区作用,Hibernate 可以将自动生成的 SQL 语句、
         * 映射数据以及某些可重复利用的的数据放在这个缓冲区中。
         * 同时它还保存了对数据库配置的所有映射关系,维护了当前的二级缓存。 
         * openSession():每次都是生成一个新的Session
         * 同时,它是一个线程安全的对象,所有由该工厂生产的 Session 都共享工厂中维护的数据。
         * 原则:一个应用应该只有一个 SessionFactory。在应用加载时创建,应用卸载时销毁
         * SessionFactory 内部还维护了一个连接池,如果我们需要使用第三方的连接池如 C3P0,
         * 那么需要我们自己手动进行配置 
         */
        SessionFactory factory = configuration.buildSessionFactory();
        //打开一个Session
        /**
         *  save(Object entity);  :保存一个实体到数据库 
            update(Object entity);:更新一个实体 delete(Object entity);:删除一个实体 
            get(Class clazz,Serializable id);:根据id查询一个实体。参数的含义:Class表示要查询的实
            体类字节码。Serializable就是查询的条件。 
            beginTransaction();:开启事务,并返回事务对象 
         */
        Session session = factory.openSession();
        //打开事务
        Transaction transaction = session.beginTransaction();
        LinkMan man = new LinkMan();
        man.setName("不是超人也会飞");
        man.setGenber("男");
        man.setPhone("06627583222");
        man.setMobile("13760855501");
        man.setEmail("123@qq.com");
        man.setPosition("程序员");
        man.setMemo("King");
        //保存对象
        session.save(man);
        //提交事务
        transaction.commit();
        //释放资源
        session.close();
        factory.close();
        
    }
}

 

 

操作实例3

 

package com.itheima.dao;

import java.sql.Connection;
import java.sql.SQLException;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.jdbc.Work;
import org.junit.Test;

import com.itheima.entity.LinkMan;
import com.itheima.util.HibernateUtil;

public class HibernateTest03 {
    //测试
    
    
    /**
     * c3p0连接池是否配置成功
     */
    @Test
    public void test01(){
        Session session = HibernateUtil.operSession();
        session.doWork(new Work() {
            
            @Override
            public void execute(Connection conn) throws SQLException {
                    System.out.println(conn.getClass().getName());
            }
        });
        
        session.close();
        
    }
}

 

 

操作实例4

package com.itheima.dao;

import java.sql.Connection;
import java.sql.SQLException;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.jdbc.Work;
import org.junit.Test;

import com.itheima.entity.LinkMan;
import com.itheima.util.HibernateUtil;

public class HibernateTest04 {
    //测试
    
    /**
     * 完成客户端的增删改查
     * 
     *  save(Object entity);  :保存一个实体到数据库 
        update(Object entity);:更新一个实体 
        delete(Object entity);:删除一个实体 
        get(Class clazz,Serializable id);:根据id查询一个实体。参数的含义:
        Class表示要查询的实
        体类字节码。Serializable就是查询的条件。 
        beginTransaction();:开启事务,并返回事务对象 

     */
    
    
    /**
     * 增加
     */
    @Test
    public void addTest(){
        
        LinkMan man = new LinkMan();
        man.setName("不是超人也会飞2");
        man.setGenber("男");
        man.setPhone("06627583222");
        man.setMobile("13760855501");
        man.setEmail("123@qq.com");
        man.setPosition("程序员");
        man.setMemo("King");
        Session session = HibernateUtil.operSession();
        //开启事务
        Transaction transaction = session.beginTransaction();
        //保存对象
        session.save(man);
        //提交事务
        transaction.commit();
        //释放资源
        session.close();
    }
    
    /**
     * 查询
     */
    @Test
    public void updateTest(){
        Session session = HibernateUtil.operSession();
        LinkMan man = session.get(LinkMan.class, 2);
        System.out.println(man);
        session.close();
    }
    
    /**
     * 更新
     */
    @Test
    public void findTest(){
        Session session = HibernateUtil.operSession();
        //开启事务
        Transaction transaction = session.beginTransaction();
        LinkMan linkMan = session.get(LinkMan.class, 1);
        //修改
        linkMan.setName("超人会飞");
        
        //更新
        session.update(linkMan);
        //提交事务
        transaction.commit();
        session.close();
    }
    
    /**
     * 删除
     */
    @Test
    public void deleteTest(){
        Session session = HibernateUtil.operSession();
        /*//第一种先查后删除
        LinkMan linkMan = session.get(LinkMan.class, 1);
        //开启事务
        Transaction transaction = session.beginTransaction();
        session.delete(linkMan);
        transaction.commit();*/
        //第二种直接找对象删除
        LinkMan man = new LinkMan();
        man.setId(7);
        Transaction transaction = session.beginTransaction();
        session.delete(man);
        transaction.commit();
        session.close();
    }
}

 

操作实例5

package com.itheima.dao;


import org.hibernate.Session;
import org.junit.Test;

import com.itheima.entity.LinkMan;
import com.itheima.util.HibernateUtil;

public class HibernateTest05 {
    // 测试

    /**
     * 
        OID【查询】实体查询
     */

    /**
     * get方法查询 立即加载 返回一个实体类
     */
    @Test
    public void getTest() {
        Session session = HibernateUtil.operSession();
        //返回一个实体类 get方法一调用就加载
        LinkMan linkMan = session.get(LinkMan.class, 2);
        System.out.println(linkMan);
        session.close();
    }
    
    /**
     * load方法查询 延迟加载 调用在加载
     * 返回一个代理对象 目的为了提高效率
     * 可以在主配置文件中设置是否开启延迟加载
     * lazy=true/false
     */
    @Test
    public void loadTest() {
        Session session = HibernateUtil.operSession();
        //返回一个实体类 get方法一调用就加载
        LinkMan linkMan = session.load(LinkMan.class, 2);
        System.out.println(linkMan);
        session.close();
    }
}

 

posted @ 2018-03-13 14:50  不是超人也会飞  阅读(483)  评论(0)    收藏  举报