34岁!100天!学会Java编程(Day16-Day19)—MySQL与JDBC编程

电子深势阱

11月12日-14日,北京的阳光依旧灿烂,只是每天刺骨的北风都在提醒我们冬天的威严。想起某学霸的文章,北京每年的11月1日—14日,是一年最冷的时段,之所以说是学霸,是因为他做了一个很高冷的比方,说这段日子像是电子深势阱,具体啥意思咱不懂,不过一看图就明白了很形象。14日将是最后的严寒,15日北方所有地区都将开始供暖。

CE项目V3.0升级计划

刚开始列了一个简单的计划,由于对于数据库学习的难度有些吃不准,所以计划的时间是3~5天完成,不过学习起来,发现数据库相较图形界面编程还是要简单一些的,当然也可能是我目前还用不上大型数据库和高级功能,所以最后3天的时间就完成了计划,不过最后犯了个懒,把总结复盘放到第四天来做了。


第三阶段计划

知识点学习

这部分采用的教程是《MySQL入门很简单》。是的,又是一本入门书籍[\捂脸]。真的是从数据表的基本范式和数据表集的结构类型开始学起,了解了SQL其实是一种目前通用的数据库编程语言(跟Java一样是一种高级语言),五种常用的数据库系统及适用选择(如本例因为便宜好用选择了MySQL),以及三种常见的数据库访问技术(如本例所选用的Java/JDBC),还有常用的三种存储引擎及适用选择(本例选用了InnoDB引擎)。详细的知识点见图:


MySQL知识点

再总结一下SQL语言常用的关键字:


MySQL常用关键字

此时,还需要在MySQL的官网下载一个免费的安装程序,并且将数据库安装到本地电脑上(目前提供5.7版本的下载),在以上学习梳理过程中,不断地练习加以熟悉。

JDBC编程

Java语言体系与SQL语言体系是两个相对独立的高级编程语言,中间需要一座桥梁连接起来,而JDBC技术就是Java语言提供的一座桥梁,或者更形象的说就是一个同声传译。

其中MySQL面向Java/JDBC,C#/ADO.NET,PHP/mysqli等高级编程语言分别提供了一个带驱动程序的库文件,面向Java/JDBC的驱动库叫做“mysql-connector-java-5.1.44-bin.jar”,因此,在Java项目中必须在构建路径中添加该驱动库,否则程序将无法编译(每一个项目都必须单独添加该驱动库)。
完成驱动加载后,就可以使用JDBC的API调用该驱动,具体实现过程如下图所示:


JDBC技术

其中几个关键步骤是:
一、使用java.lang.Class.forName("数据库驱动")加载MySQL驱动;
二、使用java.mysql.DriverManager.getConnection(url,user,password)与数据库建立连接,并返回Connection实例;
三、使用java.mysql.Connection.createStatement()或java.mysql.Connection.prepareStatement()创建SQL语句执行器,并返回Statement或PreparedStatement实例;
四、使用java.mysql.Statement.excutequery()执行SQL查询语句,并返回ResultSet类型实例;
五、使用java.mysql.ResultSet.next()和java.mysql.ResultSet.getString()获取查询字段记录值。
以上是从数据库中读取数据,向数据库中写入数据,或者修改数据库,过程类似。

CE项目V3.0

此阶段对CE项目的升级内容包括:

  1. 在MySQL数据库系统中创建了CEproject数据库;
  2. 在Java程序中定义了MyDatabaseClass数据库类;
  3. 在MyDatabaseClass数据库类的构造方法中实现了与CEproject建立连接;
  4. 在MyDatabaseClass数据库类中用Customlist2Database()等6个方法实现了程序用户集和活动集对数据库的读写操作,其中对写入方法进行了重载,分为覆盖写入和单个记录写入;
  5. 在MyDatabaseClass数据库类中QueryEntertain()方法实现了用户对活动的模糊查询;
  6. 对CEproject的查询结果页面和数据读写操作页面进行了设计和Swing编程实现,由用户操作触发对数据库的操作;
  7. 对CEproject的数据存储子系统中的数据进行了整体迁移,抛弃了前两版的txt数据存储系统,改为全部使用MySQL进行数据存储。

