博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hibernate框架入门(1)
阅读量:4584 次
发布时间:2019-06-09

本文共 15354 字,大约阅读时间需要 51 分钟。

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 开发包和版本介绍       下载网址:

官网打开找到

 

 

 

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

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 + "]";    }    }

 

 

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的主配置文件

com.mysql.jdbc.Driver
jdbc:mysql://localhost:3306/hibernate_day01
root
root
org.hibernate.dialect.MySQLDialect
true
true
update
org.hibernate.c3p0.internal.C3P0ConnectionProvider

 

 

操作实例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();    }}

 

转载于:https://www.cnblogs.com/jie-jie123/p/8556828.html

你可能感兴趣的文章
shell脚本中大于,大于等于,小于,小于等于、不等于的表示方法
查看>>
xcode 快捷键
查看>>
三十五.MySQL读写分离 MySQL多实例 、MySQL性能调优
查看>>
[LeetCode] 256. Paint House_Easy tag: Dynamic Programming
查看>>
Java基础——面向对象编程一:封装
查看>>
python ==> Django.view(登录,注册,个人页)
查看>>
在maven中没有的jar包如何处理?
查看>>
多线程与UI操作
查看>>
python 打印三角行,金字塔等
查看>>
CSS3 3D下拉折叠菜单
查看>>
判断DOM元素是否出现再浏览器窗口中
查看>>
vue小技巧--window变量
查看>>
pyqt重写键盘事件+获取信号发送对象
查看>>
Spark源码剖析 - SparkContext的初始化(六)_创建和启动DAGScheduler
查看>>
Python 使用Opencv实现图像特征检测与匹配
查看>>
50金句
查看>>
JavaScript------事件
查看>>
SQL锁表语句 (转摘)
查看>>
python--递归、二分查找算法
查看>>
mysql5.7 user表没有password字段,如何重置root密码
查看>>