Java中不使用集成开发环境连接数据库
今天学习了J2EE中连接数据库的方法,由此想到了使用java代码连接数据库。于是试验了一下,由于不使用集成的开发环境,那么将数据库的驱动放到哪里。从网上查了很多资料,加上自己的猜测,可以放置的地方有这么几个:
1. 在CLATHPATH中加上我们的驱动jar包,至于路径可以随意放置了,但是网上有网友的建议是目录要短,并且每一级的长度不要大于8.3。
2. 第二个想到的目录肯定是当前目录,也就是与主.claa文件所在的目录。
3. 再想到的目录就是jre的lib目录,这个目录似乎有两种,一个是jre目录,另外一个就是jdk目录下的jre目录中的lib目录。
4. 最后一个应该就是jdk的lib目录了,但是这个目录怎么想似乎也不靠谱,它是编译使用的路径,并不是执行时使用的,所以想着也不太对。
逐个目录进行试验,都以失败告终,没有办法,只有查找其他的资料。对java的执行进行一个思考,java的.class类是由jvm来解释的,那么数据库驱动的jar包肯定要加载到jvm中,我们的主类才可能找到。那么那个放置到那个目录才会被加载呢?最终也没有找到相关的资料,根据一些现有的资料也没能够实现。
根据上面的分析,我们将jar包内的用到的目录中的文件按照目录结构解压缩到主类的根目录,执行成功。那么我们上面的分析是正确的,现在的问题就是需要我们自己来将用到的jar包在程序执行时加载。
有了这个思路,从网上找到了动态加载jar包的方法,按照一个网友给出的代码,调试后果然成功,下面将主文件的代码和加载jar的代码粘贴出来。
注:Jar包加载代码从其他网友转载而来,为了编写方便,将包名做了修改,特此声明。
主类:
//
import java.sql.*;
import java.sql.*;
import com.AndyGuo.JarLoader;
public class DatabaseTest
{
public static void main(String[] srg)
{
Connection ct = null;
Statement sm = null;
ResultSet rs = null;
JarLoader.loadJarPath("lib");
try
{
// 连接数据库
Class.forName("com.mysql.jdbc.Driver");
// 得到连接
ct = DriverManager.getConnection("jdbc:mysql://localhost/spdb", "root", "root");
// 创建Statement
sm = ct.createStatement();
rs = sm.executeQuery("select * from users");
// 说明有用户存在
if(rs.next())
{
String dbPasswd = rs.getString( 1);
System.out.println( dbPasswd);
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
/**
* Copyright (c) YMCN Team
* All rights reserved.
*
*/
package com.AndyGuo;
import java.io.File;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.List;
/**
* @author obullxl
*
* email: obullxl@163.com MSN: obullxl@hotmail.com QQ: 303630027
*
* Blog: http://obullxl.iteye.com
*/
public final class JarLoader{
/** URLClassLoader的addURL方法 */
private static Method addURL = initAddMethod();
/** 初始化方法 */
private static final Method initAddMethod() {
try {
Method add = URLClassLoader.class.getDeclaredMethod("addURL", new Class[]{URL.class});
add.setAccessible(true);
return add;
}
catch(Exception e)
{
e.printStackTrace();
}
return null;
}
private static URLClassLoader system = (URLClassLoader) ClassLoader.getSystemClassLoader();
/**
* 循环遍历目录,找出所有的JAR包
*/
private static final void loopFiles(File file, List<File> files) {
if (file.isDirectory())
{
File[] tmps = file.listFiles();
for (File tmp : tmps)
{
loopFiles(tmp, files);
}
}
else
{
if (file.getAbsolutePath().endsWith(".jar") || file.getAbsolutePath().endsWith(".zip"))
{
files.add(file);
}
}
}
/**
* <pre>
* 加载JAR文件
* </pre>
*
* @param file
*/
public static final void loadJarFile(File file) {
try {
addURL.invoke(system, new Object[] { file.toURI().toURL() });
System.out.println("加载JAR包:" + file.getAbsolutePath());
}
catch (Exception e)
{
e.printStackTrace();
}
}
/**
* <pre>
* 从一个目录加载所有JAR文件
* </pre>
*
* @param path
*/
public static final void loadJarPath(String path) {
List<File> files = new ArrayList<File>();
File lib = new File(path);
loopFiles(lib, files);
for (File file : files)
{
loadJarFile(file);
}
}
}
By 北洋小郭
转载请注明出处,谢谢!