对于开发信息管理系统的程序员而言,在从一个语言过渡到另一个语言时一般情况下都应该先了解
新语言的物性,同时就最起码能使用新语言完成以下功能:
1、了解语言的特点。比如:.net中的Attribute 和 java中的 annotation 等等。
2、能处理XML文件的信息。
3、实现数据库的连接、增删改等操作和一些事务的操作。
4、最少要了解一个这个新语言的ORM框架,其中.net里有NHibernate,java中的Hibernate,Ruby中的ActiveRecord都是不错的选择。
5、最少要了解一个日志框架,如.net中的Log4net,java中的Log4j等。
6、一些最基本的加密算法。如MD5,SHA等
我个人让为对一个刚接触一个新语言的程序员还是大学生来说。这几点是最基本的了。而了解了以上的技术才有可能。这些技术再结合一些好的设计方法和一些更深入的知识就能设计出比较实用的软件出来了。下面就以我学习java语言的过程,写出上面这些东西的java语言的实现。
一、语言特性
java中的语言特性可以参考相关的书籍,我个人认为要开发一个系统以下几点语言特性是必需
掌握的:
1、类的继承,方法的重载,接口的实现。并且要了解它们的作用。这方便的内容任何一本关于java的书籍都有讲述,因此这里就不多说了。
2、annotation 的基本用法
3、反射的使用
二、关于XML文件的操作我个人认为最少要实现下面两点.
下面的例使用到的XML文件内容如下:
<?
xml version="1.0" encoding="gb2312"
?>
<
data
table_name
="table1"
>
<
record
attribute1
="记录一属性一"
attribute2
="记录一属性二"
>
<
field
name
="field1"
>
字段一的内容
</
field
>
<
field
name
="field2"
>
字段一的内容
</
field
>
</
record
>
<
record
attribute1
="记录二属性一"
attribute2
="记录二属性二"
>
<
field
name
="field1"
>
字段二的内容
</
field
>
<
field
name
="field2"
>
字段二的内容
</
field
>
</
record
>
</
data
>
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
1、自由地浏览整XML文件的结构,下面给出Java的具体实现:
import
org.dom4j.Document;
import
org.dom4j.Element;
import
java.io.
*
;
import
org.dom4j.io.SAXReader;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
public
class
MainClass
...
{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public static void main(String[] args)...{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
try...{
File xmlFile = new File("C:/1.xml");
SAXReader xmlR=new SAXReader();
Document doc = xmlR.read(xmlFile);
//getRootElement()方法用于获取一个XML文件的根节点
Element rootNode=doc.getRootElement();
System.out.printf("根节点名称:%s ",rootNode.getName());
System.out.printf("根节点包含的节点数(递归):%d ",rootNode.nodeCount());
//elements()方法返回本元素的下一层的所有元数
System.out.printf("根节点包含的节点数(不递归):%d ",rootNode.elements().size());
System.out.printf("根节点的table_name属性的值:%s ",rootNode.attribute("table_name").getText());
System.out.printf("========================= ");
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
for (int i=0;i<rootNode.elements().size();i++)...{
Element subNode = (Element)rootNode.elements().get(i);
System.out.printf(" 第%d个%s节点的attribute1属性值是:%s ",i,subNode.getName(),subNode.attribute("attribute1").getText());
}
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
}catch(Exception e)...{}
}
}
2、能使用XPath语句对XML文件进行节点的查询。
import org.dom4j.Document;
import java.io.
*
;
import org.dom4j.io.SAXReader;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
public
class
MainClass
...
{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public static void main(String[] args)...{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
try...{
File xmlFile = new File("C:/1.xml");
SAXReader xmlR=new SAXReader();
Document doc = xmlR.read(xmlFile);
//查找文档中的所有record节点数
System.out.printf("XPath为'//data/record'的节点有%d个",doc.selectNodes("//record/").size());
//查找文档中的所有包含attribute1属性的record节点数,这里返回2
System.out.printf("XPath为'//data/record'的节点有%d个",doc.selectNodes("//record/@attribute1").size());
}
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
catch(Exception ee)...{
System.err.print(ee.getMessage());
}
}
}
更多相关的内容可参考:http://www.ibm.com/developerworks/cn/xml/x-dom4j.html
三、数据库的操作:
这里只讲述Oracle数据库数据库的操作。在安装了Oracle数据库以后,在oracle安装目录/ora92/jdbc/lib里有一个classes12.jar,把它加入到CLASSPATH环境变量里,或加入到你的项目能访问到的类路径中。
--
表结构
create
table
BOOKS
(
BOOK_ID
VARCHAR2
(
20
)
not
null
,
BOOK_NAME
VARCHAR2
(
200
),
AUTHOR
VARCHAR2
(
20
),
CATALOG_ID
VARCHAR2
(
20
)
)
1、数据查询示例:
import
java.sql.
*
;
import
java.sql.ResultSet;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
public
class
MainClass
...
{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public static void main(String[] args)...{
String driver = "oracle.jdbc.driver.OracleDriver";
String strUrl = "jdbc:oracle:thin:@192.168.0.237:1521: thga ";
java.sql.Connection conn=null;
ResultSet rs=null;
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
try...{
Class.forName(driver);
conn = DriverManager.getConnection(strUrl, " thxj ", " thxj ");
java.sql.Statement cmd = conn.createStatement();
rs = cmd.executeQuery("Select * from books");
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
while (rs.next())...{
System.out.printf("主键:%s ",rs.getString("book_id"));
System.out.printf("书名:%s ",rs.getString("book_name"));
System.out.printf("============= ");
}
rs.close();
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
conn.close();
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
}catch(Exception e)...{System.err.print(e.getMessage());}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
}
}
2、调用带返回值的存储过程
被调用的存储过程如下:
create
or
replace
procedure
pr_add(re out
number
,a
in
number
,b
in
number
)
is
begin
re:
=
a
+
b;
end
pr_add;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
调用方法:
import
java.sql.
*
;
import
java.sql.ResultSet;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
public
class
MainClass
...
{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public static void main(String[] args)...{
String driver = "oracle.jdbc.driver.OracleDriver";
String strUrl = "jdbc:oracle:thin:@192.168.0.237:1521: thga ";
java.sql.Connection conn=null;
ResultSet rs=null;
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
try...{
Class.forName(driver);
conn = DriverManager.getConnection(strUrl, " thxj ", " thxj ");
CallableStatement proc = null;
proc = conn.prepareCall("{ call PR_ADD(?,?,?)}");
proc.setDouble(2, 3);
proc.setDouble(3, 5);
proc.registerOutParameter(1,Types.NUMERIC);
proc.execute();
double d = proc.getDouble(1);
System.out.printf("存储过程的返回值是:%f", d);
conn.close();
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
}catch(Exception e)...{System.err.print(e.getMessage());}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
}
}
3、调用有返回列表的存储过程
由于返回的是列表,所以不能用一般的参数类型,必须要用pagkage。所以第一步先要创建一个package.
create
or
replace
package my_package
is
type my_cursor
is
ref
cursor
;
end
my_package;
被调用的存储过程如下:
CREATE
OR
REPLACE
PROCEDURE
PR_SELECT(p_CURSOR out my_package.my_cursor)
IS
BEGIN
OPEN
p_CURSOR
FOR
SELECT
*
FROM
books;
END
PR_SELECT;
调用存储过程的代码如下:
import
java.sql.
*
;
import
java.sql.ResultSet;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
public
class
MainClass
...
{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public static void main(String[] args)...{
String driver = "oracle.jdbc.driver.OracleDriver";
String strUrl = "jdbc:oracle:thin:@192.168.0.237:1521: thga ";
java.sql.Connection conn=null;
ResultSet rs=null;
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
try...{
Class.forName(driver);
conn = DriverManager.getConnection(strUrl, " thxj ", " thxj ");
CallableStatement proc = null;
proc = conn.prepareCall("{ call PR_SELECT(?)}");
proc.registerOutParameter(1,oracle.jdbc.OracleTypes.CURSOR);//注意,关键是这句。
proc.execute();
rs = (ResultSet)proc.getObject(1);
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
while (rs.next())...{
System.out.printf("书名:%s ", rs.getString("book_Name"));
}
rs.close();//用完了记得要关
conn.close();
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
}catch(Exception e)...{System.err.print(e.getMessage());}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
}
}
四、使用Hibernate进行数据库操作。
由于网上已经有大量的关于Hibernate的教程,这里就不说太多了,只说明在学习过程中遇到的总是。
1、需要引用的jar文件的总是,我在学习的过程中没有下载hibernate,我只是使用了spring里的hibernate3.jar。因为是学习使用,因此也没有使用集成开发环境来引入所需的jar文件。日前发现要使下面的演示代码成功运行,CLASSPATH环境变量最少要引用以下这几个文件
class12.jar(oracle的jdbc类)
hibernate3.jar、 commons-logging.jar、 commons-collections.jar、 ehcache-1.1.jar、 jta.jar、 cglib-nodep-2.1_3.jar、 antlr-2.7.6rc1.jar
以下是演示代码:
在项目的根目录建立一份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"
>
<
hibernate-configuration
>
<
session-factory
>
<
property
name
="connection.username"
>
thxj
</
property
>
<
property
name
="connection.url"
>
jdbc:oracle:thin:@192.168.0.23:1521:ta
</
property
>
<
property
name
="dialect"
>
org.hibernate.dialect.Oracle9Dialect
</
property
>
<
property
name
="myeclipse.connection.profile"
>
th
</
property
>
<
property
name
="connection.password"
>
th
</
property
>
<
property
name
="connection.driver_class"
>
oracle.jdbc.driver.OracleDriver
</
property
>
<!--
注意,下面这里加入hibernate要用到的model类
-->
<
mapping
resource
="test/maps/Books.hbm.xml"
/>
</
session-factory
>
</
hibernate-configuration
>
然后在项目的根目录下建立test/maps/Books.java文件,内容如下:
package
test.maps;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
public
class
Books
implements
java.io.Serializable
...
{
private String bookId;
private String bookName;
private String author;
private String catalogId;
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public String getBookId() ...{
return this.bookId;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public void setBookId(String bookId) ...{
this.bookId = bookId;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public String getBookName() ...{
return this.bookName;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public void setBookName(String bookName) ...{
this.bookName = bookName;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public String getAuthor() ...{
return this.author;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public void setAuthor(String author) ...{
this.author = author;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public String getCatalogId() ...{
return this.catalogId;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public void setCatalogId(String catalogId) ...{
this.catalogId = catalogId;
}
}
然后在项目的根目录下建立test/maps/Books.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
="test.maps.Books"
table
="BOOKS"
schema
="THXJ"
>
<
id
name
="bookId"
type
="java.lang.String"
>
<
column
name
="BOOK_ID"
length
="20"
/>
<
generator
class
="assigned"
/>
</
id
>
<
property
name
="bookName"
type
="java.lang.String"
>
<
column
name
="BOOK_NAME"
length
="200"
/>
</
property
>
<
property
name
="author"
type
="java.lang.String"
>
<
column
name
="AUTHOR"
length
="20"
/>
</
property
>
<
property
name
="catalogId"
type
="java.lang.String"
>
<
column
name
="CATALOG_ID"
length
="20"
/>
</
property
>
</
class
>
</
hibernate-mapping
>
然后修改MainClass.java文件,内容如下:
import
java.sql.
*
;
import
java.sql.ResultSet;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
public
class
MainClass
...
{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public static void main(String[] args)...{
System.out.print("开始 ");
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
try...{
org.hibernate.cfg.Configuration config = new org.hibernate.cfg.Configuration();
config.configure("/hibernate.cfg.xml");
System.out.printf("读取配置文件成功 ");
org.hibernate.Session session = config.buildSessionFactory().openSession();
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
try...{
org.hibernate.Query query = session.createQuery("From test.maps.Books");
java.util.List results = query.list();
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
for(int i=0;i<results.size();i++)...{
System.out.printf("书名是:%s ", ((test.maps.Books)results.get(i)).getBookName());
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
finally...{
session.close();
}
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
}catch(Exception e)...{System.err.printf(e.getMessage());}
}
}