今天碰到了一个很怪的问题。
在同一个包下,我建立了两个Java文件(想拿来做Javabean的),分别为DBLink.java 和DBUtil.java。先编译好DBLink后,再编译DBUtil.java时却出现 cannot find symbol ( DBLink)字样。
后来,我没有按照先后顺序编译,而是直接 Java *.java 这样就不会出问题了。这是为什么呢?因为我的两个源码存在明显的先后关系( DBLink 是连接数据库 DBUtil是一些实用操作),那为什么分开编译后就不可以了呢?????
谢谢
// Java Document
package leeWebDemo1.database;
import java.sql.*;
public class DBLink
{
private static Connection conn;
private Statement stmt;
private ResultSet rs;
private static final String mysqlDriver="com.mysql.jdbc.Driver";
private static final String url="jdbc:mysql://localhost:3306/mysql?user=root&password=123456";
public static synchronized Connection getConn() throws Exception
{
try
{
Class.forName(mysqlDriver);
conn=DriverManager.getConnection(url);
return conn;
}
catch(SQLException e)
{
System.err.println(e.getMessage());
System.err.println(e.getMessage());
System.err.println("加载驱动失败!");
throw e;
}
}
//获取Statement 只用于查询语句
public Statement getStmtread()
{
try
{
conn=getConn();
stmt=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
return stmt;
}
catch(Exception e)
{
System.err.println(e.getMessage());
e.printStackTrace();
}
return null;
}
//获取ResultSet
public ResultSet getRs(String sql)
{
try
{
stmt=getStmtread();
rs=stmt.executeQuery(sql);
return rs;
}
catch(Exception e)
{
System.err.println(e.getMessage());
e.printStackTrace();
}
return null;
}
//获取statement 与上面的getStmtread不同用于删除、更新和添加的SQL语句;
public Statement getStmt()
{
try
{
conn=getConn();
stmt=conn.createStatement();
return stmt;
}
catch(Exception e)
{
System.err.println(e.getMessage());
e.printStackTrace();
}
return null;
}
//关闭数据库
public synchronized void close()
{
try
{
if(rs!=null)
rs.close();
rs=null;
}
catch(Exception e)
{
System.err.println(e.getMessage());
e.printStackTrace();
}
try
{
if(stmt!=null)
{
stmt.close();
stmt=null;
}
}
catch(Exception e)
{
System.err.println(e.getMessage());
e.printStackTrace();
}
try
{
if(conn!=null)
{
conn.close();
conn=null;
}
}
catch(Exception e)
{
System.err.println(e.getMessage());
e.printStackTrace();
}
}
}
// 本JavaBean包括数据的插入、更新、删除和查询等。package leeWebDemo1.database;
import java.sql.*;public class DBUtil
{
private DBLink dblink=new DBLink();
private Statement stmt;
private ResultSet rs;
//获取查询的行数:没有结果返回-1,查询异常返回-2;
public int getRowCount(String strSql)
{
int intCount=0;
try{
stmt=dblink.getStmtread();
rs=stmt.executeQuery("SELECT COUNT(*) FROM"+strSql);
if(rs.next())
{
intCount=rs.getInt(1);
}
else intCount=-1;
}
catch(Exception e)
{
intCount=-2;
}
finally
{
dblink.close();
return intCount;
}
}
//执行插入操作
public int insert(String strSql)
{
int count=0;
stmt=dblink.getStmt();
try
{
count=stmt.executeUpdate(strSql);
}
catch(Exception e)
{
count=-2;
System.err.println(e.getMessage());
e.printStackTrace();
}
finally
{
dblink.close();
return count;
}
}
//更新数据库数据
public int update(String sql)
{
int count=0;
stmt=dblink.getStmt();
try
{
count=stmt.executeUpdate(sql);
}
catch(Exception e)
{
count=-2;
System.err.print(e.getMessage());
e.printStackTrace();
}
finally
{
dblink.close();
return count;
}
}
//删除数据库数据
public int delete(String sql)
{
int count=0;
stmt=dblink.getStmt();
try
{
count=stmt.executeUpdate(sql);
}
catch(Exception e)
{
count=-2;
System.err.println(e.getMessage());
e.printStackTrace();
}
finally
{
dblink.close();
return count;
}
}
}
在同一个包下,我建立了两个Java文件(想拿来做Javabean的),分别为DBLink.java 和DBUtil.java。先编译好DBLink后,再编译DBUtil.java时却出现 cannot find symbol ( DBLink)字样。
后来,我没有按照先后顺序编译,而是直接 Java *.java 这样就不会出问题了。这是为什么呢?因为我的两个源码存在明显的先后关系( DBLink 是连接数据库 DBUtil是一些实用操作),那为什么分开编译后就不可以了呢?????
谢谢
// Java Document
package leeWebDemo1.database;
import java.sql.*;
public class DBLink
{
private static Connection conn;
private Statement stmt;
private ResultSet rs;
private static final String mysqlDriver="com.mysql.jdbc.Driver";
private static final String url="jdbc:mysql://localhost:3306/mysql?user=root&password=123456";
public static synchronized Connection getConn() throws Exception
{
try
{
Class.forName(mysqlDriver);
conn=DriverManager.getConnection(url);
return conn;
}
catch(SQLException e)
{
System.err.println(e.getMessage());
System.err.println(e.getMessage());
System.err.println("加载驱动失败!");
throw e;
}
}
//获取Statement 只用于查询语句
public Statement getStmtread()
{
try
{
conn=getConn();
stmt=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
return stmt;
}
catch(Exception e)
{
System.err.println(e.getMessage());
e.printStackTrace();
}
return null;
}
//获取ResultSet
public ResultSet getRs(String sql)
{
try
{
stmt=getStmtread();
rs=stmt.executeQuery(sql);
return rs;
}
catch(Exception e)
{
System.err.println(e.getMessage());
e.printStackTrace();
}
return null;
}
//获取statement 与上面的getStmtread不同用于删除、更新和添加的SQL语句;
public Statement getStmt()
{
try
{
conn=getConn();
stmt=conn.createStatement();
return stmt;
}
catch(Exception e)
{
System.err.println(e.getMessage());
e.printStackTrace();
}
return null;
}
//关闭数据库
public synchronized void close()
{
try
{
if(rs!=null)
rs.close();
rs=null;
}
catch(Exception e)
{
System.err.println(e.getMessage());
e.printStackTrace();
}
try
{
if(stmt!=null)
{
stmt.close();
stmt=null;
}
}
catch(Exception e)
{
System.err.println(e.getMessage());
e.printStackTrace();
}
try
{
if(conn!=null)
{
conn.close();
conn=null;
}
}
catch(Exception e)
{
System.err.println(e.getMessage());
e.printStackTrace();
}
}
}
// 本JavaBean包括数据的插入、更新、删除和查询等。package leeWebDemo1.database;
import java.sql.*;public class DBUtil
{
private DBLink dblink=new DBLink();
private Statement stmt;
private ResultSet rs;
//获取查询的行数:没有结果返回-1,查询异常返回-2;
public int getRowCount(String strSql)
{
int intCount=0;
try{
stmt=dblink.getStmtread();
rs=stmt.executeQuery("SELECT COUNT(*) FROM"+strSql);
if(rs.next())
{
intCount=rs.getInt(1);
}
else intCount=-1;
}
catch(Exception e)
{
intCount=-2;
}
finally
{
dblink.close();
return intCount;
}
}
//执行插入操作
public int insert(String strSql)
{
int count=0;
stmt=dblink.getStmt();
try
{
count=stmt.executeUpdate(strSql);
}
catch(Exception e)
{
count=-2;
System.err.println(e.getMessage());
e.printStackTrace();
}
finally
{
dblink.close();
return count;
}
}
//更新数据库数据
public int update(String sql)
{
int count=0;
stmt=dblink.getStmt();
try
{
count=stmt.executeUpdate(sql);
}
catch(Exception e)
{
count=-2;
System.err.print(e.getMessage());
e.printStackTrace();
}
finally
{
dblink.close();
return count;
}
}
//删除数据库数据
public int delete(String sql)
{
int count=0;
stmt=dblink.getStmt();
try
{
count=stmt.executeUpdate(sql);
}
catch(Exception e)
{
count=-2;
System.err.println(e.getMessage());
e.printStackTrace();
}
finally
{
dblink.close();
return count;
}
}
}
有兴趣可以看看【编译原理】 记得大学是计算机系有这门课。 我们系没有。我们学【化工原理】
如果你先编译 DBLink 再编译 DBUtil 就不会出现你的问题。
如果先编译DBUtil
因为你的
DBUtil 引用 DBLink 但是 你的 DBLink 的 .class文件并没有生成 也就是你的classpath下没有这个类 所以会报错。
如果用*.java编译。 可能就是版主说的编译原理啦。 把你的两个类当成一个工程来处理。自动管理编译的顺序。瞎掰的!!!
>javac leeWebDemo1\database\DBUtil.java 程序都编译过了LZ估计前面的默认路径不对,是在..\leeWebDemo1\Database>javac DBUtil.java
此时编译会提示找不到 DBLink
回3楼,我的web目录不是eclipse等ide的默认工作空间,我是使用记事本写的,所以没有什么默认的目录的。
javac有参数引入jar,好像也有引入class的