jdbc连接MySQL的问题?(困扰了好久)!请高手们赐教。

lostyq 2005-09-27 01:12:05
我写了段连接MySql程序如下:
package connectmysql;

/**
* <p>Title: 连接MySQL数据库</p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2005</p>
* <p>Company: </p>
* @author not attributable
* @version 1.0
*/
import java.sql.*;
import com.mysql.jdbc.Driver;

public class conSql {

Connection con;
ResultSet rs;
Statement stmt;

public conSql() {
//定义连接类型及连接数据库 ACCESS
try {
// Load the JDBC driver
String driverName = "com.mysql.jdbc.Driver"; // MySQL MM JDBC driver
Class.forName(driverName);
//注册MySQL驱动程序
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
//数据库名
String dbName = "bookdb";
//表名
String tableName = "books";
//用户
String username = "dbuser";
//口令
String password = "1234";

String url="jdbc:mysql://localhost/"+dbName;
//连接MYSQL
con = DriverManager.getConnection(url,username,password);

con = DriverManager.getConnection(url);
//创建一个JDBC声明
stmt = con.createStatement();
}
catch (ClassNotFoundException e) {
// Could not find the database driver
System.out.println("Could not find the database driver!");
}
catch (SQLException e) {
// Could not connect to the database
System.out.println("Could not connect to the database!");
System.err.println(e.getMessage());
}

}

//定义数据库执行返回值 RS;
public ResultSet getResult(String strSQL) {
try {
rs = stmt.executeQuery(strSQL);
return rs;
}
catch (SQLException sqle) {
System.out.println(sqle.toString());
return null;
}
}

//定义数据库修改保存类
public boolean updateSql(String strSQL) {
try {
stmt.executeUpdate(strSQL);
con.commit();
return true;

}
catch (SQLException sqle) {
System.out.println(sqle.toString());
return false;
}
}

//定义关闭数据库类
public void closeConnection() {
try {
stmt.close();
con.close();
}
catch (SQLException sqle) {
System.out.println(sqle.toString());
}
}

//显示整个表
public void showTable(){
try {
rs = stmt.executeQuery("SELECT * FROM books");
ResultSetMetaData rsmd = rs.getMetaData();
int numberOfColumns = rsmd.getColumnCount();
while (rs.next()) {
for (int i = 1; i <= numberOfColumns; i++) {
if (i > 1)
//用逗号分隔各列
System.out.print(", ");

String columnValue = rs.getString(i);
System.out.print(columnValue);
}
System.out.println("");
}

closeConnection();
}
catch (Exception ex) {
System.err.print("Exception: ");
System.err.println(ex.getMessage());
}
}

//主程序
public static void main(String[] args) {
conSql da = new conSql();
da.showTable();

}
}

结果执行时报连接错误如下:
Communication link failure: java.io.IOException, underlying cause: Unexpected end of input stream

** BEGIN NESTED EXCEPTION **

java.io.IOException
MESSAGE: Unexpected end of input stream

STACKTRACE:

java.io.IOException: Unexpected end of input stream

at com.mysql.jdbc.MysqlIO.readPacket(MysqlIO.java:1096)

at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:626)

at com.mysql.jdbc.Connection.createNewIO(Connection.java:1562)

at com.mysql.jdbc.Connection.<init>(Connection.java:491)

at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:346)

at java.sql.DriverManager.getConnection(DriverManager.java:512)

at java.sql.DriverManager.getConnection(DriverManager.java:171)

at connectmysql.conSql.<init>(conSql.java:39)

at connectmysql.conSql.main(conSql.java:122)

** END NESTED EXCEPTION **

Could not connect to the database!

Exception: null

但我的MySQL5.0版本完全正常,且我可以从cmd中登录并操作MySQL,开机时就把MySQL服务给启动了,为什么在程序中就不行,让我困扰了好久,请大虾们赐教!!!
...全文
339 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
lostyq 2005-09-30
  • 打赏
  • 举报
回复
问题解决了,是在试验中发现删除环境变量classpath中的内容就正常连接了。classpath内的内容是jdk/lib中的jar包,这里作为大家的参考,感谢大家。
lostyq 2005-09-29
  • 打赏
  • 举报
回复
知道,楼上所说我都注意的到,但为了确保注册驱动,我使用了
//注册MySQL驱动程序
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
至于连接两次,我没把注释加上来,是我的疏忽。但是按楼上所说连接方法,还是报错:
Communication link failure: java.io.IOException, underlying cause: Unexpected end of input stream

再把连接代码发一下,请大家关注
public conSql() {
//定义连接类型及连接数据库 ACCESS
try {
// Load the JDBC driver
String driverName = "com.mysql.jdbc.Driver"; // MySQL MM JDBC driver
Class.forName(driverName);
//数据库名
String dbName = "mysql";
//表名
String tableName = "user";
//用户
String username = "dbuser";
//口令
String password = "1234";

String url="jdbc:mysql://localhost/mysql?useEncoding=true&characterEncoding=iso8859-1";

//连接MYSQL
con = DriverManager.getConnection(url,username,password);
//创建一个JDBC声明
stmt = con.createStatement();
}
catch (ClassNotFoundException e) {
// Could not find the database driver
System.out.println("Could not find the database driver!");
}
catch (SQLException e) {
// Could not connect to the database
System.out.println("Could not connect to the database!");
System.err.println(e.getMessage());
}

}

