一、Hibernate 简介

1、Hibernate 简介

  Hibernate是一个开放源代码的对象关系映射(ORM)框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。Hibernate 是传统 Java 对象和数据库服务器之间的桥梁,用来处理基于 O/R 映射机制和模式的那些对象。

2、Hibernate 优缺点

  优点与缺点都是相对的,那么讲一个东西的优缺点我们都需要一个参数对比,而咱们要来进行对比的咱们操作数据的原生的JDBC:

1、JDBC的优缺点

本质:处理Java对象和关系型数据库表之间的转换。

优点:

  操作数据库最底层,性能最高(需要你是有相应的经验,并且是一个数据库高手)。

缺点:  

1、使用复杂(重复代码太多)。

2、移植数据库很麻烦,改动比较多;主键的生成方式不同(mysql使用自增,oracle使用序列);分页的sql语句也是不同(mysql使用limit,oracle使用ROWNUM)。

3、性能优化得自己处理,没有提供数据的缓存。

4、面向sql语句操作,不是面向对象的。

2、hibernate的优缺点

  本质:处理Java对象和关系型数据库表之间的转换,只是对JDBC再次做了一层封装。

优点:

1、程序员操作很简单,代码简单 session.save(user);

2、直接面向对象操作。

3、提供世界级数据缓存(现在几乎所有的ORM框架的缓存都是学的Hibernate);一级缓存,二级缓存,查询缓存。

4、数据库移植性很强,很少的修改;把各种数据库抽取了一个方言接口;不同数据库实现一个方言接口,如果换了数据库,必须修改方言实现,驱动jar文件,连接数据库信息。

缺点:

1、不能干预sql语句的生成;session.get(User.class,id); 默认查询t_user表的所有字段,自动生成select user0_.id,user0_.name,user0_.age from t_user user0_ where    user0_.id=?

2、一个项目中,如果对sql语句的优化要求比较高,不适合用hibernate(不过可以使用 Hibernate 对原生sql 的支持来解决)。

3、如果一张表中有上亿级别的数据量,也不适合用hibernate,其实也不适合用jdbc(可以使用数据库读写分离,分库分表方案解决)。

二、Hibernate 入门

1、步骤

1、拷贝jar包

2、建立 pojo

Product 类:

 package com.hibernate.pojo;

 /**
* @author zt1994 2018/3/6 14:16
*/
public class Product {
private Integer id;
private String name;
private float price; public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public float getPrice() {
return price;
} public void setPrice(float price) {
this.price = price;
}
}

3、建立映射文件

Product.hbm.xml 映射文件:

 <!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <!--映射文件-->
<hibernate-mapping package="com.hibernate.pojo">
<!--class表示一个由hibernate管理的持久对象,对应数据库中一个表-->
<!--table数据库的表名-->
<class name="Product" table="product">
<id name="id" type="int" column="id">
<!--generator表示主键的生成方式,native自动选择数据库本地的策略-->
<generator class="native"/>
</id>
<!--非主键属性-->
<property name="name" column="name" type="string"/>
<property name="price" column="price" type="float"/>
</class>
</hibernate-mapping>

4、建立hibernate核心配置文件

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核心配置文件-->
<hibernate-configuration>
<session-factory>
<property name="dialect">
org.hibernate.dialect.MySQLDialect
</property>
<!--链接池配置-->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/how2java</property>
<property name="connection.username">root</property>
<property name="connection.password">admin</property>
<!--显示sql语句-->
<property name="show_sql">true</property> <!-- 映射文件-->
<mapping resource="mapper/Product.hbm.xml"/>
</session-factory>
</hibernate-configuration>

5、编辑dao实现类

dao 接口:

 package com.hibernate.dao;

 import com.hibernate.pojo.Product;

 import java.util.List;

 public interface IProductDao {

     /**
* 添加产品
* @param product
* @return
*/
void addProduct(Product product);
}

dao 实现:

 package com.hibernate.dao.impl;

 import com.hibernate.dao.IProductDao;
import com.hibernate.pojo.Product;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration; import java.util.List; /**
* @author zt1994 2018/3/6 14:40
*/
public class ProductDaoImpl implements IProductDao { @Override
public void addProduct(Product product) {
//1.读取并解析配置文件
Configuration configuration = new Configuration();
//2.加载配置文件,如果不设置加载默认配置文件hibernate.cfg.xml
configuration.configure("hibernate.cfg.xml");
//3.生成会话工厂
SessionFactory sessionFactory = configuration.buildSessionFactory();
//4.获取session
Session session = sessionFactory.openSession();
//5.开启事务
Transaction transaction = session.getTransaction();
transaction.begin();
//6.操作CRUD
session.save(product);
transaction.commit();
//7.关闭资源
session.close();
sessionFactory.close();
}
}

6、测试

 package com.hibernate.test;

 import com.hibernate.dao.IProductDao;
import com.hibernate.dao.impl.ProductDaoImpl;
import com.hibernate.pojo.Product;
import org.junit.Test; /**
* @author zt1994 2018/3/6 14:47
*/
public class TestProductDao {
private IProductDao productDao = new ProductDaoImpl(); /**
* 测试添加商品
*/
@Test
public void testAddProduct(){
Product product = new Product();
product.setName("test");
product.setPrice(2222);
productDao.addProduct(product);
}
}

