Hibernate学习笔记1
来源:互联网 发布:linux locale命令i18n 编辑:程序博客网 时间:2024/05/01 23:21
【什么是Hibernate?】*一个框架*一个Java领域的持久化框架*一个ORM框架【对象的持久化】狭义的理解:“持久化”仅仅指把对象永久保存到数据库中广义的理解:“持久化”包括和数据库相关的各种操作: -保存:把对象永久保存到数据库中 -更新:更新数据库中对象(记录)的状态。 -删除:从数据库中删除一个对象。 -查询:根据特定的查询条件,把符合查询条件的一个或多个对象从数据库加载到内存中。 -加载:根据特定的OID,把一个对象从数据库加载到内存中。OID:为了在系统中能够找到所需对象,需要为每一个对象分配一个唯一的标识号。在关系数据库中称之为逐渐,而在对象术语中,则叫做对象标识(Object identifier-OID)。【ORM】*ORM(Object/Relation Mapping):对象/关系映射 -ORM主要解决对象-关系的映射 -------------------------------- |面向对象概念 |面向关系概念 | -------------------------------- |类 |表 | -------------------------------- |对象 |表的行(记录)| -------------------------------- |属性 |表的列(字段)| -------------------------------- -ORM的思想:讲关系数据库中该表中的记录映射成为对象,以对象的形式展现,程序员可以把对数据库的操作转化为对对象的操作。 -ORM采用源数据来描述对象-关系映射细节,源数据通常采用XML格式,并且存放在专门的对象-关系映射文件中。 ----------------------------- |域模型 |业务逻辑层|(对象,属性,关联,继承和多态)|<------ ----------------------------- | | --------------- | | ORM API | | 持久化层 --------------- 参照 ------------------- | ORM 实现 |------------>|对象-关系映射文件| --------------- |(XML) | ------------------- --------------------------- 数据库层 |关系数据模型 | |(表,字段,索引,主键和外键)| ---------------------------【流行的ORM框架】*Hibernate: -非常优秀、成熟的ORM框架。 -完成对象的持久化操作 -Hibernate允许开发者采用面向对象的方式来操作关系数据库。 -消除那些针对特定数据库厂商的SQL代码*iBatis: -相对Hibernate灵活高,运行书读快 -开发速度慢,不支持纯粹的面向对象操作,需熟悉sql语句,并且熟练掌握sql语句优化功能*TopLink*OJB
Hiberbate实现:
publiv void save(Session sess, Message m) {sees.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, m, m.getContent());ps.execute();} catch (SQLException e) {e.printStackTrace();} finally {if(ps != null)try {ps.close();} catch (SQLException e) {e.printStackTrace();}}}
【导入Hibernate环境】*导入Hibernate必须的jar包:antlr-2.7.6.jar:一个语言转换工具,Hibernate利用它实现HQL到SQL的转换commons-collections-3.1.jar:collections Apache的工具集,用来增强Java对集合的处理能力dom4j-1.6.1.jar:dom4j XML解析器hibernate3.jar:核心包javassist-3.9.0.GA.jar:代码生成工具,Hibernate用它在运行时扩展Java类jta-1.1.jar:标准的Java事务处理接口slf4j-api-1.5.8.jar:hibernate使用的一个日志系统/*********************************************************/上网下载hibarnate的文件hibernate-distribution-3.6.10.Final-dist,解压缩,将其中的hibernate-distribution-3.6.10.Final---------------------------------- |-------hibernate-distribution-3.6.10.Final | ----------------------------------- | |--------hibernate3.jar |-------lib\required中的所有(6个)jar包 |-------jpa --- |---hibernate-jpa-2.0-api-1.0.1.Final.jar网上下了:mysql-connector-java-5.1.18-bin.jar网上下了:hibernate-jpa-2.0-api-1.0.1.Final.jar/*********************************************************/之后将这些jar包选择到build path下。【Hibernate开发步骤】|-------------------------------------|| Application |--->4.通过Hibernate API编写访问数据库的代码| |-------------------------| ||----| Persistent Objects |------|--->1.创建持久化类 |----|-------------------------|------|| Hibernate |||-----------------| |------------| |||hibernate.cfg.xml| | *.hbm.xml | |--->2.创建对象-关系映射文件||-----------------| |------------| ||-------------------------------------||-------------------------------------|| Database |--->3.创建Hibernate配置文件|-------------------------------------| 在src中新建一个包(Package),Name:net.lasolmi.app然后在这个新建的包中新建一个class,Name:News在News.java中输入:
package net.lasolmi.app;public class News {private Integer id;private String title;private String content;}对应的:Source --> Generat Getters and Setters...
然后就出现了一些函数
变成:
package net.lasolmi.app;public class News {private Integer id;private String title;private String content;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}public String getContent() {return content;}public void setContent(String content) {this.content = content;}}【创建持久化Java类】
*提供一个无参的构造器:使Hibernate可以使用Constructor.newlnstance()来实例化持久化类。
*提供一个标志属性(identify property):通常映射为数据库表的主键字段,如果没有该属性,一些功能将不起作用,如:Session.saveOrUpdate();
*为类的持久化类字段声明访问方法(get/set):Hibernate对JavaBeans风格的属性实型持久化。
*使用非final类:在运行时生成代理是Hibernate的一个重要的功能。如果持久化类没有实现任何借口,Hibernate使用CGLIB生成代理。如果使用的是final类,则无法生成CGLIB代理。
*重写equals和hashCode方法:如果需要把持久化类的实例放到Set中(当需要进行关联映射时),则应该重写这两个方法。
【1.创建持久化Java类】
*Hibernate不要求持久化继承任何父类或实现接口,这可以保证代码不被污染。这就是Hibernate被称为低侵入式设计的原因。
|--------------|
| News |
|--------------|
|id:Integer |
|title:String |
|content:String|
|--------------|
【2.创建对象-关系映射文件】
*Hibernate采用XML格式的文件来指定对象和关系数据之间的联系。在运行时Hibernate将根据这个映射文件来生成各种SQL语句
*映射文件的扩展名为:.hbm.xml
新建一个文件:new --> file,File name:
那么这个文件是什么样子的呢,我们可以参照Hibernate中给我们的例子,
在Hibernate的project\testing\src\main\java\org\hibernate\testing\cache里面有一个
Item.hbm.xml文件
将其复制过来到自己的project中,然后在其基础上进行修改就行了。(但是很抱歉我的文件里面没有找到,所以还是按照教程上的分析)
在net.lasolmi.app下新建一个文件:Item.hbm.xml
编辑Item.hbm.xml文件:
<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC"-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><hibernate-mapping package="net.lasolmi.app"><!-- 映射类和映射表 --><class name="News" table="NEWS_TABLE"><!-- 映射OID和数据表的主键 --><id name="id" column="NEW_ID"><generator class="native"/></id><!-- 映射属性和字段 --><property name="title" column="TITLE"/><property name="content" column="CONTENT"></class></hibernate-mapping>【3.创建Hibernate配置文件】
*Hibernate从其配置文件中读取和数据库连接的有关信息,这个文件应该位于应用的classpath下。
找到一个:hibernate.cfg.xml,在src下粘贴:
数据库的方言在哪里取?找到hibernate.property,打开,搜索"MySQL",得到如下信息:
## MySQL
...
#hibernate.dialect org.hibernate.dialect.MySQLInnoDBDialect
...
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"><hibernate-configuration><!-- 配置session-factory节点 --> <session-factory> <!-- 连接数据库的基本信息:user, password, url, driverclass --> <property name="connection.username">root</property> <property name="connection.password">1230</property> <property name="connection.url">jdbc:mysql:///test</property> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <!-- 配置数据库方言 --> <property name="dialect">org.hibernate.dialect.MySQLInnoDBDialect</property> <!-- 在进行数据库相关操作时,是否在控制台打印SQL --> <property name="show_sql">true</property> <!-- 配置是否自动生成数据表 --> <property name="hbm2ddl.auto">create</property> <!-- 关联Hibernate映射文件 --> <mapping resource="net/lasolmi/News.hbm.xml"> </session-factory></hibernate-configuration>【4.通过Hibernate API编写访问数据库的代码】
*测试代码
在net.lasolmi.app下创建一个class,Name:Main
注意:有两个Session,选择经典的那个
package net.lasolmi.app;import javax.transaction.Transaction;import org.hibernate.SessionFactory;import org.hibernate.cfg.Configuration;import org.hibernate.classic.Session;public class Main {public static void main(String[] args) {//1.创建一个Configuration对象:该对象封装了Hibernate的配置信息,包括cfg.xml文件和hbm.xml文件Configuration configuration = new Configuration().configure();//2.创建SessionFactory对象:该对象对应Habernate配置文件对应的数据库和数据库表SessionFactory sessionFactory = configuration.buildSessionFactory();//3.创建Session对象:Hibernate应用和数据库的一个连接Session session = sessionFactory.openSession();//4.打开事物Transaction tx = session.beginTransaction();//5.执行保存操作News news = new News();news.setContent("Hibernate");news.setTitle("ORM");session.save(news);//6.提交事务tx.commit();//7.关闭Sessionsession.close();//8.关闭SessionFactorysessionFactory.close();}}【Configuration类】
*Configuration类负责管理Hibernate的配置信息。包括如下内容:
-Hibernate运行的低层信息:数据库的URL、用户名、密码、JDBC驱动类,数据库Dialect,数据库连接池等(对应hibernate.cfg.xml文件)
-持久化类与数据表的映射关系(*.hbm.xml文件)
*创建Configuration的两种方式
-属性文件(hibernate.properties):
Configuration cfg = new Configuration();
-Xml文件(hibernate.cfg.xml)
Configuration sfg = new Configuration().configure();
-Configuration的configure方法还支持带参数的访问:
File file = new File("simpleit.xml");
Configuration cfg = new Configuration().configure(file);
【SessionFactory接口】
*针对单个数据库映射关系经过编译后的内存镜像,是线程安全的。
*Configuration对象根据当前的配置信息生成SessionFactory对象。SessionFactory对象一旦构造完毕,即被赋予特定的配置信息
- Configuration cfg = new Configuration().configure();
- SessionFactory sf = cfg.buildSessionFactory();
*SessionFactory是生成Session的工厂:
- Session session = sf.openSession();
*构造SessionFactory很消耗资源,一般情况下一个应用中只初始化一个SessionFactory对象。
【Session接口】
*Session是应用程序与数据库之间交互操作的一个单线程对象,是Hibernate运作的中心,所有持久化对象必须在session的管理下才可以进行持久化操作。此对象的生命周期很短。Session对象有一个一级缓存,现实质性flush之前,所有的持久层操作的数据都缓存在session对象处。先党羽JDBC中的connection。
Hibernate:Database<-->JDBC Connection<-->Session<-->SessionFactory<-->Client Application
JDBC: Database<-->JDBC Connection<-->ConnectionPool<-->Client Application
*持久化类与Session关联起来后就具有了持久化的功能。
*Session类的方法:
-取的持久化对象的方法:get() load()
-持久化对象都得保存,更新和删除:
save(),update(),saveOrUpdate(),delete()
-开启事物:beginTransaction().
-管理Session的方法:isOpen(),flush(),clear(),evict(),close()等
0 0
- hibernate学习笔记1
- Hibernate学习笔记(1)
- Hibernate 学习笔记 1
- hibernate学习笔记1
- Hibernate学习笔记1
- Hibernate学习笔记1
- Hibernate学习笔记1
- hibernate学习笔记-1
- hibernate学习笔记(1)
- hibernate学习笔记 1
- Hibernate学习笔记(1)
- Hibernate学习笔记1
- hibernate学习笔记1
- Hibernate学习笔记1
- Hibernate学习笔记1
- hibernate学习笔记1
- hibernate学习笔记(1)
- Hibernate学习笔记1
- MyEclipseMyEclipse内存不足配置
- Data source rejected establishment of connection, message from server: "Too many connections"
- 阿朱语录(11)
- 总结Android之AlertDialog.Builder用法
- 谷歌教你如何向员工放权
- Hibernate学习笔记1
- Apache Commons Codec 编码解码
- LinearLayout—线性布局
- python中数组的用法
- aliyun Ubuntu 14.04 64bit OpenJDK Tomcat7 install
- php代码优化
- ThreadPoolExecutor线程池参数说明
- HDOJ1039 - Easier Done Than Said?
- IOS中UITableview的两种Header view