案例——JDBC的基本操作

2018-09-05  本文已影响10人  secondtown

背景:资料介绍了JDBC的基本操作,给出的方法是建立一个工程来实现JDBC基本操作案例。本来想用Eclipse直接导入,但是从网络上下载的该案例源码只是将所有的java文件集中在一个文件夹中,并没有其他的配置文件。所以在Eclipse中尝试导入该文件夹的话也是失败。提示:no projects are found to import。

问题:
如何不在Eclipse中新建项目,直接实现这个案例。

准备:已经将mysql-connector-java-5.1.29-bin.jar这个数据库驱动文件添加到jdk安装目录/jre/lib/ext 下。并且已经启动了Mysql(早前为Mysql的用户名设置为root,并且设置了密码)。


解决方法
  关键在于解决下载的java源码中包的问题。如下图所示,原本这四条语句都是需要的,package语句指定了该java文件编译后的class文件的位置。
但是现在我们希望所有的class被编译后还是在当前的文件夹下。因此将其注释。而class位于当前文件夹下,也就意味着不需要进行import而可以直接调用,所以把import语句也注释掉。

// package cn.itcast.jdbc.example;
import java.util.Date;
// import cn.itcast.jdbc.example.dao.UsersDao;
// import cn.itcast.jdbc.example.domain.User;

补充:JDBC的背后逻辑思考
一、 JDBCUtils实际上干了什么事情
  在这个简单的JDBC基本操作案例中,为了避免代码重复书写。用一个JDBCUtils类来实现加载数据库驱动、建立和关闭数据库连接的功能。从这个角度来说,这个类和我们接下来要做的增删改查操作没有任何的关系。但在我们进行任何操作之前,都需要确保数据库驱动和建立。
  在UsersDao中,所有的方法都包含以下代码内容,其实就是在调用JDBCUtils:

Dao = Data Access Object

//下面的代码放在UsersDao类的方法里面
Connection conn = null;
conn = JDBCUtils.getConnection();//这个会放在try里面。

  UserDao类方法里定义的conn初始值为空,是为了记录JDBCUtils实行了getConnection()方法后返回的conn

  也就是说UserDao里面的某个方法被触发后,就会触发JDBCUtils这个类,它会按下getConnection()这个“方法按钮”,而其实JDBCUtils和getConnection()都是开发人员自定义的。我们甚至可以把它定义为hello类的good方法。关键是要看具体做了些什么。
  在JDBCUtils类按下getConnetion()按钮后,真正召唤的是DriverManager类。


  从这图中可以看到,要从我们的Java应用到数据库,中间需要的就是两个东西,一个是Driver Manager,一个是数据库驱动(在准备中提到我已经把mysql-connector-java-5.1.29-bin.jar这个数据库驱动文件添加到jdk安装目录/jre/lib/ext 下)。所以可以看到JDBCUtils.java的功能就是召唤出DriverManager。
  而DriverManager才是真正拥有getConnection(url,username,password)方法的类,并且我们可以看出来这个方法需要三个参数。通过这三个参数,我们就能够连接到我们所需要的数据库。而通过UsersDao上面的
conn = JDBCUtils.getConnection()

我们就能够获取和数据库的连接,并将DriverManager取得的conn连接赋值给conn变量。
  conn对象(Connection对象)除了可以代表和数据库的连接外,还能够创建statement对象来将SQL语句发送到数据库。

  再理一理,这就相当于你想操作mysql(你要联系城堡里面的人,这个城堡我们很熟悉,关键要进去的话需要出示你的身份信息,并且只有你知道对方住在哪里,但是你不能亲自前往),于是你找了个DriverManager来到城堡,出示了这些信息。这就是所谓的连接。


二、测试类Example01是怎么完成数据库操作的
  测试类Example01的代码如下(只取部分),其中Example01的目的是向mysql里面的一个user表添加一个用户信息。

public class Example05{
  public static void main(String[] args) {
        UsersDao ud = new UsersDao();
        User user=new User();
        user.setId(5);
        user.setUsername("hl");
        user.setPassword("123");
        boolean b=ud.insert(user);
            ...
}

}

  从上面的代码来看,是先创建一个UsersDao类。并且只需要创建UsersDao就行了,不需要创建JDBCUtils类。
问题:那么为什么还要创建一个JDBCUtils类呢。
  其实JDBCUtils本来就是UsersDao的一部分。只不过是为了避免的代码的冗杂而单独抽离出来的一个类。
  事实上,UsersDao类创建以后,不管执行哪个方法,都要利用到JDBCUtils的getConnetion()方法。

三、JDBC操作中接口的设计逻辑
  那么再继续思考,既然可以把部分代码抽离出来形成JDBCUtils类,那为什么只是抽离到连接创建好的部分呢。能不能把connection甚至statement的部分和JDBCUtils整合在一起呢。这么说并不是钻牛角尖。因为从UsersDao的源码来看,下面这些部分内容也都是一致的。

    Connection conn = null;
    Statement stmt = null;
    // 获得数据的连接
    conn = JDBCUtils.getConnection();
    // 获得Statement对象
    stmt = conn.createStatement();
      ...

也就是说把conn部分的内容放在JDBCUtils中其实也未尝不可。
  所以再回头反思整个过程。为什么要有这些类呢。
JDBC过程中主要有Driver、DriverManager、Connection、Statement、ResultSet这几个接口。那么Driver和DriverManager能不能合并成一个类(或者说为什么要分为Driver和DriverManager)?答案是不行,因为目前而言,不同的数据库还需要不同的驱动。所以不同的这一部分放在Driver类中,而相同的部分则是让他们放到DriverManager这里。相同的部分主要就是传递url、username、password等信息,与数据库建立连接。

  另外,能不能将现有的Connection的功能集成到DriverManager里面呢。这里我猜测其实是可以的,不过出于起到的功能不同,所以分开是一个比较好的选择。

  而语句部分就存在一些功能上的考虑,所以这一部分分为Statement、PreparedStatement、CallableStatement等等接口。因为不尽相同,所以也不建议和Connection集成到一起。

上一篇下一篇

猜你喜欢

热点阅读