注明:mysql-connector-java-3.1.10-bin.jar和mysql-connector-java-3.1.10-bin-g.jar我都加入lib并配置了环境变量,mysqldriver.jar我也第一时间就加入了,所用jdk是jbuilder自带,且在外部连接mysql完全正常。
hlsps 2005-09-29
  • 打赏
  • 举报
回复
下一个最新的驱动.
power1128 2005-09-29
  • 打赏
  • 举报
回复
上次碰到的问题就是连接数据库的jar包版本低,下个新的试试
ywfcfnh 2005-09-29
  • 打赏
  • 举报
回复
我是这样做的,不知道对你有没有帮助

1、先把下载来的connector.jar放到jsdk/lib/下,然后配制环境,加入这个jar文件的路径,不是目录的路径。
2、然后重新启动你的机器
3、String url="jdbc:mysql://localhost/jxgl";
4、最好你上面的那个connector.jar文件名修改一下,用短点的。
5、连接的库文件最好从这个地址下载:http://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-3.1.10.zip/from/http://mysql.isu.edu.tw/
下载后得到的文件中,只要用mysql-connector-java-3.1.10-bin.jar这个文件就好了。
  • 打赏
  • 举报
回复
up
渡上 2005-09-29
  • 打赏
  • 举报
回复
我前段时间给朋友写了一个JDBC连接MySql的例子类。使用没有问题,不过没有进行池化处理,希望对你有帮助。你上传的源码我看了,有一点必须提醒你在进行JDBC操作时当用完ResultSet(即rs记录)记录集后一定要调用“rs.close()”方法来关闭否则会出现游标用尽或数据库资源用尽等错误(到时候就必须重新起数据库服务器)。还有一点应实现说明,我起初写这个例子的时候直接应用的MySql JDBC驱动的jar包,总是出现驱动加载失败的错误,最后我将jar包解开后问题解决,也许你的问题就是这个。好就说这些,以下是我的源码仅供参考:

package dbconn;
import java.sql.*;
import java.io.*;
/**
* <p>数据库连接Bean</p>
* <p>进行数据库操作</p>
* 执行查询操作流程:SQL查询调用方法 ResultSet rs = querySQL(String SQL),插入、修改和删除调用方法execSQL(String sql)。
* 操作完成后,调用close()的方法关闭记录集和连接。
* <p>MySql JDBC连接串说明 url格式:jdbc:mysql://[hostname][:port]/dbname[?param1=value1][¶m2=value2]...</p>
* <p>备注:在执行SQL查询、插入、修改和删除时会自己创建数据库连接</p>
* <p>Copyright: Copyright (c) 2005</p>
* <p>Company: </p>
* @author
* @version 1.0
*/
public class connDB
{
final String SerIp="127.0.0.1";//服务器IP地址
final String DBName="test";//服务器IP地址
final String sDBDriver = "org.gjt.mm.mysql.Driver"; //MySql JDBC驱动串
final String UserID="root";//数据库用户名
final String Password="";//数据库密码
String sConnStr = ""; //连接字符串
static Connection conn=null;//以静态形式定义
static Statement stmt=null;//以静态形式定义
static ResultSet rs = null;//以静态形式定义

/**
* <p>Method:构造方法</p>
*/
public connDB() {
sConnStr = "jdbc:mysql://"+SerIp+"/"+DBName; //创建数据库连接字符串
}

/**
* <p>Method:CreatDB()</p>
* <p>Description:创建数据库连接,同时返回一个连接。如果失败屏幕输出“Create False”,否则为“Create True”.如果是程序执行失败抛出ERROR返回null</p>
* @params 无
* @return Connection 返回一个连接
*/
public Connection CreatDB(){
try{
Class.forName(sDBDriver);//加载数据库驱动
try{
conn=DriverManager.getConnection(sConnStr, UserID, Password);//得到一个连接
System.out.println("Create True");
return conn;
}catch(Exception e){System.out.println("Create False--得到数据库连接错:"+e.getMessage());return conn;}
}catch(Exception e){System.out.println("Create False--加载数据库驱动错:"+e.getMessage());return conn;}
}

/**
* <p>Method:querySQL(String SQL)</p>
* <p>Description:执行一条SQL,返回记录集,抛出异常</p>
* @params String SQL-所执行的sql语句
* @return ResultSet rs-返回RS数据集>
*/
public ResultSet querySQL(String sql) throws Exception{
if(conn==null)
conn=CreatDB();
try {
if(rs!=null){
rs.close();
rs=null;
}
if(stmt!=null){
stmt.close();
stmt=null;
}
stmt = conn.createStatement(java.sql.ResultSet.TYPE_SCROLL_INSENSITIVE,java.sql.ResultSet.CONCUR_UPDATABLE);
rs = stmt.executeQuery(sql); //执行SQL
}catch(Exception e)
{System.out.println("得到RS记录集错: " + e.getMessage()); }
return rs;
}

/**
* <p>Method:executeQuery(String sql)</p>
* <p>Description:执行一条SQL,抛出异常</p>
* @params String SQL-所执行的sql语句
* @return 无
*/
public void executeQuery(String sql) throws Exception{
if(conn==null)
conn=CreatDB();
try {
if(rs!=null){
rs.close();
rs=null;
}
if(stmt!=null){
stmt.close();
stmt=null;
}
stmt = conn.createStatement();
stmt.executeUpdate(sql);
}catch(Exception e)
{System.out.println("插入记录集错: " + e.getMessage()); }
}

/**
* <p>Method:getMaxID(String tab, String col)</p>
* <p>Description:得到列最大值加1,用于主键添加</p>
* @params String tab 表明
* @params String col字段明 <b>备注:字段类型必须为整型或长整型</b>
* @return long 返回长整型ID号>
*/
public long getMaxID(String tab, String col) throws Exception{
long maxid=0;
if(conn==null)
conn=CreatDB();
try {
if(rs!=null){
rs.close();
rs=null;
}
if(stmt!=null){
stmt.close();
stmt=null;
}
String sql = String.valueOf(String.valueOf( (new StringBuffer("select max(")).append(col).append(") from ").append(tab).append("")));
stmt = conn.createStatement(java.sql.ResultSet.TYPE_SCROLL_INSENSITIVE,java.sql.ResultSet.CONCUR_UPDATABLE);
rs = stmt.executeQuery(sql); //执行SQL
if (rs != null) {
rs.next();
maxid = rs.getLong(1)+1;
}
}catch(Exception e)
{System.out.println("得到RS记录集错: " + e.getMessage()); }
return maxid;
}

/**
* <p>Method:close()</p>
* <p>Description:关闭连接以及RS数据集,抛出异常</p>
* @params 无
* @return 无
*/
public void close() throws Exception{
try {
if(rs!=null){
rs.close();
rs=null;
}
if(stmt!=null){
stmt.close();
stmt=null;
}
if(conn!=null){
conn.close();
conn=null;
}
System.out.println("连接已关闭");
}catch(SQLException e)
{System.err.println("关闭连接错: " + e.getMessage()); }
}

}
zzhzzh204553 2005-09-28
  • 打赏
  • 举报
