在上一篇博文《纯手工编写第一个Hibernate程序》中,介绍了如何手工编写第一个简单的Hibernate程序。在那个例子中,为了降低程序编写的难度,所有的类都没有包的声明。然而在实际开发中,为了解决命名冲突的问题,通常都把类声明在某个包中。因此,本篇博文就介绍如何在第一个程序例子的基础上,为类添加包声明,并访问上个例子保存的阿汤哥的信息(为方便阅读,所有程序、配置文件中与上个实例中重复的注释都被删除,读者若有不明白之处可参考上篇博文)。<?xml:namespace prefix="o">

?xml:namespace>

我们在目录E:\DemoPrograms下新建一个目录ImprovedHibernate,来保存本实例所有的文件。

首先来看User(User.java文件中)类。

  1. package com.abc.people;

  2. public class User {

  3. private int id;

  4. private String name;

  5. private int age;

  6. private String gender;

  7. public int getId() {

  8. return id;

  9. }

  10. public void setId(int id) {

  11. this.id = id;

  12. }

  13. public String getName() {

  14. return name;

  15. }

  16. public void setName(String name) {

  17. this.name = name;

  18. }

  19. public int getAge() {

  20. return age;

  21. }

  22. public void setAge(int age) {

  23. this.age = age;

  24. }

  25. public String getGender()

  26. {

  27. return gender;

  28. }

  29. public void setGender(String gender)

  30. {

  31. this.gender = gender;

  32. }

  33. }

(User类)

如上述第一行代码所示,我们将User类声明在com.abc.people包中。包的层次结构与目录的层次结构是一一对应的。因此,我们在目录ImprovedHibernate下建立目录结构com\abc\people(如下图所示)。

然后将User.java放置到people目录中,编译之。实际上,User.java文件放置在哪里并不重要,重要的是编译后的User.class文件要在正确的位置。经过上述的编译后,就在正确的位置&mdash;&mdash;people目录下&mdash;&mdash;生成了User.class文件。

再来看User.hbm.xml映射文件。由于目前User类在包com.abc.people中,因此在hibernate-mapping元素中就用package属性指定了此包名。如下面的第六行所示。

  1. <?xml version="1.0" encoding="gb2312"?>

  2. <!DOCTYPE hibernate-mapping PUBLIC

  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

  4. "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

  5. <!--package指定类的包前缀-->

  6. <hibernate-mapping package="com.abc.people">

  7. <class name="User" table="users">

  8. <id name="id" type="java.lang.Integer" column="ID">

  9. <generator class="identity"/>

  10. </id>

  11. <property name="age" column="age"/>

  12. <property name="name"/>

  13. <property name="gender"/>

  14. </class>

  15. </hibernate-mapping>

(User.hbm.xml文件)

此文件应与User.java文件放置在同一目录下(更准确地讲,是应该与User.class放置在同一目录下),即ImprovedHibernate下的com\abc\people目录下。

接着来看配置文件hibernate.cfg.xml。由于映射文件User.hbm.xml放置在了目录com\abc\people中,因此需要修改resource的值。如下面的20至22行所示。

  1. <?xml version="1.0" encoding="gb2312"?>

  2. <!DOCTYPE hibernate-configuration PUBLIC

  3. "-//Hibernate/Hibernate Configuration DTD 3.0//EN"

  4. "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

  5. <hibernate-configuration>

  6. <session-factory>

  7. <property name="connection.driver_class">com.microsoft.sqlserver.jdbc.SQLServerDriver</property>

  8. <property name="connection.url">jdbc:sqlserver://localhost;databaseName=mydb</property>

  9. <property name="connection.username">sa</property>

  10. <property name="connection.password">admin123</property>

  11. <property name="connection.pool_size">1</property>

  12. <property name="dialect">org.hibernate.dialect.SQLServerDialect</property>

  13. <property name="current_session_context_class">thread</property>

  14. <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>

  15. <property name="show_sql">true</property>

  16. <!--指定要用到的映射文件,要写出相对于ImprovedHibernate

  17. 目录的完整路径。-->

  18. <mapping resource="com/abc/people/User.hbm.xml" />

  19. </session-factory>

  20. </hibernate-configuration>

hibernate.cfg.xml文件

这里需要注意的是,用的是&ldquo;/&rdquo;作为分隔符,而不是Windows风格的&ldquo;\&rdquo;。

