蒙在股里 发表于 2015-1-18 11:11:38

JAVA编程:浅谈实践开辟中数据源在JDBC中的使用

windows系统样,他们做了什么事或者留了一些后门程序,谁都不知道,二,java开发是跨平台,任何系统上都可以运行,对于保密型系统和大型系统开发这是必要的数据|数据源数据源在JDBC中的使用尽人皆知,JDBC(Java数据库毗连)是Java2企业版的主要构成部分。它是基于SQL层的API。经由过程把SQL语句嵌进JDBC接口的办法中,用户能够经由过程Java程序实行几近一切的数据库操纵。

JDBC只供应了接口,详细的类的完成请求数据库的计划者完成。经由过程天生这些接口的实例,即便关于分歧的数据库,Java程序也能够准确地实行SQL挪用。以是关于程序员来讲,不用把注重力放在怎样向数据库发送SQL指令,由于程序员必要懂得和用到的只是JDBC的接口,只要在少少数情形下会用到面向特定命据库的类,比方程序员但愿利用ORACLE的扩大API。

在JDBC程序中,起首必要做的是完成与数据库的毗连。在示例程序中,我们利用的是ORACLE8i的JDBC包。毗连数据库一般必要完成以下几个步骤:

1、注册数据库驱动程序(driver)

能够经由过程挪用java.sql.DriverManager类的registerDriver办法显式注册驱动程序,也能够经由过程加载数据库驱动程序类隐式注册驱动程序。比方我们但愿向假造机注册Oracle8iJDBC驱动程序显式注册:

DriverManager.registerDriver
(neworacle.jdbc.driver.OracleDriver());

隐式注册:

Class.forName(“oracle.jdbc.driver.OracleDriver”);

关于假造机怎样主动注册经由过程类加载器(ClassLoader)加载的数据库驱动程序凌驾了本文会商的局限,在此不做具体会商。

2、创建毗连

挪用java.sql.DriverManager类的getConnection()办法能够创建与数据库的毗连。GetConnection()办法前往一个Connection对象。必要注重的是,getConnection()办法会主动从数据库驱动程序注册表当选择一个最符合的驱动程序。

3、创建毗连后

同意主动更新(AutoCommit)。挪用java.sql.Connection接口的serAutoCommit()办法能够设定当程序向数据库收回一条SQL指令后,数据库是不是当即更新。上面是一个详细的实例。

在该实例中,作为getConnection()办法参数的url利用的是Net8keyword-valuepair格局。固然也能够利用一般格局。数据库安装在名为Chicago的服务器上,利用的协定是TCP协定,利用的端口是1521,数据库的SID是chidb,利用的数据库驱动程序是OracleJDBCThin驱动程序。

importjava.sql.*;
//初始化常数privatestaticStringurl=
“jdbc:oracle:thin:@(description
=(address=(host=Chicago)”+
“(protocol=tcp)(port=1521))
(connect_data=(sid=chidb)))”;
//也能够设定url为“jdbc:oracle:thin:@Chicago:1521:chidb”
privatestaticStringusername
=“guest”;privatestaticString
password=“guest”;
try
{
//注册数据库
Class.forName(“oracle.jdbc.driver.OracleDriver”);
//创建毗连
Connectionconn=
DriverManager.getConnection(url,
username,password);
//同意主动更新Conn.setAutoCommit(true);
}
catch(ClassNotFoundExceptione)
{
e.printStackTrace();
}catch(SQLExceptione)
{
e.printStackTrace();
}

从实践使用的角度动身,我们能够看出接纳这类体例毗连到数据库存在几个成绩。第一是平安性成绩,因为程序代码中包括用户名和暗码,其别人假如能失掉bytecode,能够经由过程反编译工具取得用户名和暗码。

第二是代码的可移植性成绩。假如但愿毗连的数据库称号或用户名有所变动,程序员必要修正源程序,然后把修正过的程序发送给用户。也就是说,软件没法离开数据库自力存在。如许不但会年夜年夜进步软件的本钱,也倒霉于软件自己的开展。

还大概呈现如许的情形:在某些情形下,供应数据的机构不但愿数据库的用户名和暗码让编写程序的程序员晓得晓得。如许就提出了一个成绩,怎样使Java和数据库之间创建毗连时埋没一些敏感的信息。

数据源(DataSource)及JNDI数据源是在JDBC2.0中引进的一个观点。在JDBC2.0扩大包中界说了javax.sql.DataSource接口来形貌这个观点。假如用户但愿创建一个数据库毗连,经由过程查询在JNDI服务中的数据源,能够从数据源中猎取响应的数据库毗连。

如许用户就只必要供应一个逻辑称号(LogicName),而不是数据库登录的详细细节。在这里有需要复杂先容一下JNDI。JNDI的全称是JavaNamingandDirectoryInterface,能够了解为Java称号和目次服务接口。

JNDI向使用程序供应了一个查询和利用远程服务的机制。这些服务能够是任何企业服务。关于JDBC使用程序来讲,JNDI供应的是数据库毗连服务。固然JNDI也能够向数据库供应其他服务,可是这超越了本文局限,在此不做叙述。

