|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
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的开发并没有必然的关系,也不见得在所以情况下,别人使用起来会简单。 |
|