美文网首页
案例——JDBC的基本操作

案例——JDBC的基本操作

作者: secondtown | 来源:发表于2018-09-05 15:05 被阅读10次

    背景:资料介绍了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集成到一起。

    相关文章

      网友评论

          本文标题:案例——JDBC的基本操作

          本文链接:https://www.haomeiwen.com/subject/uvuawftx.html