当前位置: 首页 > 编程日记 > 正文

【转】通过Hibernate将数据 存入oracle数据库例子

一、 Hibernate介绍

Hibernate是基于对象/关系映射(ORM,Object/Relational Mapping)的一个解决方案。ORM方案的思想是将对象模型表示的对象映射到关系型数据库中,或者反之。Hibernate目前是ORM思想在Java中最成功、最强大的实现。它于2001年的年末发布第一个版本,立即引起了广泛的注意。2003年6月,Hibernate2发表,并且获得Jolt大奖,进而被JBoss吸纳成为它的一个子项目。2005年3月,Hibernate 3发表,其中做了一些比较重大的改进。本文以Hibernate3为基础编写。

另外,Hibernate除了可以在J2EE容器中运行外,还可以运行在Java应用程序中。本文就是以Java应用程序为例来介绍它。

二、配置开发环境
    本文以一个Java应用程序(Java Application)为例,介绍如何使用Hibernate来进行数据库操作。
    在进行Hibernate开发之前,需要首先获得Hibernate类库、相应数据库的JDBC驱动类库。Hibernate类库可以从http://www.hibernate.org中下载,目前的版本是3.0。而JDBC驱动可以根据不同的数据库来选择,在这个例子中,使用的是Oracle数据库,那么相应的JDBC驱动可以从Oracle安装目录\ora92\jdbc下获得。其他的数据库请根据相关的说明获得。

下载Hibernate包后,可以将它解压到一个文件夹,此处假设为C:\hibernate-3.0,然后将C:\hibernate-3.0\下的hibernate.jar和C:\hibernate-3.0\lib下的那些第三方类库也放到环境变量CLASSPATH中。(通常,只需要dom4j、cglig、commons-logging、commons-collections、log4j、ehcache、asm、jta、antlr这些类库就可以了)

做完这些配置后,就可以在此基础上进行基于Hibernate的Java程序开发了。

三、开发基于Hibernate的应用
    现在假设我们在Oracle数据库中创建了一个表Student,它的字段如下表所示:

字段 说明
Student_ID 学员编号,整型,PK,自动增长
Student_Name 学员姓名,字符串类型
Student_Age 学员年龄,整型
如果我们在Oracle中定义这个数据库表,我们可以定义一个创建数据库表的SQL脚本如下:
create table Student(
 Student_ID  number(6) NOT NULL PRIMARY KEY,
 Student_Name varchar2(10) NOT NULL,
 Student_Age number(2) NOT NULL
);

另外,因为在Oracle中没有“自动增长”类型的字段,所以通常情况下我们需要定义一个sequence来作为自动增长类型字段的数据。在这里,我们也可以定义一个sequence来给Student_ID字段提供数据。创建sequence的SQL脚本如下:

CREATE SEQUENCE student_sequence 
INCREMENT BY 1
START WITH 1000
NOMAXVALUE
NOCYCLE
CACHE 10;

我们在这里创建了一个student_sequence,准备用来作为Student_ID字段的值。

接着,我们需要一个hibernate.cfg.xml或者属性文件hibernate.properties来指定Hibernate所使用的数据库以及用户名、密码等其他相关的配置,我们在此使用xml文件,它的内容如下:

源文件:hibernate.cfg.xml
<!DOCTYPE hibernate-configuration PUBLIC
 "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
 "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
 <session-factory>
<!--程序执行的时候是否显示真正的sql语句-->
  <property name="show_sql">true</property>
  <!--使用的SQL对应的“方言”,此处是Oracle9的“方言”-->
<property name="dialect">org.hibernate.dialect.Oracle9Dialect
</property>
  <!--连接数据库的Driver-->
<property name="connection.driver_class">
oracle.jdbc.driver.OracleDriver
</property>
  <!--数据库连接url-->
<property name="connection.url">
jdbc:oracle:thin:@localhost:1521:nitpro
</property>
  <!--用户名-->
<property name="connection.username">system</property>
<!--密码-->
  <property name="connection.password">manager</property>
 </session-factory>