接着来修改TestHibernate.java文件。我们把它声明在com.abc包下,并修改此程序的功能为读取第一个hibernate程序中保存的阿汤哥的信息。具体如下所示:

  1. //包声明。

  2. package com.abc;

  3. import org.hibernate.Session;

  4. import org.hibernate.SessionFactory;

  5. import org.hibernate.cfg.Configuration;

  6. //注意要正确地引入User类。

  7. import com.abc.people.User;

  8. public class TestHibernate {

  9. public static void main(String[] args) {

  10. Configuration cfg = new Configuration().configure();

  11. SessionFactory factory = cfg.buildSessionFactory();

  12. Session session = factory.getCurrentSession();

  13. session.beginTransaction();

  14. //从数据库中加载一个User实例。需要两个参数,第一个参数

  15. //com.abc.people.User.class是User类的Class(参见Class类

  16. //的相关内容)对象。1是这个User实例的标识属性。实际上就

  17. //是根据主键从数据库中读取一条记录,然后封装成一个User对象。

  18. //是不是比自己写JDBC语句方便、自然多了呢?

  19. User user = (User)session.load(com.abc.people.User.class, 1);

  20. String name = user.getName();

  21. String gender = user.getGender();

  22. System.out.println("****************");

  23. System.out.println("* 姓名:" + name+" *");

  24. System.out.println("* 性别:" + gender+"     *");

  25. System.out.println("****************");

  26. session.getTransaction().commit();

  27. factory.close();

  28. }

  29. }

(TestHibernate.java文件)

相应地,根据其所在包名,此文件应放置在ImprovedHibernate目录下的com\abc目录下。

此时若编译TestHibernate.java,则会报一大堆的错误,说XX包不存在,YY符号找不到。这是因为我们还没有引入程序要用到的hibernate的JAR包,也没有正确地设置CLASSPATH环境变量。这次要用到的JAR包和上次一样,所以只需简单地把上次用到的lib目录拷贝到ImprovedHibernate下即可。此时,整个实例的目录结构如下图所示:

下一步就是应该编写批处理文件setclasspath.bat了。与上篇的批处理文件类似,需要把要用到的JAR包添加到CLASSPATH中。尤为重要的是,不要漏掉了当前目录。此批处理文件的内容如下。

  1. set classpath=.;E:\DemoPrograms\ImprovedHibernate\lib\hibernate3.jar;E:\DemoPrograms\ImprovedHibernate\lib\sqljdbc4.jar;E:\DemoPrograms\ImprovedHibernate\lib\dom4j-1.6.1.jar;E:\DemoPrograms\ImprovedHibernate\lib\slf4j-api-1.6.2.jar;E:\DemoPrograms\ImprovedHibernate\lib\slf4j-simple-1.6.2.jar;E:\DemoPrograms\ImprovedHibernate\lib\hibernate-jpa-2.0-api-1.0.1.Final.jar;E:\DemoPrograms\ImprovedHibernate\lib\cglib-2.2.jar;E:\DemoPrograms\ImprovedHibernate\lib\commons-collections-3.1.jar;E:\DemoPrograms\ImprovedHibernate\lib\javassist-3.12.0.GA.jar;E:\DemoPrograms\ImprovedHibernate\lib\jta-1.1.jar

(批处理文件setclasspath.bat)

注意:上述set命令是一个完整的DOS命令,不要随便加回车键,否则会报错。

在命令行窗口中把目录切换到ImprovedHibernate下,运行此批处理文件。由于前面的com\abc和com\abc\people目录都是放置在此目录下的,因此在此目录下执行javac和java命令时,CLASSPATH中的当前目录就是此目录。这样User类等都可以被正确地加载。用如下的命令来编译TestHibernate.java。

javac com\abc\TestHibernate.java

这样在com\abc目录下就生成了TestHibernate.class文件。运行用如下的命令:java com.abc.TestHibernate(写类的全名)。运行前别忘了开启SQL Server服务。我们可以看到在一长串的日志之后,程序运行的结果如下:

成功运行了。

(点此处下载本示例的压缩包,或下面的&ldquo;附件下载&rdquo;。若创建了目录E:\DemoPrograms,则直接解压到此目录下,再把所需要的JAR包复制到lib目录中&mdash;&mdash;受上传文件最大尺寸限制,压缩包中没有JAR包&mdash;&mdash;就可以使用了。)

(后记:十分感谢博友MJ007关于图片显示问题的提醒。此问题已解决。欢迎各位博友多提建设性建议,谢谢!)


猛戳这里全面系统地学习MyBatis 3

转载于:https://blog.51cto.com/legend2011/747483

