hibernate笔记

Hibernate框架


什么是ORM?
(object/Relationship Mapping)对象/关系映射
利用面向对象的思想编写的数据库应用程序最终都是把对象信息保存在关系型数据库中,于是要编写很多和底层数据库相关的SQL语句。


ORM主要解决对象-关系的映射:


面向对象的概念           面向关系的概念

对象 表的行(记录)
属性 表的列(字段)


ORM思想:将关系数据库中表的记录映射成为对象,以对象的形式展现,程序员可以把对数据库的操作转化为对对象的操作。
ORM采用元数据来描述对象-关系映射细节。元数据通常采用XML格式,并且存放在专门的对象-关系映射文件中。






Hibernate与Jdbc代码比较:


//Hibernate实现
public void save(Session sess,Message m){
sess.save(m);
}




//jdbc实现
public void save(Connection conn,Message m){


PreparedStatement ps=null;
String sql="insert into message values(?,?)";

try{
ps=conn.prepareStatement(sql);
ps.setString(1,m.getTitle());
ps.setString(2,getContent());
ps.execute();
}catch(SQLException e){
e.printStackTrace();
}finall{
if(ps!=null)
try{
ps.close();
}catch(SQLException e){
e.printStackTrace();
}
}
}














什么是Hibernate?
Hibernate是Java领域的一款开源的ORM框架技术。Hibernate对JDBC进行了非常轻量的对象封装。


其他主流的ORM框架技术:
1.MyBatis:前身是著名的iBatis
2.Toplink:后被Oracle收购,并重新包装为Oracle As Toplink
3.EJB:本身是JAVAEE的规范






编写第一个Hibernate的例子:


   导入Hibernate必须的jar包:hibernate-release-4.2.4.Final\lib\required
   导入Mysql的jdbc驱动:mysql-connector-java-5.1.7-bin.jar
   导入Junit4的jar包:junit-4.10.jar
   
   1.创建Hibernate的配置文件:hibernate.cfg.xml
   hibernate从其配置文件中读取和数据库有关的信息,这个文件位于应用的classpath下。
   
<property name="connection.username">root</property>
<property name="connection.password"></property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property
name="connection.url">jdbc.mysql:///hibernate?useUnicode=true&amp;characterEncoding=UTF-8</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
 
常用配置:
属性名称:hibernate。show_sql  是否把hibernate运行时的SQL语句输出到控制台,编码阶段便于测试
 hibernate.format_sql  输出到控制台的SQL语句是否进行排版,便于阅读,建议设置为true
 hbm2dd.auto  可以帮助有java生成数据库脚本,进而生成具体的表结构。create|update|createdrop|validate 
 hibernate.default_schema  默认的数据库
 hibernate.dialect  配置Hibernate数据库方言,Hibernate可针对特殊的数据库进行优化
   
   
   
   2.创建持久化java类


提供一个无参的构造器:使hibernate可以使用Constructor.newinstance()来实例化持久类。
提供一个标识属性:通常映射为数据库表的主键字段,如果没有该属性,一些功能将不起作用,如Session.saveOrUpdate()。
为类的持久化类字段声明访问方法(get/set):hibernate对Javabean风格属性实行持久化。
使用非final类:在运行时生成代理是hibernate的一个重要的功能 ,如果持久化类没有实现任何接口,
hibernate使用CGLIB生成代理,如果使用final类,则无法生成CGLIB代理。
重写eqauls和hashCode方法:如果需要把持久化类的实例放到set中(当需要进行关联映射时),则应该重谢这连个方法。







   
   3.创建对象-关系映射文件*.hbm.xml
hibernate采用xml格式的文件来指定队形和关系数据之间的映射,在运行时hibernate将根据这个映射文件来生成各种SQL语句。



   
   使用Junit进行测试:@Test:测试方法
  @Before:初始化方法
  @After:释放资源
   
   
   4.通过Hibernate API编写访问数据库的代码:
   
//1.创建一个SessionFactory
SessionFactory sessionFactory=null;
//1)创建Configuration对象,对应hibernate的基本信息和对象关系映射信息
Configuration configuration=new Configuration().configure();