实在JNDI其实不难了解。复杂来讲,称号服务供应了一个把文件,打印机,服务器等实体映照到一个逻辑称号的机制。比方在操纵体系中的称号服务就把打印机映照到一个I/O端口。而目次服务能够了解为称号服务的一个扩大,它同意在服务中的各项具有本人的属性。

又以打印机为例,打印机能够是黑色打印机,撑持双面打印,撑持收集打印,撑持高速打印等。一切这些打印机的属性都能够贮存在目次服务中,和响应的打印机接洽起来。一些罕见的目次服务有NIS,NIS+,LDAP和Novell的NDS等。

JNDI使使用程序经由过程利用逻辑称号猎取对象和对象供应的服务,从而使程序员能够制止利用与供应对象的机构有联系关系的代码。比方鄙人面的例子中利用了在JNDI中的数据源,程序员就不必要供应Oracle8i驱动程序的称号,如许代码的移植才能就更强。

上面具体先容一下数据源和javax.sql.DataSource接口。在数据源中存储了一切创建数据库毗连的信息。就象经由过程指定文件名你能够在文件体系中找到文件一样,经由过程供应准确的数据源称号,你能够找到响应的数据库毗连。

javax.sql.DataSource接口界说了怎样完成数据源。在该接口中界说了九个属性。同时,OracleDataSource还完成了java.io.Serializable和javax.naming.Referenceable接口。自力利用数据源实践使用中,你能够把OracleDataSource注册到JNDI,也能够独自利用。

上面先给出一个独自利用OracleDataSource的例子:

//初始化数据源实例OracleDataSourceods
=newOracleDataSource();
ods.setDriverType("thin");
ods.setServerName("Chicago");
ods.setNetworkProtocol("tcp");
ods.setDatabaseName("chidb");
ods.setPortNumber(1521);
ods.setUser("guest");
ods.setPassword("guest");
//从数据源中猎取数据库毗连Connection
conn=ods.getConnection();
//经由过程数据库毗连举行数据操纵

利用OracleDataSource时有几点必要注重:假如利用的时服务器端外部驱动程序(server-sideinternaldriver),driverType属性会被设置为kprb,别的一切属性生效。假如利用Thin或OCI驱动程序:URL中能够包含用户登录名和用户登录暗码。比方:

jdbc:oracle:thin:guest/guest@Chicago:1521:chidb;

假如设定了url属性,tnsEntry,driverType,portNumber,networkProtocol,serverName,和databaseName属性将生效。在没有设定url属性的情形下,假如设定了tnsEntry属性,portNumber,networkProtocol,serverName,和databaseName属性将生效。

假如利用OCI驱动程序,而且networkProtocol属性被设定为ipc,除user和password外的一切其他属性将生效。经由过程JNDI利用数据源在本节起首给出了一个实践程序,然后经由过程程序来说解怎样经由过程JNDI查询数据源。