对“纯手工编写的第一个Hibernate程序”的改进相关推荐

  1. 【Java例题】8.2 手工编写字符串统计的可视化程序

      2. 手工编写字符串统计的可视化程序. 一个Frame窗体容器,布局为null,两个TextField组件,一个Button组件. Button组件上添加ActionEvent事件监听器Actio ...

  2. 单片机 stm32 差分升级 增量升级算法源码, 纯c编写跨平因为是程序源码

    单片机 stm32 差分升级 增量升级算法源码, 纯c编写跨平因为是程序源码 IAP升级 OTA升级 物联网 车联网 适用 YID:83500653978935134Deflag

  3. 单片机 stm32 差分升级 增量升级算法源码,纯c编写跨平因为是程序源码

    单片机 stm32 差分升级 增量升级算法源码,纯c编写跨平因为是程序源码 IAP升级 OTA升级 物联网 车联网 适用 现有:69500653978935134Deflag

  4. 单片机 stm32 差分升级 增量升级算法源码,提供移植 纯c编写跨平因为是程序源码

    单片机 stm32 差分升级 增量升级算法源码,提供移植 纯c编写跨平因为是程序源码 IAP升级 OTA升级 物联网 车联网 适用 YID:83500653978935134Deflag

  5. APICloud开发者进阶之路 |纯手工编写日程表功能

    本文出自APICloud官方论坛, 感谢论坛版主 赵永亮 的分享. 最近看论坛内关于极光推送的问题有很多, 本想写一个关于极光的详细教程的, 无奈已经有很多大牛分享过了, 所以只得纯手工写了一个日程表 ...

  6. Python 入门篇-用Notepad++编写出第一个python程序

    首先我们要安装Notepad++ Notepad++获取方式如下: 官网获取 小蓝枣的资源仓库获取,提取码:cu89 安装简单,选择简体中文安装就好了,中间会有个配置安装路径,想改的话可以改. 接下来 ...

  7. 【Java】如何编写、运行一个Java程序

    当我们开始学习一门语言时,实际操作必不可少.以下,通过一个实例来展示如何编写一个Java程序: 代码 public class HelloWorld{public static void main(S ...

  8. C#入门:编写运行第一个C#程序Helloworld

    参考链接: C#入门学习-希里安 下载安装Visual Studio,创建项目 在官网下载安装Professional 2022即可. https://visualstudio.microsoft.c ...

  9. 对《Python核心编程》中“第一个Python程序”的改进

    概述: 本程序主要是模仿<Python核心编程>中3.6节--第一个Python程序,并在其基础上做了一些小的改进,而改进的要求则是来源于第三章的课后练习题. 本篇博客的一个核心问题就是在 ...

最新文章

  1. java为什么实现_为什么在java中这样实现了这样的实现?
  2. C语言数据类型所占空间大小
  3. 找子串替换(kmp)poj1572
  4. 13种编程语言名称的来历
  5. 解决CentOS6.5虚拟机克隆后无法上网(网卡信息不一致)的问题
  6. UA MATH564 概率论VI 数理统计基础3 卡方分布上
  7. ASP.NET页面指令
  8. 5行代码满分:L1-053 电子汪 (10分)
  9. sbt安装、配置、運行(scala sbt helloworld)
  10. SpringMVC对日期类型的转换
  11. 白板机器学习笔记 P36-P38核方法
  12. era5数据内容说明_mysql数据库自带主从配置
  13. Hive报错:Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient
  14. JS设计模式 - 单例模式
  15. ThreadPoolExecutor线程池 —————— 开开开山怪
  16. 算法数据结构(三十五)----子数组达到累加和的最大长度系列
  17. 男人应该做的50件事(1-16)
  18. Office-Tool
  19. 20190121——不慕神仙?不羡神仙! java中的单例模式
  20. 《PeopleWare》读书笔记

热门文章

  1. table表格细边框
  2. vue循环出来的数据,通过点击事件改变了数据,但是视图却没有更新
  3. 2018寒假作业学习总结
  4. Linux下搭建mpi集群(ubuntu下用虚拟机测试)
  5. 程序员之工具杂烩(一)
  6. MIS性能优化常见问题与方案(辅助项目组性能优化的总结贴)
  7. Xcode7在运行包含HTTP协议的程序时报错解决方法 App Transport Security has blocked a cleartext HTTP (http)...
  8. 转载 - Struts2基于XML配置方式实现对action的所有方法进行输入校验
  9. Java Native Interface 二 JNI中对Java基本类型和引用类型的处理
  10. 通用存储过程分页---(测试能用的请放心试用)