//4.0之前这样创建
// sessionFactory=new configuration.buildSessionFactory();

//2)创建一个ServiceRegistry对象;hibernate4.x新添加的对象
//hibernate的任何配置和服务都需要在该对象中注册后才能有效
ServiceRegistry serviceRegistry=
new ServiceRegistry().applySettings(configuration.getProperties()).build();


//3)
sessionFactory=configuration.buildSessionFactory(serviceRegistry);

//2.创建一个Session对象
sessionFactory session=sessionFactory.openSession();

//3.开启事务
Transaction transaction=new Transaction();

//4.执行保存操作
News news=new News("java","ATGUIGU",new Date(new java.util.Date().getTime()));
session.save(news);

//5.提交事务
transaction.commit();

//6.关闭Session
session.close();

//7.关闭SessionFactory对象
sessionFactory.close();
   


Configuration类:

Configuration类负责管理Hibernate的配置信息,包括如下内容:
--hibernate运行的底层信息:数据库的URL,用户名,密码,JDBC驱动类,数据库dialect,数据库连接池等(对应.cfg.xml文件)
--持久化类与数据表的映射关系(.hbm.xml文件)

创建Configuration的两种方式:
--属性文件(hibernate.properties)   Configuration cfg=new Configuration();
--XML文件(hibernate.cfg.xml)   Configuration cfg=new Configuration().configure();
--Configuration的configure方法还支持带参数的访问: File file=new File("simpleit.xml");
  Configuration cfg=new Configuration().configure(file);


SessionFactory接口:

针对单个数据库映射关系经过编译后的内存镜像,是线程安全的。
SessionFactory对象一旦构造完毕,即被赋予特定的配置信息。
SessionFactory是生成Session的工厂。
构造SessionFactory很消耗资源,一般情况下一个应用中只初始化一个SessionFactory对象。
Hibernate新增了一个ServiceRegistry接口,所有基于Hibernate的配置或者服务器都必须统一向这个ServiceRegistry注册才能生效。
Hibernate4中创建SessionFactory的步骤:
//1.创建configuration对象
Configuration configuration=new Configuration().configure();
//2.创建ServiceReigstry
ServiceRegistry serviceRegistry=new ServiceRegistryBuilder()
.applySettings(configuration.getProperties()).buildServiceRegistry();
//3.创建SessionFactory对象
SessionFactory sessionFactory=configuration.buildSessionFactory(serviceRegistry);



Session接口:

session可以理解为操作数据库的对象,相当于JDBC中的Connection
session与connection是多对一的关系,每个session都有一个与之对应的connection,一个connection不同时刻可以供多个session使用。

持久化类与Session关联起来后就具有了持久化的能力。
Session类的方法:
--取得持久化对象的方法:get(),load()
--持久化对象都得保存,更新和删除:save(),update(),saveOrUpdate(),delete()
--开启事务:beginTransaction()
--管理Session的方法:isOpen(),flush(),clear(),evict(),close()等


把对象保存在关系数据库中需要调用session的各种方法:如增删改查:save(),update(),delete(),createQuery().
   
   如何获得session对象?1.openSession
2.getCurrentSession
如果使用getCurrentSession需要在hibernate.cfg.xml文件中进行配置:
  如果是本地事务(jdbc事务)  <property name="hibernate.current_session_context_class">thread</property>
  如果是全局事务(jta事务)   <property name="hibernate.current_session_context_class">jta</property>
  
   openSession与getCurrentSession的区别:
   1.getCurrentSession在事务提交或者回滚折后会自动关闭,而openSession需要手动关闭,如果没有关闭,会导致连接池溢出。
   2.openSession每次创建新的session对象,getCurrentSession使用现有的session对象
   
   
   
Transaction简介:
代表一次原子操作,它具有数据库事务的概念。所有持久层都应该在事务管理下进行,即使是只读操作。
Transaction ts=session.beginTransaction();

常用方法:
--commit():提交相关联的session实例
--rollback():撤销事务操作
--wasCommitted:检查事务是否提交

