11月12日-14日,北京的阳光依旧灿烂,只是每天刺骨的北风都在提醒我们冬天的威严。想起某学霸的文章,北京每年的11月1日—14日,是一年最冷的时段,之所以说是学霸,是因为他做了一个很高冷的比方,说这段日子像是电子深势阱,具体啥意思咱不懂,不过一看图就明白了很形象。14日将是最后的严寒,15日北方所有地区都将开始供暖。
CE项目V3.0升级计划
刚开始列了一个简单的计划,由于对于数据库学习的难度有些吃不准,所以计划的时间是3~5天完成,不过学习起来,发现数据库相较图形界面编程还是要简单一些的,当然也可能是我目前还用不上大型数据库和高级功能,所以最后3天的时间就完成了计划,不过最后犯了个懒,把总结复盘放到第四天来做了。
知识点学习
这部分采用的教程是《MySQL入门很简单》。是的,又是一本入门书籍[\捂脸]。真的是从数据表的基本范式和数据表集的结构类型开始学起,了解了SQL其实是一种目前通用的数据库编程语言(跟Java一样是一种高级语言),五种常用的数据库系统及适用选择(如本例因为便宜好用选择了MySQL),以及三种常见的数据库访问技术(如本例所选用的Java/JDBC),还有常用的三种存储引擎及适用选择(本例选用了InnoDB引擎)。详细的知识点见图:
再总结一下SQL语言常用的关键字:
此时,还需要在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调用该驱动,具体实现过程如下图所示:
其中几个关键步骤是:
一、使用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项目的升级内容包括:
- 在MySQL数据库系统中创建了CEproject数据库;
- 在Java程序中定义了MyDatabaseClass数据库类;
- 在MyDatabaseClass数据库类的构造方法中实现了与CEproject建立连接;
- 在MyDatabaseClass数据库类中用Customlist2Database()等6个方法实现了程序用户集和活动集对数据库的读写操作,其中对写入方法进行了重载,分为覆盖写入和单个记录写入;
- 在MyDatabaseClass数据库类中QueryEntertain()方法实现了用户对活动的模糊查询;
- 对CEproject的查询结果页面和数据读写操作页面进行了设计和Swing编程实现,由用户操作触发对数据库的操作;
- 对CEproject的数据存储子系统中的数据进行了整体迁移,抛弃了前两版的txt数据存储系统,改为全部使用MySQL进行数据存储。
此外,在编程技术方面,做了以下练习并提炼了一定的干货:
- MAP-LIST嵌套集合实现批量数据处理。MAP集合和数据类对象分别记录用户数据,并分别创建MAP集合LIST与数据类对象LIST,并进行了比较,结果表明两者均可从数据结构上模拟数据库中用户数据表,并使用循环对数据进行批量操作。注意点:须在循环体内创建MAP集合,否则前期加入LIST的MAP对象数据将被后期MAP对象数据覆盖。
- Iterator迭代器。使用Iterator迭代器及Iterator.hasNext()方法对LIST集合和MAP集合进行操作。
- 模糊查询的实现。刚开始只是简单地将用户在搜索栏输入的查询字符传入数据库进行字符串匹配,结果发现只有整个字符串完全匹配才能给出结果;改进的办法是使用like关键字和%通配符,将用户查询字符串拆散,然后在每个字符之间插入%,再传入数据库,就可以实现模糊查询。后续更进一步可以去实现用户输入字符串带空格或+号等查询字符,再用户意图转化为数据库能理解的语言。
- JDBC在SQL命令行中引入变量。对PrepaerdStatement预处理方法进行了多项练习,熟悉了通配符‘?’的使用,确定了通过SetObject()在其SQL表达式中引入变量的可行性,从而实现批量变化数据的处理。
- 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从入门到精通》