发表于: 2017-12-25 22:33:02

1 574


今天做的事情: JDBC的学习

首先是跟着视频学习了下,知道了JDBC及其驱动的概念,了解下如何用JDBC查询MYSQL数据库中的表格。

之后,关掉视频自己敲了下代码,除了查询,还尝试了下插入语句的实现。

1、实验开始

创建了名为“table_jdbc”的表格,只设置了一个名为“name”的字段,记录了唐僧师徒四人组的名字:

然后写了一个名为JDBCUtils的配置类,代码如下:

配置类一般是不需要实例的,只需要用到里面的静态方法就行了,而静态方法里面不允许调用非静态的变量,所以我们要把配置的三个变量设置为“private static”。private 私有的,为了安全和避免不必要的麻烦。

可以看到,配置类里有一个静态代码块,当我们调用JDBCUtils里的一个静态方法时,就会加载JDBCUtils这个类,从而加载驱动。(关于类加载的知识点挺多的,在《Thinking in java》这本书中对RTTI的介绍中有详细介绍,日后我打算对照着实例好好再体悟下...)

然后实现mysql的查询-插入-查询:

运行结果:

可以看见,表“table_jdbc”中成功地插入了一条name为“WuKong”的记录,假悟空混进到取经队伍里面来啦!

其中插入的"sql"语句是这样子写的:

update("insert into table_jdbc(name) values('\"WuKong\"')

在这里,我加了两个转义符 \  也就是反斜杠,因为英文双引号在java中有特殊的含义,如果不加转义符,就连编译都过不了......

这时,我突然想到一个问题:如果需要在mysql里面直接插入一句带引号的字符串,该怎么办?

我百度了下,发现:

那我在java中写的转义符,是什么时候发生作用的呢?我想到的,可能有以下两种情况:

1、是java通过Statement这辆货车,直接原封不动地(其实还是少了个结尾的分号)将

update("insert into table_jdbc(name) values('\"WuKong\"')

这条语句送到mysql那里解析。

2、是在java里面先完成部分处理,然后再交给mysql。

这个问题对现阶段的我,实在是难以解决,不过这个问题的提出,为我打开了新的窗口,那就是:

驱动是怎么实现JDBC接口的?

如果有一天,我能做到设计层面的高度,肯定可以回答这个问题吧。庆幸的是,对于现在的我,mysql的语法已经很好地帮我解决了这个担忧——无论是values('"WuKong"')还是values('\"WuKong\"'),mysql都能识别为同一样东西,我们只管写,只管用就是了。好的设计可以确保良好的可移植性,程序的美妙之处就在这里。

言归正传,回到实现类“TestBox”里,我写了两个方法,一个是update,一个是query,可以看到两个方法里面用到的变量个数是不一样的,update是两个,query是三个,这是因为两者的核心实现方法不一样。

一个是

int executeUpdate(String sql) throws SQLException;

另一个是

ResultSet executeQuery(String sql) throws SQLException;

可以很明显的看见  主要是返回值的差异,对于插入(更新),我们只要知道成功与否即可,而查询需要一个更具体的对象,即ResultSet来作为一个“容器”去记录。此处的差异直接导致了整个实现方法update和query的差异,甚至影响到了free函数。代码写完,整个布局全是模板,又臭又长,真心希望能有一个现成的框架来拯救我,而我相信这个框架迟早会有的,哪怕以后自己尝试去写...


明天计划做的事情:继续任务一,学习JDBC和Maven。


收获:

1、初步了解了JDBC的流程、功能和原理

2、复习了巩固JAVA有关类加载、异常、单例模式等知识点。


返回列表 返回列表
评论

    分享到