</hibernate-configuration>

做完前面的这些准备工作后,下面就让我们进入激动人心的Hibernate编程吧!

首先,我们需要定义一个用于表示“学生”对象的Student类:

源文件:Student.java
public class Student
{
    private int student_id;
    private String student_name;
    private int student_age;
    
    public int getStudent_id()
    {
        return student_id;
    }
    public String getStudent_name()
    {
        return student_name;
    }
    public int getStudent_age()
    {
        return student_age;;
    }
    public void setStudent_id(int id)
    {
        this.student_id = id;
    }
    public void setStudent_name(String name)
    {
        this.student_name = name;
    }
    public void setStudent_age(int age)
    {
        this.student_age = age;
    } 
}

这个类很简单,就是一个典型的JavaBean的定义:有三个属性:student_id、student_name和student_age,分别对应数据库表Student中的三个字段,并且在这个类中定义了对应各个属性的setter/getter方法。

接下来,我们需要给这个类定义一个XML映射文件“Student.hbm.xml”,文件内容如下:

源文件:Student.hbm.xml
<?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"> 
<hibernate-mapping>     
    <class name="Student" table="Student">         
        <id name="student_id" column="student_id" type="java.lang.Integer">             
            <generator class="native">         
                <param name="sequence">student_sequence</param>
            </generator>
        </id>         
        <property name="student_name" column="Student_Name"
 type="java.lang.String"/>
        <property name="student_age" column="Student_Age" 
type="java.lang.Integer"/>
    </class>
</hibernate-mapping>

注意,在这个xml文件中,我们首先使用class元素定义了我们定义的Java类和数据库表之间的关系,在这里,我们定义的Java类和数据库表名称都是Student,然后,我们使用id元素定义了主键名称、类型等,它有一个子元素generator来说明主键的产生方式,此处指定的是“native”,表示根据数据库来选择,比如,对于Oracle数据库,它会去寻找一个sequence(默认情况下,它会去寻找一个名为“hibernate_sequence”的sequence),我们可以用参数param来指定一个sequence。而property用来指定Student.java类中的属性和Student数据库表之间的对应关系,以及各个字段的数据类型。在这个例子中,我们指定的数据类型是Java语言中的数据类型(此时需要指定引用类型数据),我们也可以使用Hibernate中自定义的数据类型,限于篇幅,在本文中不一一讲解。

然后,我们需要在hibernate.cfg.xml中加入这个文件的映射,可以在</session-factory>之前加入下面的语句:

<mapping resource="Student.hbm.xml"/>
最后,我们需要编写一个测试类来测试一下,能否通过Hibernate和前面我们定义的相关程序,完成对数据库的操作。我们编写一个测试类如下:
源文件:Test.java
import org.hibernate.*;
import org.hibernate.cfg.*;

