JDBC中URL的问题,请教高手给详细说明一下

Neo.Echo 2014-09-03 03:55:31
关于JDBC连接数据库的一个问题十分的困扰,在“创建数据库连接”的时候,希望的结果是在正确连接数据后输出“连接成功”。但是现在在使用了故意写错的连接字符串的时候,也会输出“连接成功”。请教高手如何解决,最好能给一些详细的说明。
PS:已经给出小弟能够给的最多分了,希望大家帮帮忙。


public Class BaseDao{
private static final String SQL = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
// private static final String sql = "jdbc:sqlserver://localhost:1433;DatabaseName=EPETSHOP";
private static final String sql = "jdbc:sqlserver://localhost:1433";//此处是故意写错的url连接字符串
private static final String name = "sa";
private static final String pwd = "root";

/**
* 加载驱动
*/
static {
try {
Class.forName(SQL);
System.err.println("加载驱动成功!");
} catch (ClassNotFoundException e) {
System.err.println("加载驱动失败!");
e.printStackTrace();
}
}



/**
* 创建数据库链接
*
* @return
*/
public Connection getConnection() {
Connection conn = null;
try {
conn = DriverManager.getConnection(sql, name, pwd);
System.out.println("链接数据库成功!");
} catch (SQLException e) {
System.out.println("链接数据库失败!");
e.printStackTrace();
}
return conn;
}
}
...全文
611 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
Neo.Echo 2014-09-04
  • 打赏
  • 举报
回复
问题已经解决,根据magi1201大神提供的思路,找到了解决的办法,可能麻烦一些,不过确实解决了面临的问题。更新后的代码如下,希望给有同样困扰的人有所帮助。

