Java程序员从笨鸟到菜鸟之(五十一)细谈Hibernate(二)开发第一个hibernate基本详解
在上篇博客中,我们介绍了《hibernate基本概念和体系结构》,也对hibernate框架有了一个初步的了解,本文我将向大家简单介绍Hibernate的核心API调用库,并讲解一下它的基本配置。核心API的底层实现和源码解析将在以后的博客中一一为大家讲解。
首先我们一起来看一下开发一个hibernate应用程序的大体流程是什么样的(流程顺序可以颠倒):
•创建Hibernate的配置文件
•创建持久化类
•创建对象-关系映射文件
•通过Hibernate API编写访问数据库的代码
关于配置文件推荐阅读:细谈Hibernate(四)Hibernate常用配置文件详解
知道了开发流程,那么我们就开始我们的第一hibernate应用程序,首先我们以一个简单的学生管理应用程序来作为我们第一hibernate应用程序的开发,让大家熟悉一下hibernate的开发流程,以及对相对应功能的API有初步的认识,Hibernate应用程序定义了一些持久类,并且定义了这些类与数据库表格的映射关系。在我们这个简单的学生管理应用程序中包含了一个类和一个映射文件。让我们看看这个简单的持久类包含有一些什么?映射文件是怎样定义的?另外,我们该怎样用Hibernate来操作这个持久类。
Hibernate开发全面流程和开发配置
首先创建一个项目。然后创建配置开发环境,主要步骤如下:
MyEclipse-->ProjectCapabilities-->add Hibernate Capabilities,视图如下:
复选框选中第二个copychecke。。。。那一个。然后点击next;
为了锻炼能力,配置文件第一次手写,不用图形界面自动生成,所以把: Open configurationfile after wizard completion 选中的点掉;点击next
Specify database connection details把这也点掉;点击next;
全部都用手写,所以把create sessionFactry class此处也点掉;点击Finish;然后lib里面会自动增加一系列jar包
并且src里面也生成了hibernate.cfg.xml,:
由于本人此次练习的是整合Struts与Hibernate进行应用的开发
所以还要进行struts相关文件的配置,由于struts相关文件配置比较简单,所以此处省略;
首先编写一个持久化类:本人创建的是person类:模型类即为javabean,很简单;
注:持久化类符合JavaBean的规范,包含一些属性,以及与之对应的getXXX()和setXXX()方法。
•持久化类有一个id属性,用来惟一标识Person类的每个对象。在面向对象术语中,这个id属性被称为对象标识符(OID,Object Identifier)
•Hibernate要求持久化类必须提供一个不带参数的默认构造方法
下一步即写一个提交到数据库内容的表单,简单的表单不在此处写了。然后写一个action,获得表单的内容:此处action中的处理方法:execute()里面主要是把表单所要提交的信息调用模型类封装成一个类
下一步即将和hibernate的API打交道了。。。编写工具类HibernateUtil这个类主要是获得和数据库打交道的Session类
- 主要代码:
- privatestatic SessionFactory sessionFactory;
- //由于一共只有一个SessionFactory所以把创建SessionFactory的代码放到static代码块里面,让他只创建一次
- static {
- try {
- /**
- * 创建SessionFactory过程:
- * 1.new Configuration().configure()获得一个configuration的实例
- * 2.configuration.buildSessionFactory()获得创建session的工厂sessionFactory的实例
- 注:Configuration类用来管理我们的配置文件的信息的,通过它,我们可以通过创建一个configuration实例来管理相应的配置文档,但是通常我们只创建一个configuration实例。
- * */
- sessionFactory = new Configuration().configure()
- .buildSessionFactory();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- publicstatic Session openSession(){
- //获得与数据库打交道的实例session
- Session session=sessionFactory.openSession();
- //把工具session返回给调用者
- return session;
- }
注意:此Session非彼Session(HttpSession)
一个SessionFactory实例对应一个数据存储源,应用从SessionFactory中获得Session实例。
SessionFactory有以下特点:
–它是线程安全的,这意味着它的同一个实例可以被应用的多个线程共享。
–它是重量级的,这意味着不能随意创建或销毁它的实例。如果应用只访问一个数据库,只需要创建一个SessionFactory实例,在应用初始化的时候创建该实例。如果应用同时访问多个数据库,则需要为每个数据库创建一个单独的SessionFactory实例。
Session接口是Hibernate应用使用最广泛的接口。
•Session也被称为持久化管理器,它提供了和持久化相关的操作,如添加、更新、删除、加载和查询对象。
•Session有以下特点:
–不是线程安全的,因此在设计软件架构时,应该避免多个线程共享同一个Session实例。
–Session实例是轻量级的,所谓轻量级是指它的创建和销毁不需要消耗太多的资源。这意味着在程序中可以经常创建或销毁Session对象,例如为每个客户请求分配单独的Session实例,或者为每个工作单元分配单独的Session实例。
Session接口提供了操纵数据库的各种方法,如:
–save()方法:把Java对象保存数据库中。
–update()方法:更新数据库中的Java对象。
–delete()方法:把Java对象从数据库中删除。
–get()方法:从数据库中加载Java对象。
然后在编写用session处理数据类DAO类,先编写有关接口然后编写实现类personDaoImpl,这个类主要用session处理数据执行事务的类:
示例代码:
- //调用工具类获得session
- Session session = factory.openSession();
- Transaction tx;
- try {
- //开始一个事务
- tx = session.beginTransaction();
- //执行事务
- Student stu=new Student(“李华”,”男”,”山东”);
- Session.save(stu);
- //提交事务
- tx.commit();
- }
- catch (Exception e) {
- //如果出现异常,就撤销事务
- if (tx!=null) tx.rollback();
- throwe;
- }
- finally {
- //不管事务执行成功与否,最后都关闭Session
- session.close();
- }
然后编写逻辑处理类(服务类):先写有关接口,然后写实现类.这个类主要用于处理一些逻辑处理,在这个地方主要用于调用数据处理类DAO进行数据处理
- publicclass PersonServiceImpl implements PersonService {
- publicvoid savePerson(Person person)
- {
- PersonDAO personDAO = new PersonDAOImpl();
- personDAO.savePerson(person);
- }
- }
然后直接在action里面写出PersonServiceImpl实例进行调用其方法进行就可以了。Action里面主要处理方法代码示例
- <span xmlns="http://www.w3.org/1999/xhtml">public String execute() throws Exception
- {
- Person person = new Person();
- person.setUsername(username);
- person.setPassword(password);
- person.setAge(age);
- java.sql.Date registerDate = new java.sql.Date(new java.util.Date().getTime());
- System.out.println("222222");
- person.setRegisterDate(registerDate);
- PersonServiceImpl personService = new PersonServiceImpl();
- personService.savePerson(person);
- returnSUCCESS;
- }
- </span>
写到这,一个hibernate主要的逻辑层就差不多了,现在就主要看怎样写配置文件了:先配置hibernate.cfg.xml.主要配置示例:
- <span xmlns="http://www.w3.org/1999/xhtml"><?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">
- <hibernate-configuration>
- <session-factory>
- <property name="connection.url">jdbc:sqlserver://localhost:1433; DatabaseName=Hibernate</property>
- <property name="connection.username">sa</property>
- <property name="connection.password">123456</property>
- <property name="connection.driver_class">com.microsoft.sqlserver.jdbc.SQLServerDriver</property>
- <property name="dialect">org.hibernate.dialect.SQLServerDialect</property>
- <property name="show_sql">true</property>
- <mapping resource="Person.hbm.xml"/>//映射到具体person表的配置文件
- </session-factory>
- </hibernate-configuration></span>
注意:
Hibernate的描述文件中存放数据库连接驱动程序类,登陆数据库的用户名/密码,映射实体类配置文件的位置等信息。
•将该配置文件存放在src目录下
描述文件相关属性描述含义:
最后一步:
对持久化(实体)类Person.java文件创建一个Hibernate映射文件Person.hbm.xml
Java的实体类是通过配置文件与数据表中的字段相关联。Hibernate在运行时解析配置文件,根据其中的字段名生成相应的SQL语句
•将该文件存放在src目录下
具体代码示例:
- <span xmlns="http://www.w3.org/1999/xhtml"><?xml version="1.0"?>
- <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
- <hibernate-mapping>
- <class name="com.csh.model.Person" table="person">
- <id name="id" column="id" type="int">
- <generator class="increment"></generator>
- </id>
- <property name="username" column="username" type="string"></property>
- <property name="password" column="password" type="string"></property>
- <property name="age" column="age" type="int"></property>
- <property name="registerDate" column="registerDate" type="date"></property>
- </class>
- </hibernate-mapping></span>
注:id元素对应的一定是数据库的主键列;class="increment"意为自增
<property>元素映射值 类型属性
•name属性:指定持久化类的属性的名字。
•type属性:指定Hibernate或Java映射类型。Hibernate映射类型是Java类型与SQL类型的桥梁。
•column属性:指定与类的属性映射的表的字段名。
至此,hibernate开发过程和相关配置就此完毕
from: http://blog.csdn.net/csh624366188/article/details/7559676
Java程序员从笨鸟到菜鸟之(五十一)细谈Hibernate(二)开发第一个hibernate基本详解的更多相关文章
- Java程序员从笨鸟到菜鸟之(十三)java网络通信编程
本文来自:曹胜欢博客专栏.转载请注明出处:http://blog.csdn.net/csh624366188 首先声明一下,刚开始学习java网络通信编程就对他有一种畏惧感,因为自己对网络一窍不通,所 ...
- Java程序员从笨鸟到菜鸟全部博客目录
本文来自:曹胜欢博客专栏.转载请注明出处:http://blog.csdn.net/csh624366188 大学上了一年半,接触java也一年半了,虽然中间也有其他东西的学习,但是还是以java为主 ...
- 《Java程序员由笨鸟到菜鸟》
<Java程序员由笨鸟到菜鸟> 在众多朋友的支持和鼓励下,<Java程序员由菜鸟到笨鸟>电子版终于和大家见面了.本电子书涵盖了从java基础到javaweb开放框架的大部分内容 ...
- Java程序员从笨鸟到菜鸟之(九十六)深入java虚拟机(五)——java本地接口JNI详解
http://blog.csdn.net/csh624366188/article/details/8063144 对于Java程序员来说,java语言的好处和优点,我想不用我说了,大家自然会说出很多 ...
- Java程序员从笨鸟到菜鸟之(一百)sql注入攻击详解(一)sql注入原理详解
前段时间,在很多博客和微博中暴漏出了12306铁道部网站的一些漏洞,作为这么大的一个项目,要说有漏洞也不是没可能,但其漏洞确是一些菜鸟级程序员才会犯的错误.其实sql注入漏洞就是一个.作为一个菜鸟小程 ...
- Java程序员从笨鸟到菜鸟之(一百零二)sql注入攻击详解(三)sql注入解决办法
sql注入攻击详解(二)sql注入过程详解 sql注入攻击详解(一)sql注入原理详解 我们了解了sql注入原理和sql注入过程,今天我们就来了解一下sql注入的解决办法.怎么来解决和防范sql注入, ...
- Java程序员从笨鸟到菜鸟之(一百零一)sql注入攻击详解(二)sql注入过程详解
在上篇博客中我们分析了sql注入的原理,今天我们就来看一下sql注入的整体过程,也就是说如何进行sql注入,由于本人数据库和网络方面知识有限,此文章是对网上大量同类文章的分析与总结,其中有不少直接引用 ...
- Java程序员从笨鸟到菜鸟之(五十二)细谈Hibernate(三)Hibernate常用API详解及源码分析--csdn 曹胜欢
新接触一个框架的目的就是想利用这个框架来为我们做一些工作,或者是让他来简化我们的工作,利用这个框架无非就是要利用这个框架所给我们提供的API去操作我们的数据,所以利用一个框架的好坏很大一部分取决于你对 ...
- Java程序员从笨鸟到菜鸟之(二十一)java过滤器和监听器详解 【转】
过滤器 1.Filter工作原理(执行流程) 当客户端发出Web资源的请求时,Web服务器根据应用程序配置文件设置的过滤规则进行检查,若客户请求满足过滤规则,则对客户请求/响应进行拦截,对请求头和请 ...
随机推荐
- ORA-01034错误:ORALCE NOT CONNECT
解决办法: 启动数据库 sqlplus '/as sysdba ' startup;
- UITableView常见 UI 问题总结
一,经历 1.让 group 形式的UITableView的单元格也可以修改separatorStyle属性来设置. 2.修改group形式的UITableView的 cell 之间的间距,可以更改s ...
- Poj 3250 单调栈
1.Poj 3250 Bad Hair Day 2.链接:http://poj.org/problem?id=3250 3.总结:单调栈 题意:n头牛,当i>j,j在i的右边并且i与j之间的所 ...
- 0代码隐藏GroupedTableView上边多余的间隔
0代码隐藏GroupedTableView上边多余的间隔 实现诸如支付宝的 “探索” 页面时,最简单的方案是在 Storyboard 中来一个静态 Grouped UITableViewControl ...
- GO语言练习:第二个工程--模拟音乐播放器
1.代码 2.编译及运行 1.目录结构 1.1) $ tree . ├── mplayer.go └── src ├── mlib │ ├── manager.go │ └── manager ...
- 李洪强iOS经典面试题123
1.static 关键字的作用: (1)函数体内 static 变量的作用范围为该函数体,不同于 auto 变量,该变量的内存只被分配一次, 因此其值在下次调用时仍维持上次的值; (2)在模块内的 s ...
- Eclipse上的项目分享到GitHub
1. 右击项目:team --> Share Project 2. 在弹出的选择框中选择 Git ,点击Next 3. Configure Git Repository 按照下图选择,点击Fin ...
- 获取到body的offsetTop和offsetLeft值
function offsetTL(obj){//获取到body的offsetTop和offsetLeft var t=0,l=0; while(obj){ t=t+obj.offsetTop; l= ...
- spring security 匿名登录
匿名登录,即用户尚未登录系统,系统会为所有未登录的用户分配一个匿名用户,这个用户也拥有自己的权限,不过他是不能访问任何被保护资源的. 设置一个匿名用户的好处是,我们在进行权限判断时,可以保证Secur ...
- apache本地域名ip重定向vhosts
apache本地域名ip重定向,使本机通过指定域名访问到指定ip路径. 1.apache配置apache/conf/httpd.conf : 开启配置 Include conf/extra/http ...