public class Test
{
    public static void main(String[] args)
    {
        try
        {
            //通过Configuration获得一个SessionFactory对象
SessionFactory sf 
= new Configuration().configure().buildSessionFactory();
            //打开一个Session
            Session session = sf.openSession();
            //开始一个事务
            Transaction tx = session.beginTransaction();
            //创建一个Student对象
            Student stu = new Student();
            //通过Student的setter方法改变它的属性
            //注意student_id不用我们设置
            stu.setStudent_name("zhangsan");
            stu.setStudent_age(18);
            //通过session的save()方法将Student对象保存到数据库中
            session.save(stu);
            //提交事务
            tx.commit();
            //关闭会话
            session.close();
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }    
}

编译并运行这个程序,如果前面的配置和程序都没有问题,应该可以正确的往数据库表Student中插入一条数据,并且在控制台上能够得到如下输出(只列出部分输出内容):

Hibernate: select student_sequence.nextval from dual
Hibernate: insert into Student (Student_Name, Student_Age, student_id) values (?,?,?)

可以看到,虽然我们自己没有编写SQL语句进行插入数据的操作,但是其实Hibernate还是要使用SQL语句来进行数据库的操作,只是这个过程对程序员来说是透明的。

通过这个简单的例子,相信读者对Hibernate编程已经有了初步的了解。读者可以在此基础上进行更深入的学习。

转载于:https://www.cnblogs.com/sdu-Jumper/p/5707901.html

相关文章:

自动布局按钮排列平均分布

需要实现如下图所示的主页面布局&#xff0c;需要两排按钮&#xff0c;每一排都自动平均分布&#xff0c;Android的话直接用LinearLayout水平布局&#xff0c;并设置layout_weight即可&#xff0c;对于iOS&#xff0c;网上有使用代码实现&#xff0c;感觉略麻烦&#xff0c;我直…

maven3 手动安装本地jar到仓库

安装命令&#xff1a; mvn install:install-file -Dfile{Path/to/your/ojdbc.jar} -DgroupIdcom.oracle -DartifactIdojdbc6 -Dversion11.2.0 -Dpackagingjar我自己安装oracle14.jar 时命令如下&#xff1a;mvn install:install-file -DgroupIdcom.oracle -DartifactIdojdbc14 …

Hadoop集群的基本操作(五:Sqoop的基本操作)

实验 目的 要求 目的&#xff1a; 掌握ETL工具Sqoop的使用&#xff1b;掌握MySQL和HDFS之间的数据转换&#xff1b;要求&#xff1a; 掌握ETL工具Sqoop的使用&#xff1b;能够正常操作数据库、表、数据&#xff1b; 实 验 环 境 五台…

NEWS - InstallShield 2013 SP1发布

2013的这个国庆假期期间&#xff0c;InstallShield厂商Flexerasoftware&#xff08;中文名&#xff1a;福莱睿&#xff09;发布了最新版本InstallShield 2013的SP1&#xff0c;由于这个升级包带来一些新的技术支持和变化&#xff0c;所以特地给大家介绍一下&#xff1a; 1. 支持…

iOS 高德导航按返回后报错 解决

最近项目要添加导航功能&#xff0c;用了高德导航SDK&#xff0c;很郁闷每次从地图界面返回前一页面都报错&#xff0c;弄了很久&#xff0c;最终从高德开发者论坛找到一解决方法&#xff0c;可以试一下。 在导航的ViewController的viewWillDisappear中调用如下方法&#xff0…

Oracle的基本操作(一:子查询与常用函数)

1、描述TO_CHAR和TO_DATE函数的用法。 TO_CHAR&#xff08;d|n[,fmt]):把日期和数字转换为指定格式(fmt)的字符串; TO_DATE(x[,fmt]):把一个字符串一fmt格式转换为一个日期类型&#xff1b; 举例&#xff1a;select to_char(sysdate,yyyy-mm-dd) "char", to_date(…

易买网的一些增删改查

正如题目所说的一样,今天就来说说易买网中的一些增删改查,主要的功能有注册、用户管理以及商品分类等&#xff01; 1.注册 1.1 注册涉及到了一个ajax远端技术,主要是用来控制注册用户在数据库中是否存在&#xff1a; <script>$(function(){//焦点移出表单时$("#user…

iOS后台持续定位并定时上传

最近做一个考勤APP&#xff0c;功能很简单&#xff0c;就是一直在后台运行&#xff0c;每隔固定时间向服务器上传一次位置信息。持续运行24小时测试&#xff0c;功能实现。 1.ViewController.h文件&#xff1a; #import <CoreLocation/CoreLocation.h>并实现CLLocationMa…

jQuery UI vs Kendo UI jQuery Mobile vs Kendo UI Mobile

jQuery UI vs Kendo UI http://jqueryuivskendoui.com/#introduction jQuery Mobile vs Kendo UI Mobile http://jqueryuivskendoui.com/#mobile-introduction Kendo UI教程 http://www.cnblogs.com/pangblog/archive/2013/09/10/3313135.html转载于:https://www.cnblogs.com/j…

Oracle的基本操作(二:存储过程)

1、编写一个存储过程&#xff0c;根据输入的工作类型&#xff0c;输入该工作的平均工资。 -- Created on 2018/9/30 by YANXUKUNcreate or replace procedure avgsal(v_job in scott.emp.job%type)isavgsal2 number;beginselect avg(sal) into avgsal2 from scott.emp where j…

web11 Struts处理表单数据

电影网站&#xff1a;www.aikan66.com 项目网站&#xff1a;www.aikan66.com 游戏网站&#xff1a;www.aikan66.com 图片网站&#xff1a;www.aikan66.com 书籍网站&#xff1a;www.aikan66.com 学习网站&#xff1a;www.aikan66.com Java网站&#xff1a;www.aikan66.co…

瀑布流开源这两天

想必第一眼看到 Masonery 效果的人们会和当初的我有同样的感觉&#xff0c;惊艳&#xff01;尤其是在你双击浏览器标题栏的空白处之后&#xff0c;所有的区块都在默默寻找自己的位置&#xff0c;无论大小&#xff0c;就像上海虹桥火车站涌入地铁的人群。和技术实现无关&#xf…

iOS网络请求总结

*说明&#xff1a;文章中HTTP为宏定义的http地址&#xff0c;事例通过app_login.action的接口&#xff0c;通过传递policyNum、plateNum、phoneNum三个参数进行登录操作 一、方法1&#xff1a; Foundation框架 NSURLConnection &#xff08;1&#xff09;同步请求&#xff1a;同…

MongoDB数据库(一:基本操作)

1、创建名称为自己姓名拼音缩写的数据库&#xff1b; 2、创建名为姓名拼音缩写col的集合&#xff0c;如dugncol&#xff1b; 3、删除2中的集合&#xff0c;重新创建格式如dugncolnew的集合&#xff1b; 4、在3创建的集合中&#xff0c;插入10条文档数据&#xff0c;要求分别插入…

NYOJ--811--变态最大值

/*Name: NYOJ--811--变态最大值Author: shen_渊 Date: 17/04/17 15:49Description: 看到博客上这道题浏览量最高&#xff0c;原来的代码就看不下去了 o(╯□╰)o */#include<cstring> #include<iostream> #include<algorithm> using namespace std; struct…

扩展的八皇后问题

百度百科&#xff1a;八皇后问题是一个古老而著名的问题&#xff0c;是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯贝瑟尔于1848年提出&#xff1a;在8X8格的国际象棋上摆放八个皇后&#xff0c;使其不能互相攻击&#xff0c;即任意两个皇后都不能处于同一行、同一列或同…

C++ 常用函数方法

/* * 拆分字符串 * 参数&#xff1a; * strData 字符串 * split 分隔符 * 返回&#xff1a; * 返回动态数组std::vector<std::string> ,记得要delete 内存 */ std::vector<std::string>* GetStringArray(char* strData,char* split)…

MongoDB数据库(二:高级操作)

练习一、完成使用Java代码连接MOngoDB&#xff0c;创建集合&#xff0c;获取集合&#xff0c;插入文档&#xff0c;检 索所有文档&#xff0c;更新文档&#xff0c;删除第一个文档。 a&#xff09;连接MOngoDB b)创建集合 c)获取集合 d)插入文档 e)检索所有文档 f)更新文档 g)…

将XML转为HTML

文章参考&#xff1a;http://dreamweaver.abang.com/od/html/a/xml2html3.htm http://www.w3school.com.cn/xml/xml_xsl.asp ParseXML2HTML.xsl&#xff1a;代码如下 1 <?xml version"1.0" encoding"utf-8"?> 2 <xsl:styleshee…

Linux运维相关目录

Linux——相关运维配置文档目录 tcp 三次握手yum 配置你对linux了解多少&#xff0c;Linux 系统结构详解&#xff01;Linux LAMP环境搭建Centos6.7安装Apache2.4Mysql5.6Apache2.4Linux搭建DNS服务器Nginx概念及基础安装--详细讲解深入NginxNginx的继续深入&#xff08;日志轮询…

iOS8底部弹出日期选择或自定义选择器的方法

本文需要实现的日期选择器和自定义选择器效果如下&#xff1a; 在iOS8之前&#xff0c;可以通过UIActionSheet来实现&#xff0c;在iOS8之后&#xff0c;可以通过UIAlertController实现&#xff0c;UIAlertController的官方解释如下&#xff1a; A UIAlertController object d…

HDFS_API基本应用

实验 目的 要求 目的&#xff1a; 了解HDFS文件系统&#xff1b;掌握HDFS的架构及核心组件的职能&#xff1b;掌握HDFS数据的读写操作&#xff1b;HDFS常用操作&#xff08;Shell。Java API&#xff09;了解Hadoop2.0中HDFS相关的新特性 实 验 环 境 Java jdk 1.8&…

Docker 清理命令集锦

杀死所有正在运行的容器 复制代码代码如下:docker kill $(docker ps -a -q)删除所有已经停止的容器 复制代码代码如下:docker rm $(docker ps -a -q)删除所有未打 dangling 标签的镜像 复制代码代码如下:docker rmi $(docker images -q -f danglingtrue)删除所有镜像 复制代码代…

CentOS 6.4下编译安装MySQL 5.6.14

概述&#xff1a; CentOS 6.4下通过yum安装的MySQL是5.1版的&#xff0c;比较老&#xff0c;所以就想通过源代码安装高版本的5.6.14。 正文&#xff1a; 一&#xff1a;卸载旧版本 使用下面的命令检查是否安装有MySQL Server rpm -qa | grep mysql 有的话通过下面的命令来卸载掉…

iOS实现图片自动轮播展示

一、需要实现的效果如下图1&#xff0c;首页图片自动轮播展示&#xff0c;其中图片从网络异步加载&#xff0c;加载过程用风火轮显示加载中&#xff0c;如图2。 本文参考了以下博客文章&#xff1a; http://www.haodaima.net/art/2687144 http://www.cnblogs.com/xiaobaizhu/a…

Hadoop_MapReduce的基本应用

实验 目的 要求 目的&#xff1a; 了解MapReduce掌握MapReduce编程模型掌握MapReduce常见核心API编程MapReduce开发常用功能 实 验 环 境 Java jdk 1.8&#xff1b;apache-maven-3.6.0&#xff1b;Myeclipse C10&#xff1b;Hadoop集群&#xff1b;练习内容 任务一&…

Android源码编译过程之九鼎开发板

1 build_kernel()2 {3 # 进入源码顶层目录4 cd ${BS_DIR_KERNEL} || return 15 # 编译配置文件6 make ${BS_CONFIG_KERNEL} ARCHarm CROSS_COMPILE${BS_CROSS_TOOLCHAIN_KERNEL} || return 17 # 编译内核uImage&#xff08;arm架构、交…

eaccelerator 完全手册:配置、控制、API接口

安装官方有很详细的文档 转自 http://www.enjoyphp.com/2010/eaccelerator-manual/ 配置选项 eaccelerator.shm_size指定 eAccelerator 能够使用的共享内存数量&#xff0c;单位: MB. “0″ 代表操作系统默认。默认值为 “0″。 eaccelerator.cache_dir用户磁盘缓存的目录。eAc…

iOS解决键盘阻挡输入框

解决思路&#xff1a;有时用户编辑输入框时&#xff0c;键盘会遮挡输入框&#xff0c;这时候只要将视图整体上移键盘的高度即可&#xff0c;编辑完成后再将视图下移键盘的高度恢复正常显示。 【方法1】 实现UITextField代理UITextFieldDelegat的两个方法textFieldShouldBegin…

HBASE_API的应用

实验 目的 要求 目的&#xff1a; 掌握HBase编程&#xff1b;搭建HBase编程环境&#xff1b;配置Myeclipse引入对应的jar包&#xff1b; 实 验 环 境 Java jdk 1.8&#xff1b;apache-maven-3.6.0&#xff1b;Myeclipse C10&#xff1b;Hadoop集群&#…