hibernate笔记1——核心配置、映射配置

〇 路线图

在这里插入图片描述

一 CRM

1. 概述

Customer Relationship Management 客户关系管理

2. CRM的模块

在这里插入图片描述

二 框架

相当于是一个软件的半成品,已经完成了一部分的功能。

2. EE的三层架构

  • WEB层(servlet、JSP)
  • 业务(service)层(JavaBean)
  • 持久层(DAO)(JDBC)
    这套架构可以以开发市面上所有应用。但是在企业中不会使用(过于底层)。企业中开发一般使用SSH(Structs+Spring+Hibernate)、SSM(SpringMVC+Spring+Mybatis)。
    在这里插入图片描述

二 hibernate

1. 概述

Hibernate框架是当今主流的java持久层框架之一。是一个开放源代码的ORM(Object Relational Mapping对象关系映射)。

2.优点

  • Hibernate对JDBC访问数据库的代码做了轻量级的封装,大大简化了数据访问层繁琐的重复性代码,并且减少了内存消耗,加快了运行效率。
  • Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现,它很大程度的简化了DAO(Data Access Object,数据访问对象)层编码工作。
  • Hibernate的性能非常好,映射的灵活性很出色。它支持很多关系型数据库,从一对一到多对多的各种复杂关系。
  • 可扩展性强,由于源代码的开源以及API的开放,当本身功能不够用时,可以自行编码进行扩展。

3.开始前的准备工作。

(1)创建项目,引入jar包

  • 数据库驱动包
  • Hibernate开发必须的包
  • Hibernate引入日志记录包
    在这里插入图片描述