/**
	 * 创建数据库链接
	 * 
	 * @return
	 */
	public Connection getConnection() {
		Connection conn = null;
		try {
			conn = DriverManager.getConnection(sql, name, pwd);
			/**
			 * 判断是否连接到正确的数据库
			 */
			DatabaseMetaData dm = conn.getMetaData();//使用DatabaseMetaData类
			String url = dm.getURL();//获得链接属性的字符串
			
			//将链接属性的字符串通过拆分存放在一个Map里,
			Map<String,String> map = new HashMap<String,String>();
			String[] temp = url.split(";");
			for (int i = 0; i < temp.length; i++) {
				String str = temp[i];
				String[] arr=str.split("=");
				if(i==0){
					map.put("jdbc", arr[0]);//存放的内容是“jdbc:sqlserver://localhost:1433;”,其实就是最基本的连接串,但是没有"="号匹配,所以单独处理
				}else{
					map.put(arr[0], arr[1]);
					
				}
				
			}
			//判断Map里是否有需要连接的数据库名
			if(map.containsValue("EPETSHOP")){
				System.out.println("链接数据库成功!");
			}else{
				System.out.println("链接数据库失败!");
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return conn;
	}
Neo.Echo 2014-09-04
  • 打赏
  • 举报
回复
引用 12 楼 magi1201 的回复:
oracle数据库连接时,数据库实例名为空或不存在时,数据库时连不上的,直接报错的 可以使用数据库的数据库元数据类,来获取连接的 Connection conn = DriverManager.getConnection(url, username, password); DatabaseMetaData md = conn.getMetaData(); 获取数据库元数据后,可是使用 String getURL() throws SQLException 获取此 DBMS 的 URL。 来查看连接到了哪个实例名,实例名其实就是连接数据库的url地址
感谢大神提供的信息,根据你提供的思路成功找到解决办法,虽然可能麻烦一些,但达到了想要的效果,嘿嘿。
Neo.Echo 2014-09-04
  • 打赏
  • 举报
回复
引用 17 楼 flyingMan_ZUO 的回复:
[quote=引用 7 楼 drmarius 的回复:] [quote=引用 4 楼 flyingMan_ZUO 的回复:] 当然要输出“连接成功”呀,你成功连接了sa用户,没有连接数据库,数据库名可以省的,但是你不能操作数据库,你没有指明连接数据库名。
我后面测试过,发现不写数据库名默认连接的是master这个数据库。有没有一个方法可以实现:我不指定数据库的时候报错呢?[/quote] 你可以加过判断呀,你可以用getDatabaseProductName()获取数据库名来判断是否是 master,如果是的话就输出报错信息。[/quote] getDatabaseProductName()方法获取的是数据库产品的名称,我测试输出的结果是Microsoft SQL Server。得不到数据库名
demonapple 2014-09-04
  • 打赏
  • 举报
回复
这是一个常识问题,就是这么配置的。如果非要实现判断,那你自己在后面加判断条件。楼上提供了一种方法,你也可以截取连接串里面的database名字判断。
flyingMan_ZUO 2014-09-04
  • 打赏
  • 举报
回复
引用 7 楼 drmarius 的回复:
[quote=引用 4 楼 flyingMan_ZUO 的回复:] 当然要输出“连接成功”呀,你成功连接了sa用户,没有连接数据库,数据库名可以省的,但是你不能操作数据库,你没有指明连接数据库名。
我后面测试过,发现不写数据库名默认连接的是master这个数据库。有没有一个方法可以实现:我不指定数据库的时候报错呢?[/quote] 你可以加过判断呀,你可以用getDatabaseProductName()获取数据库名来判断是否是 master,如果是的话就输出报错信息。
Neo.Echo 2014-09-04
  • 打赏
  • 举报
回复
引用 9 楼 u012345283 的回复:
[quote=引用 7 楼 drmarius 的回复:] [quote=引用 4 楼 flyingMan_ZUO 的回复:] 当然要输出“连接成功”呀,你成功连接了sa用户,没有连接数据库,数据库名可以省的,但是你不能操作数据库,你没有指明连接数据库名。
我后面测试过,发现不写数据库名默认连接的是master这个数据库。有没有一个方法可以实现:我不指定数据库的时候报错呢?[/quote] 有什么实际意义吗[/quote] 因为这个情况的存在产生了一个错误,我查错用了一天的时间才找到发生错误的地方,所以想避免再次出现这种情况。
yktd26 2014-09-03
  • 打赏
  • 举报
回复
引用 7 楼 drmarius 的回复:
[quote=引用 4 楼 flyingMan_ZUO 的回复:] 当然要输出“连接成功”呀,你成功连接了sa用户,没有连接数据库,数据库名可以省的,但是你不能操作数据库,你没有指明连接数据库名。
我后面测试过,发现不写数据库名默认连接的是master这个数据库。有没有一个方法可以实现:我不指定数据库的时候报错呢?[/quote] 检查下连接字符串有没有制定数据库?
姜小白- 2014-09-03
  • 打赏
  • 举报
回复
引用 13 楼 u012344876 的回复:
我一直都想问一下,大神你的头像叫什么名称?
我就不告诉你,那个萌萌哒叫做丘比龙
mj100100 2014-09-03
  • 打赏
  • 举报
回复
引用 1 楼 magi1201 的回复:
不会输出 System.out.println("链接数据库失败!"); 吗? System.out.println("链接数据库成功!"); 之前打印下conn的值,看是否有值 System.out.println(conn.toString());
我一直都想问一下,大神你的头像叫什么名称?
姜小白- 2014-09-03
  • 打赏
  • 举报
回复
oracle数据库连接时,数据库实例名为空或不存在时,数据库时连不上的,直接报错的 可以使用数据库的数据库元数据类,来获取连接的 Connection conn = DriverManager.getConnection(url, username, password); DatabaseMetaData md = conn.getMetaData(); 获取数据库元数据后,可是使用 String getURL() throws SQLException 获取此 DBMS 的 URL。 来查看连接到了哪个实例名,实例名其实就是连接数据库的url地址
skyWalker_ONLY 2014-09-03
  • 打赏
  • 举报
回复
JDBC跟使用的数据库有关系,你想不输入数据库名提示错误的话,估计要自己根据数据库提供的JDBC URL规范解析一下JDBC URL了
huasuoworld 2014-09-03
  • 打赏
  • 举报
回复
URL 通常是你的数据源名字或数据库系统,最后一部分提供了定位数据库的信息,所以你可以不写数据库也会链接成功。
百里马 2014-09-03
  • 打赏
  • 举报
回复
引用 7 楼 drmarius 的回复:
[quote=引用 4 楼 flyingMan_ZUO 的回复:] 当然要输出“连接成功”呀,你成功连接了sa用户,没有连接数据库,数据库名可以省的,但是你不能操作数据库,你没有指明连接数据库名。
我后面测试过,发现不写数据库名默认连接的是master这个数据库。有没有一个方法可以实现:我不指定数据库的时候报错呢?[/quote] 有什么实际意义吗
Neo.Echo 2014-09-03
  • 打赏
  • 举报
回复
引用 6 楼 qu1210 的回复:
当然连接成功,只不过,不知道具体连的那个库而已,你试下下面这个,我的mysql中没有叫a的数据库就会报错。

private static final String sql = "jdbc:mysql://localhost:3306/a";

private static final String sql = "jdbc:sqlserver://localhost:143";
我需要连接的是SQLServer
Neo.Echo 2014-09-03
  • 打赏
  • 举报
回复
引用 4 楼 flyingMan_ZUO 的回复:
当然要输出“连接成功”呀,你成功连接了sa用户,没有连接数据库,数据库名可以省的,但是你不能操作数据库,你没有指明连接数据库名。
我后面测试过,发现不写数据库名默认连接的是master这个数据库。有没有一个方法可以实现:我不指定数据库的时候报错呢?
qzw1210 2014-09-03
  • 打赏
  • 举报
回复
当然连接成功,只不过,不知道具体连的那个库而已,你试下下面这个,我的mysql中没有叫a的数据库就会报错。

private static final String sql = "jdbc:mysql://localhost:3306/a";

private static final String sql = "jdbc:sqlserver://localhost:143";
gxlcl 2014-09-03
  • 打赏
  • 举报
回复
你敢输jdbc:sqlserver://localhost:8888试下么?
flyingMan_ZUO 2014-09-03
  • 打赏
  • 举报
回复
当然要输出“连接成功”呀,你成功连接了sa用户,没有连接数据库,数据库名可以省的,但是你不能操作数据库,你没有指明连接数据库名。
tuzuxiao 2014-09-03
  • 打赏
  • 举报
回复
你可以随便赋值一个试试,应该就不会了
Neo.Echo 2014-09-03
  • 打赏
  • 举报
回复
引用 1 楼 magi1201 的回复:
不会输出 System.out.println("链接数据库失败!"); 吗? System.out.println("链接数据库成功!"); 之前打印下conn的值,看是否有值 System.out.println(conn.toString());
按你说的方法执行了一下,结果如下: “ConnectionID:1 ClientConnectionId: aa0f46a8-1359-4923-9493-09d69a3afaa4 链接数据库成功!” 可以肯定的是conn有值了,但是如何确实它连接的是哪个数据库是个问题。
加载更多回复(1)

62,621

社区成员

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

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