hibernate对数据库的操作都是封装在事务中,并且默认是非自动提交方式。所以用session保存对象时,
如果不开启事务,并且手工提交事务,对象并不会真正博爱村在数据库中。
如果想让hibernate像jdbc那样自动提交事务,必须调用session对象的daWork()方法,获得jdbc的connection后,设置其为自动提交事务模式(通常不推荐这样做)

   
   
   
   
   hbm配置文件常用设置:
     <hibernate-mapping
          schema="shcemaName"
  catalog="catalogName"
  default-cascade="cascade_style"   //级联风格
  defalult-access="field|property|ClassName"  //访问策略
  default-lazy="true|fault"  //加载策略
  package="packagename"      //包名
  />
   
<class
     name="ClassName"
 table="tableName"
 batch-size="N"
 where="condition"
 entity-name="EntityName"
 />
   
  <id
      name="propertyName"
 type="typename"
 column="column_name"
 length="length"
 <geneator class="generatorClass"/>
 </id>
 





在hibernate中使用c3p0数据源:
1.导入jar包:hibernate-release-4.2.4.Final\lib\optional\c2p0\*.jar


2.加入配置
  hibernate.c3p0.max_size :数据库连接池最大连接数
  hibernate.c3p0.min_size :数据库连接池最小连接数
  hibernate.c3p0.acquire_increament :当数据库连接池中的连接耗尽时,同一时刻获取多少个数据库连接
  hibernate。c3p0.timeout: 数据库连接池中连接对象在多长时间没有使用过后,就应该被销毁
  hibernate.c3p0.idle_test_period :表示连接池检测线程多长时间检测一次内的所有链接对象是否超时,
连接池本身不会把自己从连接池中移除,而是专门有一个线程按照一定的时间
间隔来做这件事,这个线程通过比较连接对象最后一次呗使用和当前的时间差和timeout作对比,
进而决定是否销毁这个连接对象。
hibernate.c3p0.max_statements: 缓存statement对象的数量









Hibernate单表操作
1.单一主键
assigned,由java应用程序负责生成(手工赋值)
native,由底层数据库自动生成标识符,如果是Mysql就是increment,如果是Oracle就是sequence








2.基本类型
映射类型     java类型         标准SQL类型        描述
date java.util.Date 或        DATE           代表日期:yy-MM-dd
 java.sql.Date
  
time    java.util.Date或          TIME               代表时间:hh:mi:ss
java.sql.Time
 
timestamp    java.util.Date或  
java.sql.Timestamp   TIMESTAMP      代表时间和日期:yyyymmddhhmiss
 
Calendar     java.util.Calendar    TIMESTAMP      代表时间和日期:yyyymmddhhmiss  



Calendar_date  java.util.Calendar   DATE           代表日期:yyyy-MM-dd





3.对象类型


映射类性 java类型 标准SQL类型 MYSQL类型 Oracle类型
binary byte[] VARCHAR(或BLOB) BLOB BLOB
text java.lang.String   CLOB TEXT CLOB
clob java.sql.Clob CLOB TEXT CLOB
blob java.sql.Blob BLOB BLOB BLOB


Mysql不支持标准SQL的CLOB类型,在Mysql中,用TEXT,MEDIUMTEXT及LONGTEXT类型来表示长度超过255的长文本数据。




4.组件属性
实体中某个属性属于用户自定义的类的对象。


<component name="address" class="Adress">
  <property name="postcode" column="POSTCODE"></property>
  <property name="phone" column="PHONE"></property>
  <property name="address" column="ADRESS"></property>
  </component>
  
  
  
单表操作的常用方法:sava,delete,update,get与load
get与load的区别:
在不考虑缓存的情况下,get方法会在调用之后立即向数据库发出sql语句,返回持久化对象。
load方法会在调用之后返回一个代理对象。该代理对象只保存实体对象的id,直到使用对象的费主键属性时才会发出sql语句。


  
  
  
  
 
 
 


映射类型:
一对多:在数据库中,可以通过添加外键的关联,表现一对多的关系。
通过在一方有多方的集合表现,即在“一”的一端使用<set>元素表示持有“多”的一端的对象。

多对一
一对一
 
 
 
   
   
   
   
   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值