目录
一、hibernate简介
1.1 hibernate是什么
hibernate是一个orm数据库访问框架,能让我们以面向对象的思想来操作数据库,非常的简洁和方便。
1.2 hibernate的位置
1.3 ORM的概念
orm全称 object relationg mapping. 对象关系映射
orm分4级
dbutil属于1级,简单的封装;mybatis属于2级;hibernate属于4级,完全面向对象 操作。
二、hibernate框架的搭建
2.1 导包
导入required包
导入驱动包
2.2 配置对象关系映射
建表
编写类
package cn.itcast.bean;
public class Customer {
public int id;
public String name;
public int age;
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 int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
配置Customer.hbm.xml文件映射
导入约束:<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/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 package="cn.itcast.bean">
<class name="Customer" table="customer">
<id name="id" column="id">
<generator class="native"></generator>
</id>
<property name="name" column="name"></property>
<property name="age" column="age"></property>
</class>
</hibernate-mapping>
2.3 配置主文件
hibernate.cfg.xml
<?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>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql:///hibernate</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<mapping resource="cn/itcast/bean/Customer.hbm.xml" />
</session-factory>
</hibernate-configuration>
2.4 测试
package cn.itcast.test;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;
import cn.itcast.bean.Customer;
public class Demo {
@Test
public void testSave(){
Configuration config = new Configuration().configure();
SessionFactory sessionFactory = config.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Customer customer = new Customer();
customer.setName("hibernate");
customer.setAge(58);
session.save(customer);
transaction.commit();
session.close();
sessionFactory.close();
}
}
输出如下:
三、配置文件详解
3.1 orm 元数据
一般的,orm元数据配置文件一类名+.hbm.xml结束,约定大于配置。
整体配置:
<?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 package="cn.itcast.bean">
<class name="Customer" table="customer">
<id name="id" column="id">
<generator class="native"></generator>
</id>
<property name="name" column="name"></property>
<property name="age" column="age"></property>
</class>
</hibernate-mapping>
根元素:
配置表与实体的映射关系
package:填写一个包名,以后用到包内的某个类,就可以直接写类名了 这里的实体包名为cn.itcast.bean,我们要用下边的Customer来映射
<hibernate-mapping package="cn.itcast.bean" >
</hibernate-mapping>
class元素:
class:配置实体与表的映射关系
name:某个实体的完整类名,因为上边已经用了package属性,所以只用写上类名就可以
table:要映射的表名称 对应我们数据库中的customer
<class name="Customer" table="customer">
</class>
id元素:
id:配置主键映射的属性
name:填写主键对应的属性名
column(可选):填写表中的主键列名。默认值:列名会默认使用属性名
type(可选):填写列(属性)的类型。hibernate会自动检测实体的数据类型。 每个类型有三种填法:java类型、hibernate类型、数据库类型
not-null(可选):配置该属性(列)是否不能为空。默认是:false,可以为空。
length(可选):配置数据库中列的长度。默认值:使用数据库中类型最大的长度。
<id name="id" column="id">
<generator class="native"></generator>
</id>
property元素:
property: 除id以外其他属性名的映射 和id的基本一样
name:填写主键对应的属性名 column(可选):填写表中的主键列名。默认值:列名会默认使用属性名
type(可选):填写列(属性)的类型。hibernate会自动检测实体的数据类型。
每个类型有三种填法:java类型、hibernate类型、数据库类型
not-null(可选):配置该属性(列)是否不能为空。默认是:false,可以为空。
length(可选):配置数据库中列的长度。默认值:使用数据库中类型最大的长度。
<property name="name" column="name"></property>
<property name="age" column="age"></property>
整体配置:
<?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">
<!-- 配置表与实体的映射关系 -->
<!-- package:填写一个包名,以后用到包内的某个类,就可以直接写类名了 这里的实体包名为cn.itcast.bean,我们要用下边的Customer来映射 -->
<hibernate-mapping package="cn.itcast.bean">
<!-- class:配置实体与表的映射关系 name:某个实体的完整类名,因为上边已经用了package属性,所以只用写上类名就可以 table:要映射的表名称
对应我们数据库中的customer -->
<class name="Customer" table="customer">
<!-- id:配置主键映射的属性
name:填写主键对应的属性名 column(可选):填写表中的主键列名。默认值:列名会默认使用属性名
type(可选):填写列(属性)的类型。hibernate会自动检测实体的数据类型。
每个类型有三种填法:java类型、hibernate类型、数据库类型
not-null(可选):配置该属性(列)是否不能为空。默认是:false,可以为空。
length(可选):配置数据库中列的长度。默认值:使用数据库中类型最大的长度。 -->
<id name="id" column="id">
<generator class="native"></generator>
</id>
<!-- property: 除id以外其他属性名的映射 和id的基本一样
name:填写主键对应的属性名 column(可选):填写表中的主键列名。默认值:列名会默认使用属性名
type(可选):填写列(属性)的类型。hibernate会自动检测实体的数据类型。
每个类型有三种填法:java类型、hibernate类型、数据库类型
not-null(可选):配置该属性(列)是否不能为空。默认是:false,可以为空。
length(可选):配置数据库中列的长度。默认值:使用数据库中类型最大的长度。
-->
<property name="name" column="name"></property>
<property name="age" column="age"></property>
</class>
</hibernate-mapping>
3.2 主配置文件
<?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>
数据库驱动
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
数据库连接
<property name="hibernate.connection.url">jdbc:mysql:///hibernate</property>
用户名
<property name="hibernate.connection.username">root</property>
密码
<property name="hibernate.connection.password">root</property>
数据库方言 针对不同的数据库生成不同的sql语句,标准的sql语句都一样,但不同的数据库对于同一个功能有不同的语法
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
显示sql和sql语句格式化
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>
## auto schema export 自动导出表结构. 自动建表
#hibernate.hbm2ddl.auto create 自动建表.每次框架运行都会创建新的表.以前表将会被覆盖,表数据会丢失.(开发环境中测试使用)
#hibernate.hbm2ddl.auto create-drop 自动建表.每次框架运行结束都会将所有表删除.(开发环境中测试使用)
#hibernate.hbm2ddl.auto update(推荐使用) 自动生成表.如果已经存在不会再生成.如果表有变动.自动更新表(不会删除任何数据).
#hibernate.hbm2ddl.auto validate 校验.不自动生成表.每次启动会校验数据库中表是否正确.校验失败.
<property name="hibernate.hbm2ddl.auto">update</property>
引入元数据配置的路径
<mapping resource="cn/itcast/bean/Customer.hbm.xml" />
</session-factory>
</hibernate-configuration>
四、hibernate api详解
4.1 代码解读
package cn.itcast.test;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;
import cn.itcast.bean.Customer;
public class Demo {
@Test
public void testSave(){
//创建hibernate配置对象
Configuration config = new Configuration();
//调用configure 加载配置,默认加载src下的hibernate.cfg.xml
config.configure();
//根据配置信息 创建sessionFactory 对象
SessionFactory sessionFactory = config.buildSessionFactory();
//打开一个回话连接,相当于jdbc中的openConneciton了。
Session session = sessionFactory.openSession();
//开启事务并使用该事务提交,也可以不用
Transaction transaction = session.beginTransaction();
//保存操作
Customer customer = new Customer();
customer.setName("hibernate");
customer.setAge(58);
session.save(customer);
//提交事务
transaction.commit();
//处理善后问题,关闭资源
session.close();
sessionFactory.close();
}
}
4.2 sessionFactory对象
sessionFactory功能:用于创建操作数据库核心对象session对象的工场,简单涞水就是创建session对象
注意:1.sessionFactory 负责保存和使用所有配置信息。消耗内存资源非常大。可以把sessionFactory看成一个数据库,
hibernate.cfg.xml 可以配置多个sessionFactory就可以实现多个数据库。
session对象可以看做每个数据库的连接了。
2.sessionFactory数据线程安全的对象设计。
结论:在web项目中,只创建一个sessionFactory
4.3 增删改查
增加:
//保存操作
Customer customer = new Customer();
customer.setName("hibernate");
customer.setAge(58);
session.save(customer);
查询:
Customer customer = session.get(Customer.class, 1);
System.out.println(customer);
修改(一般需要先查出来,然后对相应属性修改复制,然后更新):
Customer customer = session.get(Customer.class, 1);
customer.setName("修改");
session.update(customer);
删除:
Customer customer = session.get(Customer.class, 1);
session.delete(customer);
五:总结
今天我们队hibernate有了一个初步的了解,基本的使用方法就是这样了。我们后续继续学习深入的内容