Hibernate学习笔记_01
1.Hibernate是什么
Hibernate是一种Java语言下的对象关系映射解决方案,作为一款优秀的全自动持久层框架,深受广大开发者的青睐.它为面向对象的领域模型到传统的关系型数据库的映射,提供了一个使用方便的框架。那么什么是框架呢?
用通俗的话来说,框架的特点有以下三个:
- 框架是用来提高开发效率的,就像做房子一样,需要使用各种各样的工具来配合使用,而框架就好比一个工具箱,提供各种封装好的工具给开发者使用,提高效率.
- 框架封装好了一些功能,我们需要使用这些功能时可以直接去调用,不需要再手动去自己实现.
- 框架也可以看成一个半成品的项目,只要懂得如何去驾驭这些功能即可
那么Hibernate框架是什么呢?在JavaWeb开发中位于哪一部分呢?通过下图读者可以了解到一些
大家都知道JavaWeb开发遵循的MVC原则,Hibernate就处于Model层的Dao层,代替了之前的JDBC|DBUtils来方便我们对数据库进行操作,其优点就是在书写SQL语句时可以采用面向对象的方式来书写,不需要书写SQL语句,更符合我们面向对象开发的思路习惯.
同时Hibernate也是一款ORM(orm:object relationg mapping. 对象关系映射)框架
ORM也分为4个等级,hibernate属于4级:完全面向对象操作数据库,mybatis属于2级,dbutils属于1级.
2.Hibernate框架的搭建
- 导jar包
2.驱动包,在这里以mysql驱动包为示例
3.创建数据库,准备表,实体
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_linkmen` VARCHAR (64) 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.书写orm元数据(对象与表的映射配置文件
Ⅰ.导入约束
Ⅱ.实体(要有Get/Set方法
private long cust_id; private String cust_name; private String cust_source; private String cust_industry; private String cust_level; private String cust_linkmen; private String cust_phone; private String cust_mobile;
Ⅲ.ORM元数据
<!-- 配置表与实体对象之间的关系 --> <!-- package属性:填写一个包名(实体所在的包),在元素内部凡是需要书写完整类名的属性,可以直接书写简单类名 --> <hibernate-mapping package="com.jhdx.domain"> <class name="Customer" table="cst_customer"> <id name="cust_id" column="cust_id"> <generator class="native"></generator> </id> <property name="cust_name" column="cust_name"></property> <property name="cust_source" column="cust_source"></property> <property name="cust_industry" column="cust_industry"></property> <property name="cust_level" column="cust_level"></property> <property name="cust_linkmen" column="cust_linkmen"></property> <property name="cust_phone" column="cust_phone"></property> <property name="cust_mobile" column="cust_mobile"></property> </hibernate-mapping>
4.书写主配置文件
<hibernate-configuration> <!-- #hibernate.dialect org.hibernate.dialect.MySQLDialect #hibernate.dialect org.hibernate.dialect.MySQLInnoDBDialect #hibernate.dialect org.hibernate.dialect.MySQLMyISAMDialect #hibernate.connection.driver_class com.mysql.jdbc.Driver #hibernate.connection.url jdbc:mysql:///test #hibernate.connection.username gavin #hibernate.connection.password --> <session-factory> <!-- 数据库驱动 --> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <!-- 数据库URL "///"代表本机 --> <property name="hibernate.connection.url">jdbc:mysql:///crm</property> <!-- 数据库连接用户名 --> <property name="hibernate.connection.username">root</property> <!-- 数据库连接密码 --> <property name="hibernate.connection.password">123456</property> <!-- 数据库方言 不同的数据库中,SQL语法略有区别.指定方言可以让Hibernate框架在生成sql语句时,针对数据库的方言生成 --> <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property> <!-- #hibernate.show_sql true #hibernate.format_sql true --> <!-- 将Hibernate生成的SQL语句打印到控制台 --> <property name="hibernate.show_sql">true</property> <!-- 将Hibernate生成的SQL语句格式化 --> <property name="hibernate.format_sql">true</property> <!-- ## auto schema export 自动导出表结构,自动建表 #hibernate.hbm2ddl.auto create-drop 自动建表,每次框架运行结束都会将表删除(开发环境中测试使用) #hibernate.hbm2ddl.auto create 自动建表,每次框架运行都会自动创建新的表,以前的表将会被覆盖,数据会丢失(开发环境中测试使用) #hibernate.hbm2ddl.auto update(推荐使用) 自动生成表,如果已存在不会再生成,如果表有变动,自动更新表.(不会删除任何数据) #hibernate.hbm2ddl.auto validate 校验,不自动生成表,每次启动会校验数据库中的表是否正确 --> <property name="hibernate.hbm2ddl.auto">update</property> <!-- 引入ORM元数据 路径书写:填写src下的路径 --> <mapping resource="com/jhdx/lg/Customer.hbn.xml"/> </session-factory> </hibernate-configuration>
5.书写代码测试
public class Demo { @Test // 保存客户操作 public void saveCustomer() { Configuration conf = new Configuration().configure(); SessionFactory sessionFactory = conf.buildSessionFactory(); Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); //------------------------------------------ Customer c = new Customer(); c.setCust_name("新浪公司"); session.save(c);//执行保存 //------------------------------------------ tx.commit(); session.close(); sessionFactory.close(); } }
3.配置文件详解
Ⅰ.orm元数据
根元素
class元素
id元素
property元素
Ⅱ.hibernate主配置
必选属性配置(5个)
可选属性配置(3个)
元数据引入配置
4.HibernateAPI详解
Ⅰ.Configuration
//1.创建.调用空参构造 Configuration conf = new Configuration();
//2.读取指定主配置文件 =>空参加载方法,加载src目录下hibernate.cfg.xml文件 conf.configure();
//3.读取指定orm元数据(扩展),如果主配置中已经引入映射配置,则不需要手动加载 //conf.addResource(resourceName); //conf.addClass(persistentClass);
//4.根据配置信息,创建SessionFactory对象 SessionFactory sf = conf.buildSessionFactory();
Ⅱ.SessionFactory
/*学习SessionFactory对象 SessionFactory功能:用于创建操作数据库对象的核心对象Session对象的工厂 简单说功能就一个 ===> 创建session对象 注意: 1.SessionFactory负责保存和使用所有的配置信息,消耗内存资源非常大2.SessionFactory属于线程安全的对象设计. 结论:保证在Web项目中只创建一个SessionFactory. */ //5.获得Session //打开一个新的Session对象 sf.openSession(); //获得一个与线程绑定的Session对象 sf.getCurrentSession();
Ⅲ.Session
// 学习Session对象 // Session对象功能: 表达Hibernate框架与数据库之间的连接(会话). // session类似于JDBC年代的Connection对象,还可以完成对数据库中数据的增删改查操作. // session是Hibernate操作数据库的核心对象 // 6.session获得操作事务的Transition对象 // 获得操作事务的tx对象 Transaction tx = session.getTransaction();
// 开启事务并获得操作事务的tx对象(建议使用)
Transaction tx2 = session.beginTransaction();
//增 Customer c = new Customer(); c.setCust_name("百度"); session.save(c); //查 Customer customer = session.get(Customer.class, 1l); System.out.println(customer); //改 // 1 获得要修改的对象 Customer c = session.get(Customer.class, 1l); // 2 修改 c.setCust_name("老王"); // 3 执行update session.update(c); //删 // 1 获得要修改的对象 Customer c = session.get(Customer.class, 1l); // 2 调用delete删除对象 session.delete(c);
Ⅳ.Transaction
封装了事务的操作
//打开事务 //方式一 // 获得操作事务的tx对象 Transaction tx = session.getTransaction(); tx.begin(); //方式二 // 开启事务并获得操作事务的tx对象(建议使用) Transaction tx2 = session.beginTransaction(); tx2.commit();// 提交事务 tx2.rollback();// 事务回滚