一、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 类:
1 package com.hibernate.pojo; 2 ?3 /** 4 ?* @author zt1994 2018/3/6 14:16 5 ?*/ 6 public class Product { 7 ????private Integer id; 8 ????private String name; 9 ????private float price;10 11 ????public Integer getId() {12 ????????return id;13 ????}14 15 ????public void setId(Integer id) {16 ????????this.id = id;17 ????}18 19 ????public String getName() {20 ????????return name;21 ????}22 23 ????public void setName(String name) {24 ????????this.name = name;25 ????}26 27 ????public float getPrice() {28 ????????return price;29 ????}30 31 ????public void setPrice(float price) {32 ????????this.price = price;33 ????}34 }
3、建立映射文件
Product.hbm.xml 映射文件:
1 <!DOCTYPE hibernate-mapping PUBLIC 2 ????????"-//Hibernate/Hibernate Mapping DTD//EN" 3 ????????"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 4 ?5 <!--映射文件--> 6 <hibernate-mapping package="com.hibernate.pojo"> 7 ????<!--class表示一个由hibernate管理的持久对象,对应数据库中一个表--> 8 ????<!--table数据库的表名--> 9 ????<class name="Product" table="product">10 ????????<id name="id" type="int" column="id">11 ????????????<!--generator表示主键的生成方式,native自动选择数据库本地的策略-->12 ????????????<generator class="native"/>13 ????????</id>14 ????????<!--非主键属性-->15 ????????<property name="name" column="name" type="string"/>16 ????????<property name="price" column="price" type="float"/>17 ????</class>18 </hibernate-mapping>
4、建立hibernate核心配置文件
hibernate.cfg.xml 配置文件
1 <?xml version="1.0" encoding="utf-8"?> 2 <!DOCTYPE hibernate-configuration PUBLIC 3 ????????"-//Hibernate/Hibernate Configuration DTD 3.0//EN" 4 ????????"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> 5 ?6 <!--hibernate核心配置文件--> 7 <hibernate-configuration> 8 ????<session-factory> 9 ????????<property name="dialect">10 ????????????org.hibernate.dialect.MySQLDialect11 ????????</property>12 ????????<!--链接池配置-->13 ????????<property name="connection.driver_class">com.mysql.jdbc.Driver</property>14 ????????<property name="connection.url">jdbc:mysql://localhost:3306/how2java</property>15 ????????<property name="connection.username">root</property>16 ????????<property name="connection.password">admin</property>17 ????????<!--显示sql语句-->18 ????????<property name="show_sql">true</property>19 20 ????????<!-- 映射文件-->21 ????????<mapping resource="mapper/Product.hbm.xml"/>22 ????</session-factory>23 </hibernate-configuration>
5、编辑dao实现类
dao 接口:
1 package com.hibernate.dao; 2 ?3 import com.hibernate.pojo.Product; 4 ?5 import java.util.List; 6 ?7 public interface IProductDao { 8 ?9 ????/**10 ?????* 添加产品11 ?????* @param product12 ?????* @return13 ?????*/14 ????void addProduct(Product product);15 }
dao 实现:
1 package com.hibernate.dao.impl; 2 ?3 import com.hibernate.dao.IProductDao; 4 import com.hibernate.pojo.Product; 5 import org.hibernate.Query; 6 import org.hibernate.Session; 7 import org.hibernate.SessionFactory; 8 import org.hibernate.Transaction; 9 import org.hibernate.cfg.Configuration;10 11 import java.util.List;12 13 /**14 ?* @author zt1994 2018/3/6 14:4015 ?*/16 public class ProductDaoImpl implements IProductDao {17 18 ????@Override19 ????public void addProduct(Product product) {20 ????????//1.读取并解析配置文件21 ????????Configuration configuration = new Configuration();22 ????????//2.加载配置文件,如果不设置加载默认配置文件hibernate.cfg.xml23 ????????configuration.configure("hibernate.cfg.xml");24 ????????//3.生成会话工厂25 ????????SessionFactory sessionFactory = configuration.buildSessionFactory();26 ????????//4.获取session27 ????????Session session = sessionFactory.openSession();28 ????????//5.开启事务29 ????????Transaction transaction = session.getTransaction();30 ????????transaction.begin();31 ????????//6.操作CRUD32 ????????session.save(product);33 ????????transaction.commit();34 ????????//7.关闭资源35 ????????session.close();36 ????????sessionFactory.close();37 ????}38 }
6、测试
1 package com.hibernate.test; 2 ?3 import com.hibernate.dao.IProductDao; 4 import com.hibernate.dao.impl.ProductDaoImpl; 5 import com.hibernate.pojo.Product; 6 import org.junit.Test; 7 ?8 /** 9 ?* @author zt1994 2018/3/6 14:4710 ?*/11 public class TestProductDao {12 ????private IProductDao productDao = new ProductDaoImpl();13 14 ????/**15 ?????* 测试添加商品16 ?????*/17 ????@Test18 ????public void testAddProduct(){19 ????????Product product = new Product();20 ????????product.setName("test");21 ????????product.setPrice(2222);22 ????????productDao.addProduct(product);23 ????}24 }
Hibernate 学习(一)
原文地址:https://www.cnblogs.com/zt19994/p/8515134.html