JDBC的进化

1.数据的存储方式的进化

①字符串

②数组

③文件

④数据库

其中①和②是存在内存中,会随着程序的终止而结束,不会保留到本地磁盘

③和④则会将数据存储到本地磁盘,而④可以对数据进行管理,可以根据不同的应用场景选择不同量级的数据库

2.JDBC的进化

起源:

Java程序要对磁盘中的数据进行读写,各大数据库厂商提供了相应的驱动,Java提供了相应的接口进行连接。

进化1:面向对象编程

    @Test
    public void testOrclJdbc1() throws SQLException {
        Driver driver = null;
        // get Driver object through the OOP‘s polymorphic
        driver = new OracleDriver();

        String url = "jdbc:oracle:thin:@localhost:1521:orcl";
        Properties info = new Properties();
        info.setProperty("user", "scott");
        info.setProperty("password", "tiger");

        Connection conn = driver.connect(url, info);
        System.out.println(conn);

        conn.close();
    }

应用了面向对象的多态来创建了驱动实例。

缺点:不够灵活,可复用性太差,只是针对的Oracle数据库,同时还需要一个Properties对象的参数。相当于跳过接口(JDBC)直接和一个确定的数据进行了连接。

进化2:面向接口编程1

    @Test
    public void testJdbc2() throws Exception {

        // oracle
        // String driverName = "oracle.jdbc.driver.OracleDriver";
        // String url = "jdbc:oracle:thin:@127.0.0.1:1521:orcl";
        // Properties info = new Properties();
        // info.setProperty("user", "scott");
        // info.setProperty("password", "tiger");

        // mysql
        String driverName = "com.mysql.jdbc.Driver";
        String url = "jdbc:mysql://localhost:3306/test";
        Properties info = new Properties();
        info.setProperty("user", "root");
        info.setProperty("password", "123456");

        // get the Driver object through reflect
        Class<?> clazz = Class.forName(driverName);
        Driver driver = (Driver) clazz.newInstance();

        // get connection
        Connection conn = driver.connect(url, info);
        System.out.println(conn);

        conn.close();

    }

通过反射的方式在运行时动态的确定了Driver对象,这里体现的就是一种面向接口编程的思想(字符串可以任意的改变,但是对象生成后就不可以随便的更改)。注意多多体会

进化3:面向接口编程2

原始1中存在的问题,2中并没有全部解决,这里我们先解决一个,我们希望连接的时候参数类型不要为Properties类型,字符串最好。通过API我们发现了Driver的一个实现类DriverManager,它里边提供了一个静态方法

getConnection(String url, String user, String password) ,三个参数都为String类型,我们需要的就是它。但是它同时有一个说明,

“Attempts to establish a connection to the given database URL. The DriverManager attempts to select an appropriate driver from the set of registered JDBC drivers.”尝试建立一个给定数据库URL的连接,并且尝试从已注册的JDBC驱动中选择一个可获得的驱动,所以这里我们需要将数据库驱动进行注册。它同时提供了一个静态方法registerDriver(Driver driver) 用于注册驱动。我们就按这样来。

// remove properties
    @Test
    public void testJdbc3() throws Exception {
        String driverClass = "com.mysql.jdbc.Driver";
        String url = "jdbc:mysql://localhost:3306/test";
        String user = "root";
        String password = "123456";
        // get driver
        Class<?> clazz = Class.forName(driverClass);
        Driver driver = (Driver) clazz.newInstance();

        // register driver
        DriverManager.registerDriver(driver);

        // get connection
        Connection conn = DriverManager.getConnection(url, user, password);
        System.out.println(conn);
        conn.close();
    }

到这里,是不是发现程序看起来比起源1漂亮多了?当然,这还不是最终的,再进化。

进化4:面向接口编程3

因为mysql是开源的,我们可以查看它的源代码,这里我们发现了它通过的驱动中,有这么一段代码:

