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

浙公网安备 33010602011771号