回复
//注册MySQL驱动程序
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
这句不是多此一举吗?不知楼主从哪里学的?
***************************************

con = DriverManager.getConnection(url,username,password);
con = DriverManager.getConnection(url);
也不要两次.

把驱动程序的JAR文件拷进去.
***********************
下面是我的屡试不爽例子.

public static final String DRIVER =
"com.mysql.jdbc.Driver";
public static final String DBURL =
"jdbc:mysql://localhost/Jive?useEncoding=true&characterEncoding=iso8859-1";

//加载驱动程序
Class.forName(DRIVER);
Connection con = con = DriverManager.getConnection(DBURL,"user","pass");
lostyq 2005-09-28
  • 打赏
  • 举报
回复
曾经我也希望是没有加入驱动,但是mysql-connector-java-3.1.10-bin.jar和mysql-connector-java-3.1.10-bin-g.jar我都加入lib并配置了,mysqldriver.jar我也第一时间就加入了,我知道错误报的是没有找到,但是jdk中都有啊,环境变量也有。非常郁闷!!!
believefym 2005-09-28
  • 打赏
  • 举报
回复
把mysql的driver放到你的应用的lib中

-------------------

可能是这个问题,楼主把驱动包放到WEB-INF/lib/下面试试看
viano 2005-09-28
  • 打赏
  • 举报
回复
NonRegisteringDriver.java:346

显然是没有找到驱动程序!

该怎么办我想你应该知道吧 ?
suyejun2005 2005-09-28
  • 打赏
  • 举报
回复
把mysql的driver放到你的应用的lib中
jiangshachina 2005-09-28
  • 打赏
  • 举报
回复
有趣!
柯本 2005-09-27
  • 打赏
  • 举报
回复
我出现过com.mysql.jdbc.NonRegisteringDriver.connect,是因为我没有将
mysql-connector-java-3.1.10-bin.jar加入classpath
lostyq 2005-09-27
  • 打赏
  • 举报
回复
首先,我想应该不是连两次的问题,异常是在第一次抛出的。
其次,如何将3306的端口加上?!我把url改成
String url="jdbc:mysql://localhost:3306/"+dbName;
也是不行。我想是不是连接类没有注册上?因为在异常中有at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:346)
这样的错误。希望大家再出出力!
onray 2005-09-27
  • 打赏
  • 举报
回复
端口应该加上哦
rower203 2005-09-27
  • 打赏
  • 举报
回复
con = DriverManager.getConnection(url,username,password);

con = DriverManager.getConnection(url);
为什么连两次?把下面的去掉。
believefym 2005-09-27
  • 打赏
  • 举报
回复
会不会是端口问题,mysql默认是3306

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