// ~ Static fields/initializers
    // ---------------------------------------------

    //
    // Register ourselves with the DriverManager
    //
    static {
        try {
            java.sql.DriverManager.registerDriver(new Driver());
        } catch (SQLException E) {
            throw new RuntimeException("Can‘t register driver!");
        }
    }

看到这段代码,是不是瞬间感觉好高兴?它已经在静态代码块儿中写好了注册驱动程序,我们只需要将类进行加载就好了,类加载还需要我多说吗?

@Test
    public void testJdbc4() throws Exception {
        String driverClass = "com.mysql.jdbc.Driver";
        String url = "jdbc:mysql://localhost:3306/test";
        String user = "root";
        String password = "123456";

        Class.forName(driverClass);
        Connection conn = DriverManager.getConnection(url, user, password);
        System.out.println(conn);
        conn.close();
    }

这里出现了一点疑问,大家也帮我想一想,Class.forName(diverClass)得到的是一个Class对象,而它在静态代码块中加载的是一个new Driver(),我在这里是这样理解的,结合上面“并且尝试从已注册的JDBC驱动中选择一个可获得的驱动”这句话,是不是可以认为它自动的将Class对象转换成Driver对象?这是我的认识,也希望看过这篇博文的朋友多想想,知道其原理的可以给我评论,谢谢。

言归正传,别以为到这里就结束了,还得继续。

进化5:面向接口编程4

每次写这么多连接字符串是不是太麻烦了,用一个配置文件读取吧,多方便,异常一直在抛,咱们给处理一次

