分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 代码编程

hello hibernate

发布时间:2023-09-06 01:25责任编辑:彭小芳关键词:暂无标签

Hibernate概述

1.什么是hibernate

  Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以 自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。

2.hibernate的优缺点

优点:

   1、对象化。hibernate可以让开发人员以面相对象的思想来操作数据库。jdbc只能通过SQL语句将元数据传送给数据库,进行数据操作。而hibernate可以在底层对元数据和对象进行转化,使得开发者只用面向对象的方式来存取数据即可。

   2、更好的移植性。hibernate使用xml或JPA的配置以及数据库方言等等的机制,使得hibernate具有更好的移植性,对于不同的数据库,开发者只需要使用相同的数据操作即可,无需关心数据库之间的差异。而直接使用JDBC就不得不考虑数据库差异的问题。

   3、开发效率高。hibernate提供了大量的封装(这也是它最大的缺点),很多数据操作以及关联关系等都被封装的很好,开发者不需写大量的sql语句,这就极大的提高了开发者的开发效率。

   4、缓存机制的使用。hibernate提供了缓存机制(session缓存,二级缓存,查询缓存),对于那些改动不大且经常使用的数据,可以将它们放到缓存中,不必在每次使用时都去查询数据库,缓存机制对提升性能大有裨益。

缺点: 

   1、由于对持久层封装过于完整,导致开发人员无法对SQL进行优化,无法灵活使用JDBC的原生SQL,Hibernate封装了JDBC,所以没有JDBC直接访问数据库效率高。要使用数据库的特定优化机制的时候,不适合用Hibernate 
   2、框架中使用ORM原则,导致配置过于复杂,一旦遇到大型项目,比如300张表以上,配置文件和内容是非常庞大的,另外,DTO满天飞,性能和维护问题随之而来
   3、如果项目中各个表中关系复杂,表之间的关系很多,在很多地方把lazy都设置false,会导致数据查询和加载很慢,尤其是级联查询的时候。
   4、Hibernate在批量数据处理时有弱势,对于批量的修改,删除,不适合用Hibernate,这也是ORM框架的弱点

3.案例的开发步骤及具体代码实现

   本例演示使用hibernate添加一条数据到表Product

   如图:

   

步骤1:

   准备数据库
   我这边安装的是mysql数据库,账号密码都是root, 后续的配置里,也是用的这个账号密码。
    1 create database test; 
 步骤2:
   新建一个 java Project
   

步骤3:

    导入jar包 
    下载地址>
    hibernate所需包
    hibernate 5.2
    hibernate 4.2
    数据连接所需包
    mysql-connector-java-5.1.44.jar
    下载解压,在项目上新建lib文件夹,导入解压后的hibernate-release-4.2.21.Final\lib\required文件夹的所有包及mysql-connector-java-5.1.44.jar
    如图:
    

步骤4:

  创建实体类及实体类映射,直接上代码。

  实体类:

 1 package com.day01.pojo; 2 ?3 public class Product { 4 ????private int id; 5 ????private String pName; 6 ????private double price; 7 ????public int getId() { 8 ????????return id; 9 ????}10 ????public void setId(int id) {11 ????????this.id = id;12 ????}13 ????public String getpName() {14 ????????return pName;15 ????}16 ????public void setpName(String pName) {17 ????????this.pName = pName;18 ????}19 ????public double getPrice() {20 ????????return price;21 ????}22 ????public void setPrice(double price) {23 ????????this.price = price;24 ????}25 ????26 }
View Code

  实体类映射:

  命名:类名.hbm.xml

 1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE hibernate-mapping PUBLIC ?3 ????"-//Hibernate/Hibernate Mapping DTD 3.0//EN" 4 ????"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 5 <hibernate-mapping package="com.day01.pojo"> 6 ????<class name="Product" table="Product"> 7 ????????<id name="id" column="id"><!-- 映射主键 ?name:属性名 ???column:表中字段名 --> 8 ????????????<generator class="native"></generator> ????????????9 ????????</id>10 ????????<property name="pName"></property><!-- 只指定name表示属性名和字段名保持一致 -->11 ????????<property name="price"></property>12 ????</class>13 </hibernate-mapping>