(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_phone` varchar(64) DEFAULT NULL COMMENT '固定电话',
  `cust_mobile` varchar(16) DEFAULT NULL COMMENT '移动电话',
  PRIMARY KEY (`cust_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

(3)创建实体类

public class Customer {
	private Long cust_id;
	private String cust_name;
	private String cust_source;
	private String cust_industry;
	private String cust_level;
	private String cust_phone;
	private String cust_mobile;
	setXxx();
	getXxx();
}

(4)创建映射

映射需要通过XML的配置文件来完成,这个配置文件可以任意命名。尽量统一命名规范(类名.hbm.xml)
DOCTYPE 来自 lib/hibernate-core-5.0.7.Final.jar/org/hibernate/hibernate-mapping-3.0.dtd
建立字段 来自类中的属性和表中的字段

<?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="com.jingt.hibernate.demo1.Customer" table="cst_customer">
	<!-- 建立类中的属性与表中的主键对应 -->
	<id name="cust_id" column="cust.id">
		<generator class="native"/>
	</id>
	
	<!-- 建立类中的普通属性和表的字段的对应 -->
	<property name="cust_name" colum="cust_name"/>
	<property name="cust_source" colum="cust_source"/>
	<property name="cust_industry" colum="cust_industry"/>
	<property name="cust_level" colum="cust_level"/>
	<property name="cust_phone" colum="cust_phone"/>
	<property name="cust_mobile" colum="cust_mobile"/>
	</class>
</hibernate-mapping>

(5)创建hibernate的核心配置文件(在src下创建)

Hibernate的核心配置文件的名称:hibernate.cfg.xml
DOCTYPE 来自 lib/hibernate-core-5.0.7.Final.jar/org/hibernate/hibernate-configuration-3.0.dtd
基本参数来自 hibernate-release-5.0.7.Final\project\etc\hibernate.properties

<!DOCTYPE hibernate-configuration PUBLIC
	"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
	"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
	
<hibernate-configuration>
	<session-factory>
	<!-- 连接数据库的基本参数 -->
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="hibernate.connection.url">jdbc:mysql:///hibernate_day01</property>
		<property name="hibernate.connection.username">root</property>
		<property name="hibernate.connection.password">7426</property>
		<!-- 配置Hiberbate的方言 -->
		<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
		
		<!-- 可选配置============== -->
		<!-- 打印SQL语句 -->
		<property name="hibernate.show_sql">true</property>
		<!-- 格式化SQL -->
		<property name="hibernate.format_sql">true</property>
		<!-- 可选配置=============== -->
		<mapping resoure="com/jingt/hibernate/demo1/Customer.hbm.xml"/>
	</session-factory>
</hibernate-configuration>

4. 编写代码。

创建Configuration对象,并通过它来读取并解析配置文件hibernate.cfg.xml。然后创建SessionFactory读取解析映射文件信息,并将Configuration对象中的所有配置信息拷贝到SessionFactory内存中。接下来打开Session,让SessionFactory提供连接,并开启一个事务,之后创建对象,向对象中添加上数据,通过session.save()方法完成想数据库中保存数据的操作。最后提交事务,并且关闭资源。

public class HibernateDemo1 {
	//使用Hibernate保存客户信息
	@Test
	public void run() {
		//1 加载配置文件
		Configuration configuration = new Configuration().configure();
		//2 创建一个SessionFactory对象
		SessionFactory sessionFactory = configuration.buildSessionFactory();
		//3 创建一个Session对象,类似于JDBC中的Connection
		Session session = sessionFactory.openSession();
		//4 开启事务
		Transaction transaction = session.beginTransaction();
		//5 执行相关操作
		Customer customer = new Customer();
		customer.setCust_name("黄麒宁");
		session.save(customer);
		//6 提交事务
		transaction.commit();
		//7 释放资源
		session.close();
	}
}

5. hibernate的常见配置。

(1)hibernate映射的配置

  • class标签的配置
    • 用来建立类与表的映射关系
    • 属性:
      • name :类的全路径
      • table :表名(如果类名和表名一致,table可以省略)
      • catlog :数据库名(可以不填)
  • id标签的配置
    • 用来建立类中的属性与表中的主键的对应关系
    • 属性:
      * name :类中的属性名
      * column :表中的字段名(类中的属性名和表中的字段名一直,column可以省略)
      * length :长度 (用于创建映射的表)
      * type :类型 (可以不用写)
  • property标签的配置
    • 用来建立类中的普通属性与表的字段的对应关系
    • 属性:
      • name :类中的属性名
      • column :表中的字段名
      • length :长度
      • type :类型
      • not-null :设置true非空
      • unique :设置true唯一

(2)hibernate核心的配置

  • 必须的配置
    • 连接数据库的基本参数(在hibernate-release-5.0.7.Final\project\etc\hibernate.properties文件中找)
      • 驱动类 com.mysql.jdbc.Driver
      • url路径 jdbc:mysql:///项目名(三个/代表省略了项目路径)
      • 用户名
      • 密码
    • 方言(在hibernate-release-5.0.7.Final\project\etc\hibernate.properties文件中找)
  • 可选的配置
    • 显示sql语句 <property name="hibernate.show_sql">true</property>
    • 格式化sql语句 <property name="hibernate.format_sql">true</property>
    • 自动建表<property name="hibernate.hbm2ddl.auto">update</property>
      • none:不使用hibernate的自动建表
      • create:如果数据库中已经有表了,删除原有表重新创建。没有就新建。(测试)
      • create-drop:如果数据库中已经有表了,删除原有表执行操作,删除这个表。没有就新建,使用完了删除该表。(测试,需要关sessionFactory)
      • update:如果数据库中已经有表了,使用原有表。没有就新建。(可以更新表结构)
      • validate:如果没有表不创建,只会使用数据库中原有的表。它会校验表结构,如果表结构不对会报错。
  • 映射文件的引入
    • 通过< mapping>标签引入映射文件的位置<mapping resource="com/jingt/hibernate/demo1/Customer.hbm.xml"/>

(3)hibernate核心配置的两种方式

i 属性文件的配置

hibernate.properties

    hibernate.connection.driver_class=com.mysql.jdbc.Driver
    ...
    hibernate.connection.password=abc

属性文件的方式不能引入映射文件(手动编写代码加载映射文件)

ii xml文件的配置

hibernate.cfg,xml
通过上面核心配置的标签

6. hibernate的核心API。

(1)Configuration:Hibernate的配置对象

通过该类的对象对Hibernate进行配置,对它进行启动。在Hibernate启动过程中,Configuration类的实例首先定位映射文件的位置,读取这些配置,然后创建一个SessionFactory对象。是启动hibernate时所遇到的第一个对象。

  • 作用:
    • 加载核心配置文件
    • 加载映射文件

(2)SessionFactory:Session工厂对象

SessionFactory接口负责Hibernate的初始化和建立Session对象。用到了工厂模式。一般情况下,一个项目通常只需要一个SessionFactory,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。
SessionFactory内部维护了Hibernate的连接池和Hibernate的二级缓存。是线程安全的对象。一个项目创建一个对象即可。

抽取一个工具类
public class HibernateUtils {
	//Hibernate的工具类
	public static final Configuration cfg;
	public static final SessionFactory sf;
	static {
		cfg = new Configuration().configure();
		sf = cfg.buildSessionFactory();
	}
	public static Session openSession() {
		return sf.openSession();
	}
}

(3)Session:类似Connection对象是连接对象

Session代表的是Hibernate与数据库连接的对象,是非线程安全的(必须定义在方法内部,否则会有线程安全问题)。与数据库交互的桥梁。

Session中的API
Serializable save(Object obj);			//向数据库保存数据,返回可序列化的ID。
<T> T get(Class c,Serializable id);		//查询对象
<T> T load(Class c,Serializable id);	//查询对象
void update(Object obj);				//修改对象,建议先查询再删除
void delete(Object obj);				//删除对象,先查询再删除
void saveOrUpdate();					//保存或更新
  • get()方法和load()方法的区别:
    • get()方法
      • 立即加载,执行到这行代码就会马上发送SQL语句进行查询。
      • 返回的是真实对象本身。
      • 查询找不到的对象时,返回null
    • load()方法
      • 采用延迟加载(lazy懒加载),执行到这行代码不会发送SQL语句,到真正使用这个对象的时候才会发送SQL语句。
      • 查询返回的是代理对象。
      • 查询找不到的对象时,返回ObjectNotFoundException

(4)Transaction:事务对象

Hibernate中管理事物的对象

Transaction的API
void commit();		//提交事务
void rollback();	//回滚事务

7. 抽取工具类

public class HibernateUtils {
	public static final Configuration c;
	public static final SessionFactory sf;
	
	static {
		c = new Configuration().configure();
		sf = c.buildSessionFactory();
	}
	
	public static Session openSession() {
		Session s = sf.openSession();
		return s;
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值