此外,在编程技术方面,做了以下练习并提炼了一定的干货:

  1. MAP-LIST嵌套集合实现批量数据处理。MAP集合和数据类对象分别记录用户数据,并分别创建MAP集合LIST与数据类对象LIST,并进行了比较,结果表明两者均可从数据结构上模拟数据库中用户数据表,并使用循环对数据进行批量操作。注意点:须在循环体内创建MAP集合,否则前期加入LIST的MAP对象数据将被后期MAP对象数据覆盖。
  2. Iterator迭代器。使用Iterator迭代器及Iterator.hasNext()方法对LIST集合和MAP集合进行操作。
  3. 模糊查询的实现。刚开始只是简单地将用户在搜索栏输入的查询字符传入数据库进行字符串匹配,结果发现只有整个字符串完全匹配才能给出结果;改进的办法是使用like关键字和%通配符,将用户查询字符串拆散,然后在每个字符之间插入%,再传入数据库,就可以实现模糊查询。后续更进一步可以去实现用户输入字符串带空格或+号等查询字符,再用户意图转化为数据库能理解的语言。
  4. JDBC在SQL命令行中引入变量。对PrepaerdStatement预处理方法进行了多项练习,熟悉了通配符‘?’的使用,确定了通过SetObject()在其SQL表达式中引入变量的可行性,从而实现批量变化数据的处理。
  5. Java程序对MySQL数据库操作效率。对Java中操作大批量数据在数据库中的读写效率进行了一定的研究,比较了四种方法,对1000个三字段记录的批量写入操作:
  • 单循环编译处理Statement.execute()方法,运行时间5095ms
  • 单循环Statement.addBatch()加循环结束Statement.executeBatch()方法,运行时间4945ms
  • 同样是单循环Statement.addBatch()加循环结束Statement.executeBatch()方法,在循环体外conn.createStatement()后,添加一句conn.setAutoCommit(false),运行时间为435ms
  • 同样是单循环PreparedStatement.addBatch()加循环结束PreparedStatement.executeBatch()方法,在循环体外conn.prepareStatement()后,添加一句conn.setAutoCommit(false),运行时间为342ms
    可以看出,同样进行批处理命令,加入conn.setAutoCommit(false)后,效率提升十余倍,发生了根本性的变化。加入的这句话的作用是设置不自动提交,这样Java程序就可以在添加了所有批处理命令后,只与MySQL系统连接,并一次提交所有命令,因此,节省了大量用于两个系统间“过桥”的时间。

结论一:JDBC的批处理语句默认没添加一句就执行一句,需要手动设置为不自动提交。这样在用批处理方法处理大量数据时,将极大提升效率。
结论二:使用预处理的方法PreparedStatement,不仅可以进行语句的动态调整,还可以提升程序效率,因此在JDBC技术中应当优先于Statement方法使用。

参考书目
《MySQL入门很简单》
《Java从入门到精通》

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,056评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,842评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,938评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,296评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,292评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,413评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,824评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,493评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,686评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,502评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,553评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,281评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,820评论 3 305
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,873评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,109评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,699评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,257评论 2 341

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,549评论 18 399
  • 一. Java基础部分.................................................
    wy_sure阅读 3,784评论 0 11
  • 本人的环境为Myeclipse10、MySQL5.7.15 本文包括:简介JDBC编程步骤打通数据库程序详解—Dr...
    廖少少阅读 3,922评论 7 39
  • 一个自诩坚强的人,到了完全陌生的环境,或许会发现自己原来不那么坚强。 到了这个完全陌生的城镇,原本就没有多少朋友的...
    你看得见我阅读 508评论 1 5
  • 谁要为你点一支爵士乐 唱着 繁华的市场 浮金的时代 好似盖茨比乐园 快乐比蒸汽还积极 月光比玫瑰更浪漫 为了更好享...
    太治阅读 187评论 0 0