View Code
步骤5:
  配置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 <hibernate-configuration> 6 ????<session-factory> 7 ????????<!-- 数据库连接配置 --> 8 ????????<property name="connection.driver_class"> 9 ????????????com.mysql.jdbc.Driver10 ????????</property>11 ????????<property name="connection.url">12 ????????????jdbc:mysql://localhost:3306/test?characterEncoding=UTF-813 ????????</property>14 ????????<property name="connection.username">root</property>15 ????????<property name="connection.password">root</property>16 ????????<!-- 设置数据库方言 ????就是告诉hibernate使用的是什么数据库 -->17 ????????<property name="dialect">org.hibernate.dialect.MySQLDialect</property>18 ????????<!-- 是否显示sql语句 -->19 ????????<property name="show_sql">true</property>20 ????????<!-- 是否显示sql语句 -->21 ????????<property name="sql_format">true</property>22 ????????<!-- 设置事务管理方式 ???????即每个线程一个事务 -->23 ????????<property name="current_session_context_class">thread</property>24 ?????????<!-- hbm2ddl.auto: 生成表结构的策略配置25 ??????????????update(最常用的取值): 如果当前数据库中不存在表结构,那么自动创建表结构. 26 ???????????????????????????如果存在表结构,并且表结构与实体一致,那么不做修改27 ???????????????????????????如果存在表结构,并且表结构与实体不一致,那么会修改表结构.会保留原有列.28 ??????????????create(很少):无论是否存在表结构.每次启动Hibernate都会重新创建表结构.(数据会丢失)29 ??????????????create-drop(极少): 无论是否存在表结构.每次启动Hibernate都会重新创建表结构.每次Hibernate运行结束时,删除表结构.30 ??????????????validate(很少):不会自动创建表结构.也不会自动维护表结构.Hibernate只校验表结构. 如果表结构不一致将会抛出异常.31 ??????????-->32 ????????<property name="hbm2ddl.auto">update</property>33 ????????<!-- 映射实体 ?Product-->34 ????????<mapping resource="com/day01/pojo/Product.hbm.xml" />35 ????</session-factory>36 </hibernate-configuration>
View Code

 步骤6:

  编写测试类代码

 1 package com.day01.test; 2 ?3 import org.hibernate.Session; 4 import org.hibernate.SessionFactory; 5 import org.hibernate.cfg.Configuration; 6 import org.hibernate.service.ServiceRegistry; 7 import org.hibernate.service.ServiceRegistryBuilder; 8 import com.day01.pojo.Product; 9 10 public class Test {11 ????public static void main(String[] args) {12 ????????//创建配置对象13 ????????Configuration cfg=new Configuration().configure();//默认加载hibernate.cfg.xml14 ????????//若不以hibernate.cfg.xml命名 则需为configure()指定参数:如 configure("myhibernate.cfg.xml")15 ????????//创建服务注册类 ?进一步加载配置文件16 ????????ServiceRegistry sr=new ServiceRegistryBuilder().applySettings(cfg.getProperties()).buildServiceRegistry();17 ????????//创建会话工厂18 ????????SessionFactory sf=cfg.buildSessionFactory(sr);19 ????????//获取会话对象20 ????????Session session=sf.openSession();21 ????????//开始事务22 ????????session.beginTransaction();23 ????????//创建一个商品实例24 ????????Product p=new Product();25 ????????p.setpName("电视");26 ????????p.setPrice(5000.00);27 ????????//将实例p保存到数据库28 ????????session.save(p);29 ????????//提交事务30 ????????session.getTransaction().commit();31 ????????//关闭资源32 ????????session.close();33 ????????sf.close();34 ????}35 ????36 }
View Code

  

hello hibernate

原文地址:http://www.cnblogs.com/UnwillingToMediocrity/p/7867656.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved