??xml version="1.0" encoding="utf-8" standalone="yes"?>
]]>
]]>
大家都知道,用PL/SQLq接OracleQ是需要安装Oracle客户端Y件的。有没要惌不安装Oracle客户端直接连接Oracle呢?
其实我一直想q样做,因ؓq个客户端实在太让h讨厌了!Q!不但会安装一个JDKQ而且q会把自己放在环境变量的最前面Q会造成不小的麻烦?/p>
其实我之前问q很多h的,但是他们都说一定需要安装Oracle客户端的.......直到昨天无意中发C以下q个ҎQ?/p>
只需要在Oracle下蝲一?span class="topstoryhead">?span class="boldbodycopy">Instant Client Package的Y件就可以了,q个软g不需要安装,只要解压可以用了,很方便,q重装了系l还是可以用的?/span>
下蝲地址Q?font color="#800080">http://www.oracle.com/technology/software/tech/oci/instantclient/htdocs/winsoft.html
下蝲q个Q?span class="boldbodycopy">Instant Client Package - Basic包。然后解压到L目录Q在q个目录下徏立NETWORK文g夹,接着再这个文件夹下再建立ADMIN文g夹,然后建立tnsnames.ora文gQ内容如下:
oracledata =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = yourhostIp )(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = yourSID )
)
)
q里Ҏ自己的实际情况配|。接着打开PL/SQLQ在perference里面讄OCI
Library和Oracle_homeQ我的设|是OCI
Library=c:\oracleclient\oci.dll,Oracle_home=c:\oracleclient?/span>
Ҏ自己的实际情况配|,其实是刚才下蝲下来的那个包的\径。还有最后一个问题,需要设|一个字W集Q这h询出来的数据才不会是qQ写一个批处理pldev. bat攑ֈpl安装目录下,内容如下Q?/span>
set nls_lang=SIMPLIFIED CHINESE_CHINA.ZHS16GBK
PLSQLDev.exe
q个字符集,指的是服务器端的字符集,h据实际情况配|?/span>
最后,只要双击q个批处理,再填写帐号和密码可以了
我比较了一下,我的文章中的ҎQ客L比较大,30M左右。设|比较复杂,不过应该比较E_?font color="#800080">巴士飞扬所提供的包是一?M多一点的Q解压开?0MQ应该是某位高h做的?/p>
l色版Oracle客户端下??font color="#800080">巴士飞扬友情提供):Oracle客户?/font>
大家也说说哪个好用吧Q!Q?/p>
文章来源QCnXHacker.Net
FTP命o是Internet用户使用最频繁的命令之一Q不论是在DOSq是UNIX操作pȝ下用FTPQ都会遇到大量的FTP内部命o。熟悉ƈ灉|应用FTP的内部命令,可以大大方便使用者,q收C半功倍之效?
FTP的命令行格式为: ftp -v -d -i -n -g [L名]
-v 昄q程服务器的所有响应信息;
-n 限制ftp的自动登录,即不使用Q?
.n etrc文gQ?
-d 使用调试方式Q?
-g 取消全局文g名?
ftp使用的内部命令如?中括可C可选项):
1.![cmd[args]]Q在本地Z执行交互shellQexit回到ftp环境Q如Q?ls*.zip.1、输入用L理的命oQ新建用P以testZQ:
useradd test
修改 test 用户的密码:
passwd test
2、将新用h加到理l:
gpasswd -a test admin
3、给 test 用户创徏自己的目录:
cd /home
mkdir test
chown test /home/test
4、重新启动,
reboot
然后?test dQ?/font>
d以后Q点菜单“pȝQ系l管理-用户和组”Q进去选中你的用户Q点双?#8220;属?#8221;按钮Q到用户权限里打N要的Q?/font>
icech在网上查代码Q竟然找C一个Myeclipse7.0注册机的源代码,真强Q这个源代码L支持Myeclipse 6.5?.0两个版本Qjava的代码,很爽Q编译运行后输入惌注册的用户名Q然后再控制C׃生成相应的注册码Q?/p>
代码如下Q?/p>
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class MyEclipseGen {
private static final String LL = "Decompiling this copyrighted software
is a violation of both your license agreement and the Digital Millenium
Copyright Act of 1998 (http://www.loc.gov/copyright/legislation/dmca.pdf).
Under section 1204 of the DMCA, penalties range up to a $500,000 fine
or up to five years imprisonment for a first offense. Think about it;
pay for a license, avoid prosecution, and feel better about yourself.";
public String getSerial(String userId, String licenseNum) {
java.util.Calendar cal = java.util.Calendar.getInstance();
cal.add(1, 3);
cal.add(6, -1);
java.text.NumberFormat nf = new java.text.DecimalFormat("000");
licenseNum = nf.format(Integer.valueOf(licenseNum));
String verTime = new StringBuilder("-").append(
new java.text.SimpleDateFormat("yyMMdd").format(cal.getTime()))
.append("0").toString();
String type = "YE3MP-";
String need = new StringBuilder(userId.substring(0, 1)).append(type)
.append("300").append(licenseNum).append(verTime).toString();
String dx = new StringBuilder(need).append(LL).append(userId)
.toString();
int suf = this.decode(dx);
String code = new StringBuilder(need).append(String.valueOf(suf))
.toString();
return this.change(code);
}
private int decode(String s) {
int i;
char[] ac;
int j;
int k;
i = 0;
ac = s.toCharArray();
j = 0;
k = ac.length;
while (j < k) {
i = (31 * i) + ac[j];
j++;
}
return Math.abs(i);
}
private String change(String s) {
byte[] abyte0;
char[] ac;
int i;
int k;
int j;
abyte0 = s.getBytes();
ac = new char[s.length()];
i = 0;
k = abyte0.length;
while (i < k) {
j = abyte0[i];
if ((j >= 48) && (j <= 57)) {
j = (((j - 48) + 5) % 10) + 48;
} else if ((j >= 65) && (j <= 90)) {
j = (((j - 65) + 13) % 26) + 65;
} else if ((j >= 97) && (j <= 122)) {
j = (((j - 97) + 13) % 26) + 97;
}
ac[i] = (char) j;
i++;
}
return String.valueOf(ac);
}
public MyEclipseGen() {
super();
}
public static void main(String[] args) {
try {
System.out.println("please input register name:");
BufferedReader reader = new BufferedReader(new InputStreamReader(
System.in));
String userId = null;
userId = reader.readLine();
MyEclipseGen myeclipsegen = new MyEclipseGen();
String res = myeclipsegen.getSerial(userId, "5");
System.out.println("Serial:" + res);
reader.readLine();
} catch (IOException ex) {
}
}
}
注意Q注册Myeclipse的时候要先断开|络Q否则可能注册不成功Q?/p>
注册ҎQ?br /> window -> preferences -> myeclipse -> subscription
下面是一个网上流传很q的Myeclipse注册码,有效Q?/p>
Subscriber:MaYong
Subscription Code:ZLR8ZO-655444-54678656985359684
2.
下蝲面Q?
http://www.myeclipseide.com/Downloads-req-viewsdownload-sid-30.html
下蝲地址Q?
http://downloads.myeclipseide.com/downloads/products/eworkbench/7.0M1/MyEclipse_7.0M1_E3.4.0_Installer.exe
主要增加了对JavaScript的一些工?以及JSF(Java server face)的一些工?/font>
汉化教程:
首先打开MyEclipse7.0
然后选择Help →
然后会弹Z个输入框Q输?
http://download.eclipse.org/technology/babel/update-site/ganymede/
然后点击定Q这时也许点该网址对应的列表刷不出来,我们要点一下Refresh E等一下选择列表里面的中文那一?
选择Eclipse language pack for Simplified chinese
然后点击Install.. → 同意协议 最后等MyEclipse自动加蝲Q可能加载过E有ҎQ耐心{下Q如果实在太慢了Q重新选择一ơ试试,{完成再关闭MyEclipse 然后启动QMyEclipse
注册?
Subscriber: www.1cn.biz
Subscription Code: jLR8ZC-655444-65526656052107345
填写注册码时Q最好拔掉网U!Q!
3、Sql? Server7.0/2000/2005数据?
q接SqlServer2000
Microsoft SQLServer(cn = DriverManager.getConnection(
"jdbc:jtds:sqlserver://MyDbComputerNameOrIP:1433/master", sUsr, sPwd );
q接SqlServer2005
(URL = "jdbc:sqlserver://localhost:1433;DatabaseName=tempdb";
2000?005略有不同
4、Sybase数据?
Sybase(String url =" jdbc:sybase:Tds:localhost:5007/myDB";
//myDBZ的数据库?
Properties sysProps = System.getProperties();
SysProps.put("user","userid");
SysProps.put("password","user_password");
Connection conn= DriverManager.getConnection(url, SysProps);
5、Informix数据?
Class.forName("com.informix.jdbc.IfxDriver").newInstance();
String url =
"jdbc:informix-sqli://123.45.67.89:1533/myDB:INFORMIXSERVER=myserver;
user=testuser;password=testpassword";
//myDB为数据库?
Connection conn= DriverManager.getConnection(url);
6、MySQL数据?
MySQL(String url ="jdbc:mysql://localhost/myDB?user=soft&password=soft1234&useUnicode=
true&characterEncoding=8859_1"
//myDB为数据库?
Connection conn= DriverManager.getConnection(url);
7、PostgreSQL数据?
PostgreSQL(String url ="jdbc:postgresql://localhost/myDB"
//myDB为数据库?
String user="myuser";
String password="mypassword";
Connection conn= DriverManager.getConnection(url,user,password);
8、odbc桥接
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); //装蝲JDBC-ODBC驱动E序
strCon = "jdbc:odbc:Test_DB"; //讄数据库连接字W串 ,test_DB
9、access数据库直q用ODBC?br>Class.forName("sun.jdbc.odbc.JdbcOdbcDriver") ;
String url="jdbc:odbc:Driver={MicroSoft Access Driver (*.mdb)};DBQ="+application.getRealPath("/Data/ReportDemo.mdb");
Connection conn = DriverManager.getConnection(url,"","");
Statement stmtNew=conn.createStatement() ;
二、JDBCq接MySql方式
下面是用JDBCq接MySql的一个小的教E?nbsp;
1、查N动程?br> MySQL目前提供的java驱动E序为Connection/JQ可以从MySQL官方|站下蝲Qƈ扑ֈmysql-connector-java-3.0.15-ga-bin.jar文gQ此驱动E序为纯java驱动E序Q不需做其他配|?/p>
2、动态指定classpath
如果需要执行时动态指定classpathQ就在执行时采用Qcp方式。否则将上面?jar文g加入到classpath环境变量中?/p>
3、加载驱动程?br>try{
Class.forName(com.mysql.jdbc.Driver);
System.out.println(Success loading Mysql Driver!);
}catch(Exception e)
{
System.out.println(Error loading Mysql Driver!);
e.printStackTrace();
}
4、设|连接的url
jdbcQmysqlQ?/localhost/databasename[?pa=va][Qpa=va]
三、以下列Z在用JDBC来连接Oracle数据库时可以使用的一些技巧,q些技巧能够我们更好地发挥系l的性能和实现更多的功能Q系转蝲Q?/p>
1、在客户端Y件开发中使用Thin驱动E序
在开发Java软g斚wQOracle的数据库提供了四U类型的驱动E序Q二U用于应用Y件、applets、servlets{客L软gQ另外二U用于数据库中的Java存储q程{服务器端Y件。在客户机端软g的开发中Q我们可以选择OCI驱动E序或Thin驱动E序。OCI驱动E序利用Java本地化接口(JNIQ,通过Oracle客户端Y件与数据库进行通讯。Thin驱动E序是纯Java驱动E序Q它直接与数据库q行通讯。ؓ了获得最高的性能QOracle在客L软g的开发中使用OCI驱动E序Q这g是正的。但我徏议用Thin驱动E序Q因为通过多次试发现Q在通常情况下,Thin驱动E序的性能都超q了OCI驱动E序?/p>
2、关闭自动提交功能,提高pȝ性能
在第一ơ徏立与数据库的q接Ӟ在缺省情况下Q连接是在自动提交模式下的。ؓ了获得更好的性能Q可以通过调用带布值false参数的ConnectioncȝsetAutoCommit()Ҏ关闭自动提交功能Q如下所C:
conn.setAutoCommit(false);
值得注意的是Q一旦关闭了自动提交功能Q我们就需要通过调用Connectioncȝcommit()和rollback()Ҏ来h工的方式对事务进行管理?/p>
3、在动态SQL或有旉限制的命令中使用Statement对象
在执行SQL命oӞ我们有二U选择Q可以用PreparedStatement对象Q也可以使用Statement对象。无论多次C用同一个SQL命oQPreparedStatement都只对它解析和编译一ơ。当使用Statement对象Ӟ每次执行一个SQL命oӞ都会对它q行解析和编译。这可能会你认为,使用PreparedStatement对象比用Statement对象的速度更快。然而,我进行的试表明Q在客户端Y件中Q情况ƈ非如此。因此,在有旉限制的SQL操作中,除非成批地处理SQL命oQ我们应当考虑使用Statement对象?/p>
此外Q用Statement对象也得编写动态SQL命o更加单,因ؓ我们可以字W串q接在一P建立一个有效的SQL命o。因此,我认为,Statement对象可以使动态SQL命o的创建和执行变得更加单?/p>
4、利用helper函数对动态SQL命oq行格式?/p>
在创Z用Statement对象执行的动态SQL命oӞ我们需要处理一些格式化斚w的问题。例如,如果我们惛_Z个将名字O'Reilly插入表中的SQL命oQ则必须使用二个相连?#8220;''”h换O'Reilly中的“'”受完成这些工作的最好的Ҏ是创Z个完成替换操作的helperҎQ然后在q接字符串心服用公式表达一个SQL命oӞ使用创徏的helperҎ。与此类似的是,我们可以让helperҎ接受一个Date型的|然后让它输出ZOracle的to_date()函数的字W串表达式?/p>
5、利用PreparedStatement对象提高数据库的M效率
在用PreparedStatement对象执行SQL命oӞ命o被数据库q行解析和编译,然后被放到命令缓冲区。然后,每当执行同一个PreparedStatement对象Ӟ它就会被再解析一ơ,但不会被再次~译。在~冲Z可以发现预编译的命oQƈ且可以重C用。在有大量用L企业U应用Y件中Q经怼重复执行相同的SQL命oQ用PreparedStatement对象带来的编译次数的减少能够提高数据库的M性能。如果不是在客户端创建、预备、执行PreparedStatementd需要的旉长于StatementdQ我会徏议在除动态SQL命o之外的所有情况下使用PreparedStatement对象?/p>
6、在成批处理重复的插入或更新操作中用PreparedStatement对象
如果成批地处理插入和更新操作Q就能够显著地减它们所需要的旉。Oracle提供的Statement?CallableStatementq不真正地支持批处理Q只有PreparedStatement对象才真正地支持批处理。我们可以用addBatch()和executeBatch()Ҏ选择标准的JDBC批处理,或者通过利用PreparedStatement对象的setExecuteBatch()Ҏ和标准的executeUpdate()Ҏ选择速度更快的Oracle专有的方法。要使用Oracle专有的批处理机制Q可以以如下所C的方式调用setExecuteBatch()Q?br>PreparedStatement pstmt3D null;
try {
((OraclePreparedStatement)
pstmt).setExecuteBatch(30);
...
pstmt.executeUpdate();
}
调用setExecuteBatch()时指定的值是一个上限,当达到该值时Q就会自动地引发SQL命o执行Q标准的executeUpdate()Ҏ׃被作为批处理送到数据库中。我们可以通过调用PreparedStatementcȝsendBatch()Ҏ随时传输批处理Q务?/p>
7、用Oracle locatorҎ插入、更新大对象QLOBQ?/p>
Oracle的PreparedStatementcM完全支持BLOB和CLOB{大对象的处理,其是Thin驱动E序不支持利用PreparedStatement对象的setObject()和setBinaryStream()Ҏ讄BLOB的|也不支持利用setCharacterStream()Ҏ讄CLOB的倹{只有locator本n中的Ҏ才能够从数据库中获取LOBcd的倹{可以用PreparedStatement对象插入或更新LOBQ但需要用locator才能获取LOB的倹{由于存在这二个问题Q因此,我徏议用locator的方法来插入、更新或获取LOB的倹{?/p>
8、用SQL92语法调用存储q程
在调用存储过E时Q我们可以用SQL92或Oracle PL/SQLQ由于用Oracle PL/SQLq没有什么实际的好处Q而且会给以后l护你的应用E序的开发h员带来麻烦,因此Q我在调用存储过E时使用SQL92?/p>
9、用Object SQL对象模式{Ud数据库中
既然可以Oracle的数据库作ؓ一U面向对象的数据库来使用Q就可以考虑应用程序中的面向对象模式{到数据库中。目前的Ҏ是创建Java bean作ؓ伪装的数据库对象Q将它们的属性映到关系表中Q然后在q些bean中添加方法。尽这样作在Java中没有什么问题,但由于操作都是在数据库之外进行的Q因此其他访问数据库的应用Y件无法利用对象模式。如果利用Oracle的面向对象的技术,可以通过创徏一个新的数据库对象cd在数据库中模仿其数据和操作,然后使用JPublisher{工L成自qJava beancR如果用这U方式,不但Java应用E序可以使用应用软g的对象模式,其他需要共享你的应用中的数据和操作的应用Y件也可以使用应用软g中的对象模式?/p>
10、利用SQL完成数据库内的操?/p>
我要向大家介l的最重要的经验是充分利用SQL的面向集合的Ҏ来解x据库处理需求,而不是用Java{过E化的编E语a?/p>
如果~程人员要在一个表中查找许多行Q结果中的每个行都会查找其他表中的数据,最后,~程人员创徏了独立的UPDATE命o来成批地更新W一个表中的数据。与此类似的d可以通过在set子句中用多列子查询而在一个UPDATE命o中完成。当能够在单一的SQL命o中完成Q务,何必要让数据在网上流来流ȝQ我用户认真学习如何最大限度地发挥SQL的功能?
二、JDBCq接MySql方式
下面是用JDBCq接MySql的一个小的教E?nbsp;
1、查N动程?br> MySQL目前提供的java驱动E序为Connection/JQ可以从MySQL官方|站下蝲Qƈ扑ֈmysql-connector-java-3.0.15-ga-bin.jar文gQ此驱动E序为纯java驱动E序Q不需做其他配|?/p>
2、动态指定classpath
如果需要执行时动态指定classpathQ就在执行时采用Qcp方式。否则将上面?jar文g加入到classpath环境变量中?/p>
3、加载驱动程?br>try{
Class.forName(com.mysql.jdbc.Driver);
System.out.println(Success loading Mysql Driver!);
}catch(Exception e)
{
System.out.println(Error loading Mysql Driver!);
e.printStackTrace();
}
4、设|连接的url
jdbcQmysqlQ?/localhost/databasename[?pa=va][Qpa=va]
三、以下列Z在用JDBC来连接Oracle数据库时可以使用的一些技巧,q些技巧能够我们更好地发挥系l的性能和实现更多的功能Q系转蝲Q?/p>
1、在客户端Y件开发中使用Thin驱动E序
在开发Java软g斚wQOracle的数据库提供了四U类型的驱动E序Q二U用于应用Y件、applets、servlets{客L软gQ另外二U用于数据库中的Java存储q程{服务器端Y件。在客户机端软g的开发中Q我们可以选择OCI驱动E序或Thin驱动E序。OCI驱动E序利用Java本地化接口(JNIQ,通过Oracle客户端Y件与数据库进行通讯。Thin驱动E序是纯Java驱动E序Q它直接与数据库q行通讯。ؓ了获得最高的性能QOracle在客L软g的开发中使用OCI驱动E序Q这g是正的。但我徏议用Thin驱动E序Q因为通过多次试发现Q在通常情况下,Thin驱动E序的性能都超q了OCI驱动E序?/p>
2、关闭自动提交功能,提高pȝ性能
在第一ơ徏立与数据库的q接Ӟ在缺省情况下Q连接是在自动提交模式下的。ؓ了获得更好的性能Q可以通过调用带布值false参数的ConnectioncȝsetAutoCommit()Ҏ关闭自动提交功能Q如下所C:
conn.setAutoCommit(false);
值得注意的是Q一旦关闭了自动提交功能Q我们就需要通过调用Connectioncȝcommit()和rollback()Ҏ来h工的方式对事务进行管理?/p>
3、在动态SQL或有旉限制的命令中使用Statement对象
在执行SQL命oӞ我们有二U选择Q可以用PreparedStatement对象Q也可以使用Statement对象。无论多次C用同一个SQL命oQPreparedStatement都只对它解析和编译一ơ。当使用Statement对象Ӟ每次执行一个SQL命oӞ都会对它q行解析和编译。这可能会你认为,使用PreparedStatement对象比用Statement对象的速度更快。然而,我进行的试表明Q在客户端Y件中Q情况ƈ非如此。因此,在有旉限制的SQL操作中,除非成批地处理SQL命oQ我们应当考虑使用Statement对象?/p>
此外Q用Statement对象也得编写动态SQL命o更加单,因ؓ我们可以字W串q接在一P建立一个有效的SQL命o。因此,我认为,Statement对象可以使动态SQL命o的创建和执行变得更加单?/p>
4、利用helper函数对动态SQL命oq行格式?/p>
在创Z用Statement对象执行的动态SQL命oӞ我们需要处理一些格式化斚w的问题。例如,如果我们惛_Z个将名字O'Reilly插入表中的SQL命oQ则必须使用二个相连?#8220;''”h换O'Reilly中的“'”受完成这些工作的最好的Ҏ是创Z个完成替换操作的helperҎQ然后在q接字符串心服用公式表达一个SQL命oӞ使用创徏的helperҎ。与此类似的是,我们可以让helperҎ接受一个Date型的|然后让它输出ZOracle的to_date()函数的字W串表达式?/p>
5、利用PreparedStatement对象提高数据库的M效率
在用PreparedStatement对象执行SQL命oӞ命o被数据库q行解析和编译,然后被放到命令缓冲区。然后,每当执行同一个PreparedStatement对象Ӟ它就会被再解析一ơ,但不会被再次~译。在~冲Z可以发现预编译的命oQƈ且可以重C用。在有大量用L企业U应用Y件中Q经怼重复执行相同的SQL命oQ用PreparedStatement对象带来的编译次数的减少能够提高数据库的M性能。如果不是在客户端创建、预备、执行PreparedStatementd需要的旉长于StatementdQ我会徏议在除动态SQL命o之外的所有情况下使用PreparedStatement对象?/p>
6、在成批处理重复的插入或更新操作中用PreparedStatement对象
如果成批地处理插入和更新操作Q就能够显著地减它们所需要的旉。Oracle提供的Statement?CallableStatementq不真正地支持批处理Q只有PreparedStatement对象才真正地支持批处理。我们可以用addBatch()和executeBatch()Ҏ选择标准的JDBC批处理,或者通过利用PreparedStatement对象的setExecuteBatch()Ҏ和标准的executeUpdate()Ҏ选择速度更快的Oracle专有的方法。要使用Oracle专有的批处理机制Q可以以如下所C的方式调用setExecuteBatch()Q?br>PreparedStatement pstmt3D null;
try {
((OraclePreparedStatement)
pstmt).setExecuteBatch(30);
...
pstmt.executeUpdate();
}
调用setExecuteBatch()时指定的值是一个上限,当达到该值时Q就会自动地引发SQL命o执行Q标准的executeUpdate()Ҏ׃被作为批处理送到数据库中。我们可以通过调用PreparedStatementcȝsendBatch()Ҏ随时传输批处理Q务?/p>
7、用Oracle locatorҎ插入、更新大对象QLOBQ?/p>
Oracle的PreparedStatementcM完全支持BLOB和CLOB{大对象的处理,其是Thin驱动E序不支持利用PreparedStatement对象的setObject()和setBinaryStream()Ҏ讄BLOB的|也不支持利用setCharacterStream()Ҏ讄CLOB的倹{只有locator本n中的Ҏ才能够从数据库中获取LOBcd的倹{可以用PreparedStatement对象插入或更新LOBQ但需要用locator才能获取LOB的倹{由于存在这二个问题Q因此,我徏议用locator的方法来插入、更新或获取LOB的倹{?/p>
8、用SQL92语法调用存储q程
在调用存储过E时Q我们可以用SQL92或Oracle PL/SQLQ由于用Oracle PL/SQLq没有什么实际的好处Q而且会给以后l护你的应用E序的开发h员带来麻烦,因此Q我在调用存储过E时使用SQL92?/p>
9、用Object SQL对象模式{Ud数据库中
既然可以Oracle的数据库作ؓ一U面向对象的数据库来使用Q就可以考虑应用程序中的面向对象模式{到数据库中。目前的Ҏ是创建Java bean作ؓ伪装的数据库对象Q将它们的属性映到关系表中Q然后在q些bean中添加方法。尽这样作在Java中没有什么问题,但由于操作都是在数据库之外进行的Q因此其他访问数据库的应用Y件无法利用对象模式。如果利用Oracle的面向对象的技术,可以通过创徏一个新的数据库对象cd在数据库中模仿其数据和操作,然后使用JPublisher{工L成自qJava beancR如果用这U方式,不但Java应用E序可以使用应用软g的对象模式,其他需要共享你的应用中的数据和操作的应用Y件也可以使用应用软g中的对象模式?/p>
10、利用SQL完成数据库内的操?/p>
我要向大家介l的最重要的经验是充分利用SQL的面向集合的Ҏ来解x据库处理需求,而不是用Java{过E化的编E语a?/p>
如果~程人员要在一个表中查找许多行Q结果中的每个行都会查找其他表中的数据,最后,~程人员创徏了独立的UPDATE命o来成批地更新W一个表中的数据。与此类似的d可以通过在set子句中用多列子查询而在一个UPDATE命o中完成。当能够在单一的SQL命o中完成Q务,何必要让数据在网上流来流ȝQ我用户认真学习如何最大限度地发挥SQL的功能?
1、查N动程?br> MySQL目前提供的java驱动E序为Connection/JQ可以从MySQL官方|站下蝲Qƈ扑ֈmysql-connector-java-3.0.15-ga-bin.jar文gQ此驱动E序为纯java驱动E序Q不需做其他配|?/p>
2、动态指定classpath
如果需要执行时动态指定classpathQ就在执行时采用Qcp方式。否则将上面?jar文g加入到classpath环境变量中?/p>
3、加载驱动程?br>try{
Class.forName(com.mysql.jdbc.Driver);
System.out.println(Success loading Mysql Driver!);
}catch(Exception e)
{
System.out.println(Error loading Mysql Driver!);
e.printStackTrace();
}
4、设|连接的url
jdbcQmysqlQ?/localhost/databasename[?pa=va][Qpa=va]
三、以下列Z在用JDBC来连接Oracle数据库时可以使用的一些技巧,q些技巧能够我们更好地发挥系l的性能和实现更多的功能Q系转蝲Q?/p>
1、在客户端Y件开发中使用Thin驱动E序
在开发Java软g斚wQOracle的数据库提供了四U类型的驱动E序Q二U用于应用Y件、applets、servlets{客L软gQ另外二U用于数据库中的Java存储q程{服务器端Y件。在客户机端软g的开发中Q我们可以选择OCI驱动E序或Thin驱动E序。OCI驱动E序利用Java本地化接口(JNIQ,通过Oracle客户端Y件与数据库进行通讯。Thin驱动E序是纯Java驱动E序Q它直接与数据库q行通讯。ؓ了获得最高的性能QOracle在客L软g的开发中使用OCI驱动E序Q这g是正的。但我徏议用Thin驱动E序Q因为通过多次试发现Q在通常情况下,Thin驱动E序的性能都超q了OCI驱动E序?/p>
2、关闭自动提交功能,提高pȝ性能
在第一ơ徏立与数据库的q接Ӟ在缺省情况下Q连接是在自动提交模式下的。ؓ了获得更好的性能Q可以通过调用带布值false参数的ConnectioncȝsetAutoCommit()Ҏ关闭自动提交功能Q如下所C:
conn.setAutoCommit(false);
值得注意的是Q一旦关闭了自动提交功能Q我们就需要通过调用Connectioncȝcommit()和rollback()Ҏ来h工的方式对事务进行管理?/p>
3、在动态SQL或有旉限制的命令中使用Statement对象
在执行SQL命oӞ我们有二U选择Q可以用PreparedStatement对象Q也可以使用Statement对象。无论多次C用同一个SQL命oQPreparedStatement都只对它解析和编译一ơ。当使用Statement对象Ӟ每次执行一个SQL命oӞ都会对它q行解析和编译。这可能会你认为,使用PreparedStatement对象比用Statement对象的速度更快。然而,我进行的试表明Q在客户端Y件中Q情况ƈ非如此。因此,在有旉限制的SQL操作中,除非成批地处理SQL命oQ我们应当考虑使用Statement对象?/p>
此外Q用Statement对象也得编写动态SQL命o更加单,因ؓ我们可以字W串q接在一P建立一个有效的SQL命o。因此,我认为,Statement对象可以使动态SQL命o的创建和执行变得更加单?/p>
4、利用helper函数对动态SQL命oq行格式?/p>
在创Z用Statement对象执行的动态SQL命oӞ我们需要处理一些格式化斚w的问题。例如,如果我们惛_Z个将名字O'Reilly插入表中的SQL命oQ则必须使用二个相连?#8220;''”h换O'Reilly中的“'”受完成这些工作的最好的Ҏ是创Z个完成替换操作的helperҎQ然后在q接字符串心服用公式表达一个SQL命oӞ使用创徏的helperҎ。与此类似的是,我们可以让helperҎ接受一个Date型的|然后让它输出ZOracle的to_date()函数的字W串表达式?/p>
5、利用PreparedStatement对象提高数据库的M效率
在用PreparedStatement对象执行SQL命oӞ命o被数据库q行解析和编译,然后被放到命令缓冲区。然后,每当执行同一个PreparedStatement对象Ӟ它就会被再解析一ơ,但不会被再次~译。在~冲Z可以发现预编译的命oQƈ且可以重C用。在有大量用L企业U应用Y件中Q经怼重复执行相同的SQL命oQ用PreparedStatement对象带来的编译次数的减少能够提高数据库的M性能。如果不是在客户端创建、预备、执行PreparedStatementd需要的旉长于StatementdQ我会徏议在除动态SQL命o之外的所有情况下使用PreparedStatement对象?/p>
6、在成批处理重复的插入或更新操作中用PreparedStatement对象
如果成批地处理插入和更新操作Q就能够显著地减它们所需要的旉。Oracle提供的Statement?CallableStatementq不真正地支持批处理Q只有PreparedStatement对象才真正地支持批处理。我们可以用addBatch()和executeBatch()Ҏ选择标准的JDBC批处理,或者通过利用PreparedStatement对象的setExecuteBatch()Ҏ和标准的executeUpdate()Ҏ选择速度更快的Oracle专有的方法。要使用Oracle专有的批处理机制Q可以以如下所C的方式调用setExecuteBatch()Q?br>PreparedStatement pstmt3D null;
try {
((OraclePreparedStatement)
pstmt).setExecuteBatch(30);
...
pstmt.executeUpdate();
}
调用setExecuteBatch()时指定的值是一个上限,当达到该值时Q就会自动地引发SQL命o执行Q标准的executeUpdate()Ҏ׃被作为批处理送到数据库中。我们可以通过调用PreparedStatementcȝsendBatch()Ҏ随时传输批处理Q务?/p>
7、用Oracle locatorҎ插入、更新大对象QLOBQ?/p>
Oracle的PreparedStatementcM完全支持BLOB和CLOB{大对象的处理,其是Thin驱动E序不支持利用PreparedStatement对象的setObject()和setBinaryStream()Ҏ讄BLOB的|也不支持利用setCharacterStream()Ҏ讄CLOB的倹{只有locator本n中的Ҏ才能够从数据库中获取LOBcd的倹{可以用PreparedStatement对象插入或更新LOBQ但需要用locator才能获取LOB的倹{由于存在这二个问题Q因此,我徏议用locator的方法来插入、更新或获取LOB的倹{?/p>
8、用SQL92语法调用存储q程
在调用存储过E时Q我们可以用SQL92或Oracle PL/SQLQ由于用Oracle PL/SQLq没有什么实际的好处Q而且会给以后l护你的应用E序的开发h员带来麻烦,因此Q我在调用存储过E时使用SQL92?/p>
9、用Object SQL对象模式{Ud数据库中
既然可以Oracle的数据库作ؓ一U面向对象的数据库来使用Q就可以考虑应用程序中的面向对象模式{到数据库中。目前的Ҏ是创建Java bean作ؓ伪装的数据库对象Q将它们的属性映到关系表中Q然后在q些bean中添加方法。尽这样作在Java中没有什么问题,但由于操作都是在数据库之外进行的Q因此其他访问数据库的应用Y件无法利用对象模式。如果利用Oracle的面向对象的技术,可以通过创徏一个新的数据库对象cd在数据库中模仿其数据和操作,然后使用JPublisher{工L成自qJava beancR如果用这U方式,不但Java应用E序可以使用应用软g的对象模式,其他需要共享你的应用中的数据和操作的应用Y件也可以使用应用软g中的对象模式?/p>
10、利用SQL完成数据库内的操?/p>
我要向大家介l的最重要的经验是充分利用SQL的面向集合的Ҏ来解x据库处理需求,而不是用Java{过E化的编E语a?/p>
如果~程人员要在一个表中查找许多行Q结果中的每个行都会查找其他表中的数据,最后,~程人员创徏了独立的UPDATE命o来成批地更新W一个表中的数据。与此类似的d可以通过在set子句中用多列子查询而在一个UPDATE命o中完成。当能够在单一的SQL命o中完成Q务,何必要让数据在网上流来流ȝQ我用户认真学习如何最大限度地发挥SQL的功能?/p>
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=495470
Hibernate 是当前最行?/span>O/R mapping框架Q当前版本是3.05。它n?/span>sf.netQ现在已l成?/span>Jboss的一部分?/span>
iBATIS 是另外一U优U?/span>O/R mapping框架Q当前版本是2.0。目前属?/span>apache的一个子目了?/span>
相对Hibernate“O/R”而言Q?/span>iBATIS 是一U?#8220;Sql Mapping”?/span>ORM实现?/span>
HibernateҎ据库l构提供了较为完整的装Q?/span>Hibernate?/span>O/R Mapping实现?/span>POJO 和数据库表之间的映射Q以?/span>SQL 的自动生成和执行。程序员往往只需定义好了POJO 到数据库表的映射关系Q即可通过Hibernate 提供的方法完成持久层操作。程序员甚至不需要对SQL 的熟l掌握, Hibernate/OJB 会根据制定的存储逻辑Q自动生成对应的SQL q调?/span>JDBC 接口加以执行?/span>
?/span>iBATIS 的着力点Q则在于POJO ?/span>SQL之间的映关pR也是_iBATISq不会ؓE序员在q行期自动生?/span>SQL 执行。具体的SQL 需要程序员~写Q然后通过映射配置文gQ将SQL所需的参敎ͼ以及q回的结果字D|到指定POJO?/span>
使用iBATIS 提供?/span>ORM机制Q对业务逻辑实现人员而言Q面对的是纯_的Java对象Q?/span>
q一层与通过Hibernate 实现ORM 而言基本一_而对于具体的数据操作Q?/span>Hibernate会自动生?/span>SQL 语句Q?/span>iBATIS 则要求开发者编写具体的SQL 语句。相?/span>Hibernate而言Q?/span>iBATIS ?/span>SQL开发的工作量和数据库移植性上的让步,为系l设计提供了更大的自q间?/span>
1Q?/font> iBATIS非常单易学,Hibernate相对较复杂,门槛较高?/span>
2Q?/font> 二者都是比较优U的开源?/font>
3Q?/font> 当系l属于二ơ开?/span>,无法Ҏ据库l构做到控制和修?/span>,?/span>iBATIS的灵zL将?/span>Hibernate更适合
4Q?/font> pȝ数据处理量巨大,性能要求极ؓ苛刻Q这往往意味着我们必须通过l过高度优化?/span>SQL语句Q或存储q程Q才能达到系l性能设计指标。在q种情况?/span>iBATIS会有更好的可控性和表现?/span>
5Q?/font> iBATIS需要手?/span>sql语句Q也可以生成一部分Q?/span>Hibernate则基本上可以自动生成Q偶会写一?/span>Hql。同L需?/span>,iBATIS的工作量?/span>Hibernate要大很多。类似的Q如果涉及到数据库字D늚修改Q?/span>Hibernate修改的地方很,?/span>iBATIS要把那些sql mapping的地方一一修改?/span>
6Q?/font> 以数据库字段一一对应映射得到?/span>PO?/span>Hibernteq种对象化映得到的PO是截然不同的Q本质区别在于这U?/span>PO是扁q_的,不像Hibernate映射?/span>PO是可以表辄体的对象l承Q聚合等{关pȝQ这会直接影响C的整个Y件系l的设计思\?/span>
7Q?/font> Hibernate现在已经是主?/span>O/R Mapping框架Q从文档的丰富性,产品的完善性,版本的开发速度都要ZiBATIS
8Q?/font> 最关键的一句话?/span>iBATIS的作者说的:
If you are starting a new project and you're in full control of your object model and database design, Hibernate is a good choice of O/R tool.
If you are accessing any 3rd party databases (e.g. vendor supplied), or you're working with a legacy database, or even just a really poorly designed database, then an O/R mapper might not be capable of handling the situation. That's were an SQL Mapper comes in handy
Hibernate 和iBATIS可以说是互相补充,共同发展的关p?具体你想用什么要看实际情?如果看了上面的文字还是拿不定注意,那就Just to try it.实践是检验真理的唯一标准.鞋合不合?只有试了才知道?br>
1.Hhibernate集成度很高,更好的封装了数据库操作。ibatis适用于sql语法复杂的系l,而且也适合以前用jdbc开发的人员Q跨度不是很大?br>
2.hibernate和ibatis基本属于一cȝ啊。ibatis的LEADERQC.B说的话是Q如果你的系l全部是从头自主设计开发(数据库自p计)QSQL不至于太复杂Q团队对hibernate和面向对象熟l?..那么用hibernate但是如果数据库很大很复杂、是遗留pȝ甚至于设计比较糟p(你自׃可以做大的改动、需要重用很多遗留存储过E)Q团队没有一个hibernate牛hQ团队只对SQL熟练那么q是推荐ibatis
3.个h感觉iBatis强在复杂的查询和存储q程的用,而Hibernate则在单表的操作上有优势,其实也可以在dao层用hibernate+iBatis?br>
4.两个在必要的时候才需要在一个项目里边用两U框架。个为,hibernate适合于事务性的Q逻辑性较强的pȝQibatis适用于查询ؓȝpȝQ?br>如果要两个都用,ibatis应该作ؓhibernate的有益补充,着重解军_表连接查询的问题?br>
例如Q?/p>
<input type="button" value="转向" onclick="window.open('default.htm')">
<input type="button" value="转向" onclick="window.location='default.htm';">
用法Q?/p>
<div id="test">
<span style="color:red">test1</span> test2
</div>
在JS中可以用:
test.innerHTML:
也就是从对象的v始位|到l止位置的全部内?包括Html标签?
上例中的test.innerHTML的g是“<span style="color:red">test1</span> test2 ”?/p>
test.innerText:
从v始位|到l止位置的内? 但它去除Html标签
上例中的text.innerTest的g是“test1 test2”, 其中span标签去除了?
test.outerHTML:
除了包含innerHTML的全部内容外, q包含对象标{本w?/p>
上例中的text.outerHTML的g是<div id="test"><span style="color:red">test1</span> test2</div>
完整CZQ?/p>
<div id="test">
<span style="color:red">test1</span> test2
</div>
<a href="javascript:alert(test.innerHTML)">innerHTML内容</a>
<a href="javascript:alert(test.innerText)">inerHTML内容</a>
<a href="javascript:alert(test.outerHTML)">outerHTML内容</a>
特别说明Q?/p>
innerHTML是符合W3C标准的属性,而innerText只适用于IE览器,因此Q尽可能地去使用innerHTMLQ而少用innerTextQ如果要输出不含HTML标签的内容,可以使用innerHTML取得包含HTML标签的内容后Q再用正则表辑ּ去除HTML标签Q下面是一个简单的W合W3C标准的示例:
<a href="javascript:alert(document.getElementById('test').innerHTML.replace(/<.+?>/gim,''))">无HTML,W合W3C标准</a>