Hibernate 学习(一)的更多相关文章

  1. Hibernate学习之——搭建log4j日志环境

    昨天讲了Hibernate开发环境的搭建以及实现一个Hibernate的基础示例,但是你会发现运行输出只有sql语句,很多输出信息都看不见.这是因为用到的是slf4j-nop-1.6.1.jar的实现 ...

  2. Hibernate学习笔记(二)

    2016/4/22 23:19:44 Hibernate学习笔记(二) 1.1 Hibernate的持久化类状态 1.1.1 Hibernate的持久化类状态 持久化:就是一个实体类与数据库表建立了映 ...

  3. Hibernate学习笔记(一)

    2016/4/18 19:58:58 Hibernate学习笔记(一) 1.Hibernate框架的概述: 就是一个持久层的ORM框架. ORM:对象关系映射.将Java中实体对象与关系型数据库中表建 ...

  4. Hibernate 学习笔记一

    Hibernate 学习笔记一 今天学习了hibernate的一点入门知识,主要是配置domain对象和表的关系映射,hibernate的一些常用的配置,以及对应的一个向数据库插入数据的小例子.期间碰 ...

  5. Hibernate学习笔记-Hibernate HQL查询

    Session是持久层操作的基础,相当于JDBC中的Connection,通过Session会话来保存.更新.查找数据.session是Hibernate运作的中心,对象的生命周期.事务的管理.数据库 ...

  6. 我的hibernate学习记录(二)

    通过上一篇文章我的hibernate学习记录(一)基本上的入门了hibernate,但是,里面还有还多东西是通过迷迷糊糊的记忆,或者说copy直接弄进去的,所以这篇文章就需要对上篇的一些文件.对象进行 ...

  7. Hibernate学习(二)关系映射----基于外键的单向一对一

    事实上,单向1-1与N-1的实质是相同的,1-1是N-1的特例,单向1-1与N-1的映射配置也非常相似.只需要将原来的many-to-one元素增加unique="true"属性, ...

  8. Hibernate学习一:Hibernate注解CascadeType

    http://zy19982004.iteye.com/blog/1721846 ———————————————————————————————————————————————————————— Hi ...

  9. Hibernate学习---缓存机制

    前言:这些天学习效率比较慢,可能是手头的事情比较多,所以学习进度比较慢. 在之前的Hibernate学习中,我们无论是CURD,对单表查询还是检索优化,我们好像都离不开session,session我 ...

  10. hibernate学习系列-----(2)hibernate核心接口和工作机制

    在上一篇文章hibernate学习系列-----(1)开发环境搭建中,大致总结了hibernate的开发环境的搭建步骤,今天,我们继续了解有关hibernate的知识,先说说这篇文章的主要内容吧: C ...

随机推荐

  1. python设计模式-适配器

    定义: 将一个接口转换为客户希望的另一个接口,该模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作 适配器模式又叫变压器模式,也叫包装模式(Wrapper),它的核心思想是将一个对象经过包装 ...

  2. Servlet实现Cookie读写

    前言 程序员老婆让程序员去外面买东西,说,老公,你出去买一笼包子吧,遇到卖西瓜的就买一个.老公高兴的出去了,一会儿带着一个包子回来了,老婆很是郁闷问,怎么只买了一个包子,程序员说:因为我看到卖西瓜的了 ...

  3. ArchLinux 下文件描述符

    stderr -> /proc/self/fd/2 标准错误:2 stdin -> /proc/self/fd/0 标准输入:0 stdout -> /proc/self/fd/1 ...

  4. 移动 UX 设计:如何设计推送通知

    这个问题你一定想过,在移动用户体验设计领域中,如何设计好一条简单的推送通知. 你注意过么,每天从不同的 App 上收到的大量的推送通知与提醒,这些通知里有多少你真的有兴趣? 每天,用户对各种没用的通知 ...

  5. JPush Android 推送如何区分开发、生产环境

    我们 Android 开发者在使用极光推送时可能会发现,在通过官方控制台进行推送时.只有 iOS 区分了开发和生产环境,而 Android 则没有.但实际开发中又确实经常需要针对开发和生产环境分别来推 ...

  6. scrapy连接MySQL

    Scrapy中连接MySQL所需要做的工作如下: 1.settings中需要设置的部分 # 启动管道组件 ITEM_PIPELINES = { 'QianChengWuYu.mongoDBPiplel ...

  7. 集合之四:List接口

    查阅API,看List的介绍.有序的 collection(也称为序列).此接口的用户可以对列表中每个元素的插入位置进行精确地控制.用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的 ...

  8. FPGA基础学习(9) -- 复位设计

    目录 1. 常见问题 2. 常见的复位方式 3. 合理的复位设计 3.1 复位电平 3.2 异步复位同步化 3.3 恰到好处的复位 4. 补充 4.1 所谓的上电初始化 参考文献 一开始接触到FPGA ...

  9. [HDU4089]Activation(概率DP)

    HDU4089 题意:有n个人排队等着在官网上激活游戏.Tomato排在第m个. 对于队列中的第一个人.有一下情况: 1.激活失败,留在队列中等待下一次激活(概率为p1) 2.失去连接,出队列,然后排 ...

  10. 基础篇:6.5)形位公差-基本规则 Basic Rules

    本章目的:述说形位公差的基本规则 1.代表规则的修正符号与使用情况: 使用情况举例: 2  有关术语 为了明确线性尺寸公差与形位公差之间关系,对尺寸术语将作进一步论述与定义. //无需强记,但希望现有 ...