@Test
    public void testJdbc5() {
        Connection conn = null;
        try {
            //read the driverClass, url, user, password from properties file...
            Properties proper = new Properties();
            proper.load(new FileInputStream("jdbc.properties"));
            String driverClass = proper.getProperty("driverClass");
            String url = proper.getProperty("url");
            String user = proper.getProperty("user");
            String password = proper.getProperty("password");
            // load driver
            Class.forName(driverClass);
            //get connection
            conn = DriverManager.getConnection(url, user, password);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }

这就算完了吧?嗯?代码这么还变多了?容易,看我的。将这些代码写成一个方法,几行就搞定。

@Test
    public void testJdbc6(){
        Connection conn = null;
        try {
            conn = JDBCUtils.getConnection();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if(conn != null){
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
public static Connection getConnection() throws Exception{
        //read the driverClass, url, user, password from properties file...
        Properties proper = new Properties();
        proper.load(new FileInputStream("jdbc.properties"));
        String driverClass = proper.getProperty("driverClass");
        String url = proper.getProperty("url");
        String user = proper.getProperty("user");
        String password = proper.getProperty("password");
        // load driver
        Class.forName(driverClass);
        //get connection
        Connection conn = DriverManager.getConnection(url, user, password);

        return conn;
    }

OK,完事了吧?没。汗,还没,你说还有什么?

这仅仅是JDBC的连接,难道我们仅仅就进行连接?连接后还有数据的增删改查。今天太晚了,得睡觉了,明天学完再写吧,瞌睡。

本来还准备将JavaSE部分集合的总结给写完,但是这篇博客用了好大的功夫,又得留到明天或后天了。睡觉,大家加油!

时间: 2025-01-12 01:16:11

JDBC的进化的相关文章

JDBC的进化3

这次进化完成后,JDBC的进化就需要设置一个savepoint了,然后提交一下,提交到我们的脑袋硬盘中. 上一次说到了利用Statement对象来发送sql语句到数据库.然而这样的话,会暴露出两个问题. 那么问题来了!!! 问题1: 在执行executeUpdate(String sql)和executeQuery(String sql)方法时,我们需要拼写sql字符串,就像下面这样: String sql = "insert into customers values(21, 'yushen1

JDBC的进化3--补充:事务处理

接着JDBC的进化3,我们来说数据库事务. 事务:一组逻辑操作单元,使数据从一种状态变换到另一种状态. 怎么理解呢? 一组逻辑单元:我认为指的是多条的DML操作,只是一条DML语句的话,对于mysql来说,执行完成功就自动提交了,没成功的话,就没成功喽,这样说来,一条DML语句就相当于一个原子,不可再分了. 从一种状态变换到另一种状态:即这组操作是成功了还是失败了,他们必须同时都成功,有一个失败,就退回到起点.例如银行的转账,不能一个成功,一个失败吧. 来看看JDBC的事务处理: 先来看看,在什

JDBC的进化2

好了,换了个新屏幕,原来的电脑屏幕,过年的时候擦玻璃,玻璃掉下来给砸的裂开了(玻璃一点事情都没有),新屏幕感觉就是爽,也不枉我花了280大洋买的LG的完美屏.战斗力立马感觉飙升20%.闲话就不多说了,继续进化JDBC. 将JDBC的连接完成后,我们要做什么呢?增删改查呗! 好,那就先来一个原始的起源,然后我们逐渐进化. 1.JDBC的进化2-增删改查 获取连接对象后,我们是这样想的,我们要将我们的sql语句通过这个连接发送到数据库,然后让数据库将结果返回给我们. 通过查看API,发现了Conne

JDBC的进化4--最终进化

除去直接调用开源组织给提供的jar包外,我今天要说的内容就是JDBC的最终版,需要我们多敲多练多理解.最重要的是理解.废话不多说了,开始吧. 早上的时候,我将昨天的内容整理,能处理事务的通用方法写到了JDBCUtils工具类中. 其实到这里的时候,所有细节部分的代码都已经实现了.接下来要进行的内容,其实就是对这些内容的整合,整体的调控. 我们来说DAO: 现在我们希望这个程序能更加自动化一点,我们只需要提供一个连接,它就能返回给我们一个对象或一个对象集,或一个结果.或是我们提供一个连接,一个对象

JavaSE:集合总结(Collection,Map)

今天来总结JavaSE部分的集合.首先来从整体来看: 我们主要要学习的内容: Collection: Collection(接口): java.util.Collection |-- List(子接口) : |--ArrayList |--LinkedList |--Vector |-- Set(子接口) : |--AbstracSet(子接口) |--HashSet |--LinkedHashSet |--SortedSet(子接口) |--TreeSet |-- Queue(子接口) : M

Spring DAO vs Spring ORM vs Spring JDBC

Pat 的疑惑 最近关注于 Spring 提供的数据访问技术,对于 Spring 相关的这几个项目有何不同我不是太明白: Spring-DAO (http://docs.spring.io/spring/docs/2.0.8/reference/dao.html) Spring-ORM (http://docs.spring.io/spring/docs/3.0.x/spring-framework-reference/html/orm.html) Spring-JDBC (http://doc

jdbc的简单使用

1.加载驱动(mysql的驱动是com.mysql.jdbc.Driver,SqlServer的驱动是 com.microsoft.sqlserver.jdbc.SQLServerDriver) 2.加载数据库的连接(url, username,password) 3.编写sql语句(String sql="select * from grade  where gradeName = ?";) 4.遍历查询结果 [while (resultSet.next()) {   System.

商城项目整理(三)JDBC增删改查

商品表的增加,修改,删除,订单表的增加,确认,用户表的查看,日志表的增加,查看 商品表建表语句: 1 create table TEST.GOODS_TABLE 2 ( 3 gid NUMBER not null, 4 gname VARCHAR2(90), 5 gdetails CLOB, 6 gpicture VARCHAR2(100), 7 gprice NUMBER, 8 gleixing NUMBER, 9 gpinpai VARCHAR2(20) 10 ) 11 tablespace

jdbc驱动jar导入eclipse

在使用JDBC编程时需要连接数据库,导入JAR包是必须的,导入其它的jar包方法同样如此,导入的方法是 打开eclipse 1.右击要导入jar包的项目,点properties 2.左边选择java build path,右边选择libraries 3.选择add External jars 4.选择jar包的按照路径下的确定后就行了. Java连接MySQL的最新驱动包下载地址 http://www.mysql.com/downloads/connector/j 有两种方法导入jar包,第一种