首先介绍一下javaEE开发的三层架构java
Web层 也被称为表现层 它是表现层的一个设计模型:也就是你们经常使用的MVC开发模式mysql
Service层 它是和需求相关的web
DAO层 它只和数据库打交道,对数据库进行增删改查(CURD)、sql
Hibernate是持久层的框架 只能对数据库进行增删改查数据库
框架的底层其实就是webapi
框架其实就是一个骨架,准备了大量代码:框架的目的就是抽取一些重复性结构的代码,减小程序的开发量 session
而hibernate主要就是替换DAO层的框架,hibernate操做简单,经过保存一个实体对象,自动将数据保存到数据库,形 两个步骤:描述一个实体对象,对应数据库的表架构
描述实体的属性,对应数据库表中的字段oracle
Hibernate的环境搭建app
一、 建立一个项目,导入相关jar包,hibernate的必须包 mysql的jar包 日志包(非必须的包,日志包就是在控制台上打印执行的sql语句)
二、建立实体类和对应的数据库
三、建立一个映射文件 名称为(实体类.hbm.xml)
描述实体类和数据库的关系
描述实体类中字段和数据库表中字段的关系
配置核心文件 文件须要在src下建立hibernate.cfg.xml
配置文件中 基本配置
基本四项(数据库驱动 链接串 用户名 和密码)、
· 其余配置
加载映射文件
下面是一个示例配置
<?xml version="1.0" encoding="UTF-8"?> <!-- 约束 :规定xml的写法--> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.itheima.domain" > <!-- 记忆性知识 1.配置 实体和数据库表的关系 <class> 描述实体和数据库表的关系 name="" 实体的全限定类名 由于用到反射 table="" 对应的数据表名称 lazy 最后一节课 非记忆性知识: catalog="" 数据库名称 package="" 包的名称 若是有了此配置 之后在该包下的全部类 不须要写全限定类名 只须要类的名称 可是若是不是该包下的内容 须要配置全限定名 length="" 表示字段的长度 type="" 表示字段的类型 1.hibernate的类型 string 2.java的类型 java.lang.String 3.数据库类型 varchar() <column name="cust_name" sql-type="数据库类型"></column> 但若是没写 默认使用实体类类的类型 --> <class name="Customer" table="cst_customer" > <!-- 2.配置 实体字段和数据库表字段的关系 2.1 特殊字段 id <id></id> name="" 实体的属性名称 get/set方法 去掉get首字母小写 column="" 数据库表字段的名称 column="" 配置能够省略 前提是实体的字段名称 和数据库的字段名称必须保持一致 但开发中 实体字段使用驼峰式命名规则 cust_name ==>> custName 今天省略 <generator class="native"></generator> 主键生成策略 class="native" 策略名称 native 表示使用数据库默认的本地策略 oracle和mysql的主键生成策略不同 mysql auto_increament 自动增加 oralce sequence 序列 native 自动根据数据库 自动匹配 2.2 普通字段 --> <id name="cust_id" column="cust_id"> <generator class="native"></generator> </id> <!-- 普通字段 --> <property name="cust_name" > <!-- <column name="cust_name" sql-type="数据库类型"></column> --> </property> <property name="cust_source" column="cust_source"></property> <property name="cust_industry" column="cust_industry"></property> <property name="cust_level" ></property> <property name="cust_phone" ></property> <property name="cust_mobile" ></property> </class> </hibernate-mapping>
核心配置文件中的其余配置
<?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">
<hibernate-configuration>
<!--
session-factory session的工厂 建立session对象
此处的session 指的是java和 数据库的会话
session做用 : session内部封装了操做数据的api 等效之前的connction
-->
<session-factory>
<!-- 1.基本四项 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql:///ee291_hibernate_day01</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<!-- 2.其余配置 从配置文件中找 都是优化内容-->
<!-- 配置方言
不一样数据库的基本语法一致 但不一样的数据库有本身的特点
为了方便hibernate生成不一样sql使用
-->
<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>
<!-- ddl : 数据库定义语言 怎么建立表 怎么删除表 怎么给表加字段
没用(测试使用 测试表结构)
create-drop :
先判断数据库存不存在表 若是存在删除 建立新表(根据xml来) 操做数据 操做完之后删除表
数据库没有表 建立表的时候 xml没有指定长度 默认采用该字段的最大长度
create
先判断数据库存不存在表 若是存在删除 建立新表(根据xml来) 操做数据
数据库有表且只有一条记录
重要(上线使用)
update : 以xml为主 修改数据库(仍是以数据库为主 先建立数据库 再写实体类)
validate : 以数据库为主 若是不一致的状况数据库报错
-->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- c3p0链接池
配置后报错
org.hibernate.service.spi.ServiceException: Unable to create requested service
[org.hibernate.engine.jdbc.connections.spi.ConnectionProvider]
缘由是 没有导入c3p0的链接池包
org.hibernate.connection.C3P0ConnectionProvider 不是一个类 而是一个字符串
org.hibernate.c3p0.internal.C3P0ConnectionProvider 这是一个类
为何俩个均可以? 字符串是之前hibernate的早期版本 处理版本兼容问题
-->
<!-- <property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property> -->
<property name="hibernate.connection.provider_class">org.hibernate.c3p0.internal.C3P0ConnectionProvider</property>
<!-- 3.加载映射 -->
<mapping resource="com/itheima/domain/Customer.hbm.xml" />
</session-factory>
</hibernate-configuration>
一个简单的demo
public void demo2(){
详解:
Configuration 加载配置文件
* new Configuration() 表示加载hibernate.properties文件
* .configure() 加载hibernate.cfg.xml
* .configure(路径) 加载hibernate.cfg.xml
* buildSessionFactory() 构建session工厂
* configuration.addResource(resourceName) 加载映射文件 在核心配置文件中加载过了
* configuration.addClass(Class) 加载实体类.class 要求 映射文件的名称必须是 实体类名.hbm.xml
*SessionFactory 由Configuration加载核心配置文件建立(基本四项)
* SessionFactory 做用 建立session对象
* SessionFactory 加载须要浪费大量资源 工厂通常不关闭
Configuration configuration = new Configuration().configure();
SessionFactory sessionFactory = configuration.buildSessionFactory();
Transaction transaction = session.beginTransaction();//开启事务
Customer customer = new Customer();
customer.setCust_name("门三三石22");
session.save(customer);
transaction.commit(); //事务提交
session.close();
sessionFactory.close();
session对象内部封装了一套对数据库的增删改查的方法
1.查询 get(Object)
* 2.增长 save(Object)
* 3.修改 update(Object)
* 4.删除 delete(Object)
只须要将须要操做的对象传入便可
详细的操做能够在hibernate的doc文件中查找其具体操做方法
}