`

hibernate01:概念、正向工程、反向工程

 
阅读更多

第一:概念

1.hibernate:是对jdbc的轻量级封装(轻量级的意思是不用加载大量的资源)。hibernate跟struts一样是开源的框架,我们可以直接加入jar包
2.hibernate按照mvc来说是模型层,按照框架来分是数据访问层。数据访问层的技术包括jdbc、hib、ibatise(爱被ts)
3.利用框架这个半成品我们可以根据数据表直接生成类。
4.由表到类是反向工程。
5.由类生成表是正向工程:先写好类和对象关系映射
6.hibernate完成对数据库的crud操作,也就是说hibernate帮我们完成了对象关系映射的部分和对sql的封装(把sql封装成hql语句)。
7.hibernate3.3,第一个方块是注解,第二个是核心包,第三个不选。最下面的两个是说把jar包放在哪个位置。下一步新建,下一步jdbc连接数据库。新建
8.方言是指各个数据库底层的sql语句的差异性。
9.hibernate的配置文件同样在src下,因为也要随着类的加载而加载。
10.session:session是个接口,里面是静态方法。
11.oracle(thin),wugui(这个是配置数据库的连接字符串),chu1,1234,,加入jar,测试时候输入密码。
12.hibernate文件有三个,配置,视图,代码,在配置中找到我要连接的那个字符串,也就是wugui,这时候在hibernate配置文件中就会出现这几个连接数据库的内容
13pojo:是简单的java对象。做数据的封装。
14.对象关系映射中在hibernate核心包中能够找到他的dtd规则。
15.hibernate配置文件中的hbm2ddl:ddl是定义数据(创建、删除、修改)表,里面写的是create是创建,表明每次都重新创建这个表。如果是update表示有表就增加,没有就创建,只是主键加1.
mapping中写一个属性resource资源里写一个类,表明去解析这个表(意思是根据这个表创建类)。
16.加载hib主配置文件。configuration(肯非哥)类(在hibernatesessionfactory中能够找到)的作用是获得加载配置文件的对象,然后用这个对象加载主配置文件。
 获得session工厂就相当于获得了数据源(连接数据库的四个参数),下面我们就可以获得session对象连接数据库了。session就是获得连接
17.hibernate主配置文件中的配置其实给hibernate框架中的属性赋值。看sf这个对象
18:正向过程步骤:1、加jar包、2用myeclipse连接数据库、3写映射文件、4在hibernate写三个语句和对象关系映射文件

19.查询可以不用事务,因为查询对数据库没有影响。
20.get是单条查找,load也是单条查找
21.hibernate_seqence.nextval
22.查询query,criteria
23.分页:setmaxResult:每页有几个,setfirstResult:起始页。默认数据库中的数据的下标是从0开始的
scheam:是当前用户。关注jqueryui。。。注意springmvc跟struts是相同的。ibatise跟hibernate是相同的
--------------
Criteria  c =session.createCriteria(News.class);是查询全部的一种方法,
c.setMaxResults(3);和c.setFirstResult(1);是分页要用的
------------
Hibernate是对JDBC的轻量级对象封装, Hibernate本身是不具备事务处理功能的,Hibernate事务实际上是底层的JDBC事务的封装,或者是JTA事务的封装Hibernate的JDBCTransaction根本就是conn.commit而已,根本毫无神秘可言,
只不过在Hibernate中, Session打开的时候,就会自动conn.setAutoCommit(false),不像一般的JDBC,默认都是true,所以你最后不写 commit也没有关系,
由于Hibernate已经把AutoCommit给关掉了,所以用Hibernate的时候,你在程序中不写Transaction的话,数据库根本就没有反应。

 

----------------------------------------------------------------------

<property name="hibernate.hbm2ddl.auto">     </property>

这个属性标签中有四个参数可以写,这四个参数是对数据库中插入的进行不同的操作,分别为:

(1)create-drop

(2)create

(3)update

(4)validate

下面分别来介绍他们的作用以及对数据库中的影响

(1)<property name="hibernate.hbm2ddl.auto"> create-drop </property>

create-drop:表示在hebarinate初始化时创建表格,程序运行结束的时候会删除相应的表格,在实际项目中不用

(2)<property name="hibernate.hbm2ddl.auto">create</property>

在hibernate初始化时会创建表格,在运行结束之后不删除表格,而是在下一次运行的时候如果有旧的删掉,没有旧的,重新建表格

(3)<property name="hibernate.hbm2ddl.auto">update</property>

只是根据映射文件去和数据库中的表对应起来,如果不一致,就更新表的结构

(4)<property name="hibernate.hbm2ddl.auto">validate</property>

校验映射文件和数据库中的表是不是能对应起来,不能对应报错,实际中常用

注:在使用的时候必须要慎重,我就是在当时学习的时候所设置的属性是validate,所以只要改了数据库名就会抛初始化异常,当时我郁闷了半天都不知道是怎么回事,没有往这方面想,后来才知到balidate是在没有数据库名的时候不让你创建,会抛异常的。

 

第二:带注释的说明

1.实体类

package com.pojo;

public class TestTable {
 private int tid;
 private String tname;
 
 public int getTid() {
  return tid;
 }
 public void setTid(int tid) {
  this.tid = tid;
 }
 public String getTname() {
  return tname;
 }
 public void setTname(String tname) {
  this.tname = tname;
 }

 
 

}

2.映射文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <!--
         注意:上面的dtd文件是从jar包中的hibernate3.org.hiberante中的hibernate-mapping-3.0.dtd找到的。其中mapping是映射的意思,他是是帮助我们写映射文件的。
                
 注意:当我们的主键生成策略是<generator class="native"></generator>的时候,就会产生下面的sql语句。native是本地的意思,表示根据本地数据表的格式来自动增长,例如oracle,mysql等
 其中hibernate_sequence.nextval 表示序列的意思。由于是oracle数据库,因此产生了这个序列的sql语句,也就是说在我们写增加的时候,hibernate找到我们当前使用的oracle数据库的自动增长方式
 给我们新添加的这条数据一个新的序列号。
 select
        hibernate_sequence.nextval
    from
        dual -->
<hibernate-mapping package="com.pojo">
     <class name="TestTable" table="chu_testtable" >
        <id name="tid" column="tid" type="int">
           <generator class="native"></generator>
        </id>
        <property name="tname" column="tname" type="java.lang.String"> </property>
     </class>
 
</hibernate-mapping>

 

 

3.hibernate主配置文件

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<!-- Generated by MyEclipse Hibernate Tools.                   -->
<hibernate-configuration>
<!-- 注意: <property name="hbm2ddl.auto">update</property>表示的意思是根据映射文件去和数据库中的表对应起来,如果不一致,就更新表的结构 ,也就是增加
<property name="hibernate.hbm2ddl.auto">create-drop</property>表示在hebarinate初始化时创建表格,程序运行结束的时候会删除相应的表格,在实际项目中不用
<property name="hbm2ddl.auto">create</property>表示在hibernate初始化时会创建表格,在运行结束之后不删除表格,而是在下一次运行的时候如果有旧的删掉,没有旧的,重新建表格
<property name="hibernate.hbm2ddl.auto">validate</property>表示校验映射文件和数据库中的表是不是能对应起来,不能对应报错,实际中常用
其中hbm2ddl中的hbm指的是映射文件,2是to的意思,ddl是数据定义语言(增删改),其中update是改,create-drop是增、删,create是增。
-->

<!--
注意:上面规定的dtd文件是来源于的hibernate3这个jar包中的org.hibernate-configuration-3.0.dtd,
其中configuration是配置的意思,也就表明这个dtd文件是针对hibernate主配置文件而规定的。
1.<property name="myeclipse.connection.profile">chu</property>是表明这个是配置数据库的连接字符串,其实
就是表明在myeclipse中的数据库中连接的是chu这个名字的,(除了这个名字,我还有一个名字mysql的)
2.<mapping resource="com/pojo/TestTable.hbm.xml"/>表明解析这个映射文件.
注释:<property name="hbm2ddl.auto">create</property>表明每次都会重新创建表,也就是会导致以前的数据没有了。因此当我们正向生成之后就把这句话去掉,或者改成update
<property name="hbm2ddl.auto">update</property>是每次更新表,可以留着
 -->


<session-factory>
 <property name="myeclipse.connection.profile">chu</property>
 <property name="connection.url">
  jdbc:oracle:thin:@localhost:1521:ORCL
 </property>
 <property name="connection.username">chu1</property>
 <property name="connection.password">1234</property>
 <property name="connection.driver_class">
  oracle.jdbc.OracleDriver
 </property>
 <property name="dialect">
  org.hibernate.dialect.Oracle9Dialect
 </property>
     <property name="hbm2ddl.auto">update</property>
  <property name="show_sql">true</property>
  <property name="format_sql">true</property>
<mapping resource="com/pojo/TestTable.hbm.xml"/>
</session-factory>

</hibernate-configuration>

 

 

4.公共的hibernate工厂类

package com;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.cfg.Configuration;

/**
 * Configures and provides access to Hibernate sessions, tied to the
 * current thread of execution.  Follows the Thread Local Session
 * pattern, see {@link http://hibernate.org/42.html }.
 */
public class HibernateSessionFactory {

    /**
     * Location of hibernate.cfg.xml file.
     * Location should be on the classpath as Hibernate uses 
     * #resourceAsStream style lookup for its configuration file.
     * The default classpath location of the hibernate config file is
     * in the default package. Use #setConfigFile() to update
     * the location of the configuration file for the current session.  
     */
    private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";
 private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
    private  static Configuration configuration = new Configuration();   
    private static org.hibernate.SessionFactory sessionFactory;
    private static String configFile = CONFIG_FILE_LOCATION;

 static {
     try {
   configuration.configure(configFile);
   sessionFactory = configuration.buildSessionFactory();
  } catch (Exception e) {
   System.err
     .println("%%%% Error Creating SessionFactory %%%%");
   e.printStackTrace();
  }
    }
    private HibernateSessionFactory() {
    }
 
 /**
     * Returns the ThreadLocal Session instance.  Lazy initialize
     * the <code>SessionFactory</code> if needed.
     *
     *  @return Session
     *  @throws HibernateException
     */
    public static Session getSession() throws HibernateException {
        Session session = (Session) threadLocal.get();

  if (session == null || !session.isOpen()) {
   if (sessionFactory == null) {
    rebuildSessionFactory();
   }
   session = (sessionFactory != null) ? sessionFactory.openSession()
     : null;
   threadLocal.set(session);
  }

        return session;
    }

 /**
     *  Rebuild hibernate session factory
     *
     */
 public static void rebuildSessionFactory() {
  try {
   configuration.configure(configFile);
   sessionFactory = configuration.buildSessionFactory();
  } catch (Exception e) {
   System.err
     .println("%%%% Error Creating SessionFactory %%%%");
   e.printStackTrace();
  }
 }

 /**
     *  Close the single hibernate session instance.
     *
     *  @throws HibernateException
     */
    public static void closeSession() throws HibernateException {
        Session session = (Session) threadLocal.get();
        threadLocal.set(null);

        if (session != null) {
            session.close();
        }
    }

 /**
     *  return session factory
     *
     */
 public static org.hibernate.SessionFactory getSessionFactory() {
  return sessionFactory;
 }

 /**
     *  return session factory
     *
     * session factory will be rebuilded in the next call
     */
 public static void setConfigFile(String configFile) {
  HibernateSessionFactory.configFile = configFile;
  sessionFactory = null;
 }

 /**
     *  return hibernate configuration
     *
     */
 public static Configuration getConfiguration() {
  return configuration;
 }

}

 

 

5.真正的dao层调用

package com.dao;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

import com.pojo.TestTable;

public class TestDao {
 public static void main(String[] args) {
  // 加载hibernate的配置文件
  //1 创建Configuration对象,在HibernateSessionFactory这个里面可以看到,我们要获得Configuration对象之后才能加载主配置文件
  Configuration cfg = new Configuration();
  //2 加载配置文件
  cfg.configure("/hibernate.cfg.xml");
  //3 获得SessionFactory对象。通过hibernate.cfg.xml文件我们可以看到,主配置文件里面跟标签就是<session-factory>标签,因此加载了主配置文件后就能获得session工厂了。
  SessionFactory sf  =cfg.buildSessionFactory();
  System.out.println("sf="+sf);//输出:org.hibernate.impl.SessionFactoryImpl

  //4通过session工厂 获得session对象  ----相当于jdbc中的Connection对象。
  Session session =sf.openSession();
  //5 开启事务---由于对数据库有影响,因此要开启事务
  Transaction  tr = session.beginTransaction();
  //6 进行crud操作,执行增删改查,这里我们是增加的方法,传入一个实体类对象之后,数据库就能增加一条记录,为什么?
   //答:由于有映射文件。主配置文件在src目录下,当项目部署到tomact服务器的时候就会把主配置文件加载了,而我们的映射文件在主配置文件中已经配置了,
  //此时也就是说在上面的第三步的时候已经把映射文件加载好了,映射文件里写的是实体类和数据表的关系,因此在我们执行save方法的时候就能把这个参数(对象)转化成数据表的列(字段)
  TestTable tt=new TestTable();
  tt.setTid(1);
  tt.setTname("张三");
  session.save(tt);
  //7 事务处理,提交事务,当我们提交事务的时候hibernate框架会向oracle数据库发送一条insert语句。
  tr.commit();
  
  //8 关闭session,为了防止资源的浪费。
  session.close();

 }
}

 

  • a.zip (7.6 MB)
  • 下载次数: 0
分享到:
评论

相关推荐

    数据库反向生成基础代码

    反向工程与正向工程结合使用,可以实现数据库与应用程序的快速同步。 二、数据库反向生成的常用工具 1. MyEclipse:这是一个集成开发环境,其中包含数据库反向工程功能,可以生成Java的实体类、DAO层代码等。 2. ...

    正向工程创建hbm.xml,以及javadoc模式的读取注释

    然后,通过Hibernate Tools的反向工程功能,可以基于数据库表自动生成对应的Java实体类。接下来,正向工程将这些Java类转换为hbm.xml文件,其中包含了对象和表之间的映射关系。 2. **Javadoc模式** Javadoc模式是...

    jsp中Hibernate资料

    在Hibernate中,正向工程是指从Java类自动生成数据库表结构的过程,而反向工程则是从现有数据库表生成Java类和映射文件。这两种方式都有助于加速开发过程,特别是在项目初期阶段。 ### 结论 对于初学者来说,掌握...

    hibernate生成java,xml

    通过XML元数据(如.hbm.xml文件)或JPA注解,Hibernate Tools能够根据数据库模式反向工程出对应的Java源代码。这个过程大大减少了手动编写这些类和配置的工作量,提高了开发效率。`hibernate-extensions-2.1.3.zip`...

    Hibernate培训教程

    此外,Hibernate教程中还会涉及一些基础的专业术语,如正向工程,即从数据库设计生成对象模型的过程,反向工程则相反,是从现有数据库生成对象模型。还有配置文件、Session、Transaction管理、Criteria查询、HQL语言...

    ItcastOA_文档2_实体映射_分页方案_文件下载_解决异常.doc

    实体映射可以通过两种方式来实现:正向工程和反向工程。 - **正向工程**:首先设计实体对象和其映射文件,然后再利用工具自动生成数据库表结构。这种方式适用于在项目初期已经对业务逻辑有了较为清晰的理解的情况。...

    eclipse middlegen 插件

    1. **数据库模式反向工程**:它可以读取现有的数据库结构,生成对应的Java实体类、Hibernate映射文件(.hbm.xml)以及相关的DAO(数据访问对象)和SessionFactory配置。这使得开发者无需手动编写这些代码,从而提高...

    JAVA程序开发大全---上半部分

    18.5 使用MyEclipse实现正向工程和反向工程 324 18.5.1 MyEclipse中实现正向工程 324 18.5.2 MyEclipse中实现反向工程 324 18.6 本章小结 326 第19章 使用MyEclipse开发插件 327 19.1 MyEclipse中的插件机制 327 ...

    MyEclipse快捷键与插件大全.doc

    - **Ctrl+J/Shift+Ctrl+J**:正向/反向增量查找,快速找到目标单词。 - **Ctrl+Shift+F4**:关闭所有打开的编辑器。 2. **插件使用** MyEclipse的插件功能强大,例如: - **Eclipse Marketplace**:搜索并...

    Compass原理深入学习笔记

    常见的分词方法包括二元分词、正向最大分词和反向最大分词等。分词后,这些词汇会被用来构建索引,形成一个词典,其中每个词汇都对应着包含它的文档链表。 索引的创建过程包括: 1. 分词:将文档内容进行分词处理。...

    MyEclipse快捷键

    MyEclipse是一款强大的Java集成开发环境,尤其在与Spring、Hibernate等框架结合开发时,其丰富的快捷键功能能够大大提高开发效率。以下是对标题和描述中提到的一些MyEclipse快捷键的详细解释: 1. **Ctrl+M**:此...

    25个让Java程序员更高效的Eclipse插件.txt

    - 提供了正向工程功能,即从Java实体生成数据库表。 - 支持多种数据库类型,兼容性强。 #### 20. JBoss Tools - **概述**:JBoss Tools 是一款专注于JBoss应用服务器开发的插件集合。 - **特点**: - 支持...

    chm参考文档

    系统教程可能涵盖了基本的字符集、量词、位置匹配、分组、分支和反向引用等概念,还可能涉及高级特性,如正向预查、负向预查、环视条件等。通过学习正则表达式,开发者可以更有效地处理字符串操作,特别是在处理大量...

Global site tag (gtag.js) - Google Analytics