jdbc 这两种写法有区别么,为什么?

zhushoujun 2010-06-21 11:12:58
/************第一种写法******************/
public class DaoUtil {
private static final String DRIVER="com.microsoft.sqlserver.jdbc.SQLServerDriver";
private static final String URL="jdbc:sqlserver://localhost:1433;databaseName=newsDB";
private static final String USERNAME="sa";
private static final String PASSWORD="root";

static
{
try{
//加载驱动
Class.forName(DRIVER);
}catch(Exception e){

}
}


public static Connection getConnection(){
try{
Connection conn = DriverManager.getConnection(URL,USERNAME,PASSWORD);
return conn;
}catch(Exception e){
e.printStackTrace();
return null;
}
}


}


/************第二种写法******************/
public class DaoUtil {
private static final String DRIVER="com.microsoft.sqlserver.jdbc.SQLServerDriver";
private static final String URL="jdbc:sqlserver://localhost:1433;databaseName=newsDB";
private static final String USERNAME="sa";
private static final String PASSWORD="root";

public static Connection getConnection(){
try{
Class.forName(DRIVER);

Connection conn = DriverManager.getConnection(URL,USERNAME,PASSWORD);
return conn;
}catch(Exception e){
e.printStackTrace();
return null;
}
}


}

...全文
330 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
lele140 2010-06-22
  • 打赏
  • 举报
回复
mark
chao881208 2010-06-22
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wxwlion0425 的回复:]

这两种写法基本上没什么区别.唯一的区别在于
第一种写法在类初始化时就加载驱动.
第二种方法在调用静态方法时加载驱动.
[/Quote]
wtuger 2010-06-22
  • 打赏
  • 举报
回复
静态代码块会在类的初始化时加载

静态代码只有调用了才会被加载

hanyu1222 2010-06-22
  • 打赏
  • 举报
回复
马克~~~~~~~~~~~
zhushoujun 2010-06-22
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 kimih 的回复:]
事实上,他们都是一样的,在加载时机和占用内存上,静态方法和实例方法是一样的,在类型第一次被使用时加载。调用的速度基本上没有差别.
[/Quote]

意思就是说 静态方法 与实例方法在执行效率上 没什么两样么?
ronniegxq 2010-06-22
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wxwlion0425 的回复:]

这两种写法基本上没什么区别.唯一的区别在于
第一种写法在类初始化时就加载驱动.
第二种方法在调用静态方法时加载驱动.
[/Quote]+1
宁静-夏天 2010-06-22
  • 打赏
  • 举报
回复
采用第二种。

两者效率方面差别几乎为零。
class.forName会判断是否加载了,并不会需要重复加载,差别只是
驱动类在 DaoUtil.class 加载时被加载

驱动类在 getCon 第一次调用时被加载

推荐非 static 块方式而使用函数,是因为 static 块在异常的处理上非常局限。
并不能被调用者控制异常的处理行为,非常破坏整理设计结果,所以最好不要使用这种写法。


class.forName 最主要的功能是把驱动类在driverManager中注册,这个是jdbc规范,注册是使用static块,将driver的class对象注册到driverManager中。
zhushoujun 2010-06-22
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 wj63558595 的回复:]
第一种方法要好:
第一种方法:加载驱动放在静态块内,整个程序只会运行一次
第二种方法:放在方法内,调用一次方法就加载一次驱动。加大了数据库的负荷
[/Quote]

我知道第一种方法要好了,不过还想问一下:我写的第一种方法 与那种用单列模式写的 把Class.forName(DRIVER)放在私有的构造方法里的做法相比,谁更好写呢?或者都一样呢?
  • 打赏
  • 举报
回复
用第一种吧,只要加载一次就够了。第二种,虽然每次都加载但是 Java 的 ClassLoader 并不会傻到每次都去加载,第二种也是加载一次,接着就不会再加载了,但是第二种增加了很多无畏的调用。
wj63558595 2010-06-22
  • 打赏
  • 举报
回复
第一种方法要好:
第一种方法:加载驱动放在静态块内,整个程序只会运行一次
第二种方法:放在方法内,调用一次方法就加载一次驱动。加大了数据库的负荷
lizhongyi188 2010-06-22
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wxwlion0425 的回复:]

这两种写法基本上没什么区别.唯一的区别在于
第一种写法在类初始化时就加载驱动.
第二种方法在调用静态方法时加载驱动.
[/Quote]


up
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wxwlion0425 的回复:]
这两种写法基本上没什么区别.唯一的区别在于
第一种写法在类初始化时就加载驱动.
第二种方法在调用静态方法时加载驱动.
[/Quote]
yp0123456789 2010-06-21
  • 打赏
  • 举报
回复
确定的说这里不应该这样写,应该用单例模式。只创建一个对象就可以了。
zhushoujun 2010-06-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 qunhao 的回复:]
那个静态代码块只会执行一次,而静态方法每次调用都会执行,明白没有?
[/Quote]

问题1:
看第一种写法,依照您说的,那么在多个用户前后调用这个类的方法时候,是不是除了第一个用户要调用static块代码,其他用户是不是不会再调用静态块了(直接用就是)?

问题2:
看第二种写法,依照您说的,静态方法里面加载驱动,又获得连接,调用每次都会重复加载驱动又获得连接,并没有怎么提高程序的效率呀,对么?
yp0123456789 2010-06-21
  • 打赏
  • 举报
回复
静态方法不用事例化类就可以用 类.方法名 直接调用执行。
非静态方法必须事例化为对象然后 对象名.方法名 进行调用。
xndx2 2010-06-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 qunhao 的回复:]
那个静态代码块只会执行一次,而静态方法每次调用都会执行,明白没有?
[/Quote]

而静态方法每次调用都会执行,那么用static关键字修饰他还有什么用呢(除了可以直接也用类名称调用比较方便以外),我一直没搞懂,请指点,
Love_2012 2010-06-21
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wxwlion0425 的回复:]
这两种写法基本上没什么区别.唯一的区别在于
第一种写法在类初始化时就加载驱动.
第二种方法在调用静态方法时加载驱动.
[/Quote]
up
wxwlion0425 2010-06-21
  • 打赏
  • 举报
回复
这两种写法基本上没什么区别.唯一的区别在于
第一种写法在类初始化时就加载驱动.
第二种方法在调用静态方法时加载驱动.
qunhao 2010-06-21
  • 打赏
  • 举报
回复
那个静态代码块只会执行一次,而静态方法每次调用都会执行,明白没有?
yp0123456789 2010-06-21
  • 打赏
  • 举报
回复
类似于单例只加载一次。
ps:另外静态加载比较早。
加载更多回复(13)

67,515

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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