importjava.sql.*;
importjavax.sql.*;
importoracle.jdbc.driver.*;
importoracle.jdbc.pool.OracleDataSource;
importjavax.naming.*;
importjavax.naming.spi.*;
importjava.util.Hashtable;
publicclassDataSourceJNDI
{
publicstaticvoidmain
(Stringargs[])throwsSQLException
{
//初始假名称服务情况Contextctx=null;
try{Hashtableenv=newHashtable(5);
env.put(Context.INITIAL_CONTEXT_FACTORY,
"com.sun.jndi.fscontext.RefFSContextFactory");
env.put(Context.PROVIDER_URL,"file:JNDI");
ctx=newInitialContext(env);
}
catch(NamingExceptionne)
{
ne.printStackTrace();
}bind(ctx,"jdbc/chidb");
lookup(ctx,"jdbc/chidb");
}
staticvoidbind
(Contextctx,Stringln)throwsNamingException,
SQLException
{
//创立一个OracleDataSource
实例OracleDataSourceods
=newOracleDataSource();
ods.setDriverType("thin");
ods.setServerName("Chicago");
ods.setNetworkProtocol("tcp");
ods.setDatabaseName("chidb");
ods.setPortNumber(1521);
ods.setUser("guest");
ods.setPassword("guest");
//把OracleDataSource实例注册到JNDI中
System.out.println
("Doingabindwiththelogicalname:"+ln);
ctx.bind(ln,ods);
System.out.println
("Successfullybound");
}
staticvoidlookup
(Contextctx,Stringln)throws
NamingException,SQLException
{
//从JNDI中查询OracleDataSource
实例System.out.println
("Doingalookupwiththelogicalname
:"+ln);
OracleDataSourceods
=(OracleDataSource)
ctx.lookup(ln);
System.out.println("Successfullookup");
//从查询到的OracleDataSource
实例中猎取数据库毗连
Connectionconn=ods.getConnection();
//举行数据库操纵getUserName(conn);
//封闭毗连conn.close();
conn=null;
}
staticvoidgetUserName
(Connectionconn)throwsSQLException
{
//天生一个Statement实例Statement
stmt=conn.createStatement();
//从addressbook表当选中姓名列ResultSet
rset=stmt.executeQuery
("selectNAMEfromaddressbook");
//列出addressbook表一切人的姓名while
(rset.next())System.out.println
("Nameis"+rset.getString(1));
//封闭RseultSet实例rset.close();
rset=null;
//封闭Statement实例stmt.close();
stmt=null;
}
}

程序起首天生了一个Context实例。javax.naming.Context接口界说了称号服务情况(NamingContext)及该情况撑持的操纵。称号服务情况实践上是由称号和对象间的互相映照构成。程序中初始假名称服务情况的情况工场(ContextFactory)是com.sun.jndi.fscontext.RefFSContextFactory(该类在fscontext.jar中能够找到,因为fscontext.jar中包括的不是尺度的API,用户必要从www.javasoft.com中的JNDI专区下载一个名为fscontext1_2beta3.zip的紧缩文件,在该文件中能够找到fscontext.jar)。

情况工场的感化是天生称号服务情况的实例,javax.naming.spi.InitialContextFactory接口界说了情况工场应当怎样初始假名称服务情况。在初始假名称服务情况时还必要界说情况的URL。

程序中利用的是"file:JNDI",也就是把情况保留在当地硬盘的JNDI目次下。初始化了称号服务情况后,就能够把数据源实例注册到称号服务情况中。注册时挪用javax.naming.Context.bind()办法,参数为注册称号和注册对象。

注册乐成后,在JNDI目次下会天生一个.binding文件,该文件纪录了以后称号服务情况具有的称号及对象。当必要在称号服务情况中查询一个对象时,必要挪用javax.naming.Context.lookup()办法,并把查询到的对象显式转化为数据源对象。

然后经由过程该数据源对象举行数据库操纵。在这个例子中,程序和称号服务情况都是在统一台盘算机上运转。在实践的使用中,程序能够经由过程RMI或CORBA向称号服务情况注册或查询对象。

比方在一个服务器-客户机布局中,客户机上的使用程序只必要晓得数据源对象在服务器称号服务情况中的逻辑称号,就能够经由过程RMI向服务器查询数据源,然后经由过程创建与数据库的毗连.如许就能够办理本文最入手下手提出的成绩。
他们对jsp,servlet,javabean进行封装就是为了展示他们的某个思想,与java的开发并没有必然的关系,也不见得在所以情况下,别人使用起来会简单。

深爱那片海 发表于 2015-1-18 22:48:47

一直感觉JAVA很大,很杂,找不到学习方向,前两天在网上找到了这篇文章,感觉不错,给没有方向的我指了一个方向,先不管对不对,做下来再说。

蒙在股里 发表于 2015-1-23 18:45:31

你就该学一学Servlet了。Servlet就是服务器端小程序,他负责生成发送给客户端的HTML文件。JSP在执行时,也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet,这也是SUN推出JSP的本意,可是Servlet用来控制流程跳转还是挺方便的,也令程序更清晰。接下来你应该学习一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了,这种方式跟ASP又有什么区别呢?

再见西城 发表于 2015-1-30 07:28:27

学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。

因胸联盟 发表于 2015-2-2 21:52:32

自从Sun推出Java以来,就力图使之无所不包,所以Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE,这也就是Sun ONE(Open Net Environment)体系。J2SE就是Java2的标准版,主要用于桌面应用软件的编程;J2ME主要应用于嵌入是系统开发,如手机和PDA的编程;J2EE是Java2的企业版,主要用于分布式的网络程序的开发,如电子商务网站和ERP系统。

海妖 发表于 2015-2-4 21:39:16

接着就是EJB了,EJB就是Enterprise JavaBean, 看名字好象它是Javabean,可是它和Javabean还是有区别的。它是一个体系结构,你可以搭建更安全、更稳定的企业应用。它的大量代码已由中间件(也就是我们常听到的 Weblogic,Websphere这些J2EE服务器)完成了,所以我们要做的程序代码量很少,大部分工作都在设计和配置中间件上。

老尸 发表于 2015-2-10 16:06:08

是一种为 Internet发展的计算机语言

愤怒的大鸟 发表于 2015-2-11 08:12:03

象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。

兰色精灵 发表于 2015-3-2 00:48:27

其实说这种话的人就如当年小日本号称“三个月拿下中国”一样大言不惭。不是Tomjava泼你冷水,你现在只是学到了Java的骨架,却还没有学到Java的精髓。接下来你得研究设计模式了。

admin 发表于 2015-3-11 01:13:52

至于JDBC,就不用我多说了,你如果用java编过存取数据库的程序,就应该很熟悉。还有,如果你要用Java编发送电子邮件的程序,你就得看看Javamail 了。

若天明 发表于 2015-3-17 17:22:58

多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。

只想知道 发表于 2015-3-24 15:08:10

是一种由美国SUN计算机公司(Sun Microsystems, Inc.)所研究而成的语言
页: [1]
查看完整版本: JAVA编程:浅谈实践开辟中数据源在JDBC中的使用