2016-2017-2 学习总结目录: 1 2 3 4 5 6 7 8 9 10
20162330_刘伟康_ 第9周学习总结
主目录
教材学习内容总结
第二十一章 数据库
1.了解数据库管理系统及其基本操作(CRUD);
2.关系型数据库将基本信息组织为一张或多张表;
3.使用 JDBC API 建立数据库的连接;
4.使用
create table <tablename> ...
语句来创建数据库表;5.使用
alter table <tablename> ...
语句来修改数据库表;6.查询数据库(使用
show columns <tablename> ...
语句获取列信息);7.使用
insert <tablename> values ...
语句在表中添加新数据;8.使用
select from <tablename> ...
语句查看表中数据;9.使用
updateXXX
修改集合中的数据;10.使用
delete from <tablename> ...
删除表中数据以及使用drop table <tablename>
删除表。
网易云课堂
- 1.MySQL简介:
- 官方网站(www.mysql.com & dev.mysql.com);
- 下载安装(默认端口:3306);
- 命令行操作:(注意分号)
-
命令 作用 create database MyDB
创建一个名为MyDB的数据库 use MyDB
切换到当前数据库 show tables
显示当前数据库拥有的表格数 create table <表名>(组件,自动增加)
在当前数据库中创建表 insert into <表名>(域) values(域)
为当前表添加数据 select * from <表名>
查询表中的内容 update <表名> set ... = ... where ...
修改表中的数据 delete from <表名> where ...
删除表中数据 - 当使用MySQL本身的命令时不用加分号(即help显示的命令)
- 2.JDBC简介:
- Java Database Connectivity (Java数据库连接);
- 实现跨数据库平台;
- 一个抽象的编程接口;
- 在Java中有两个包
java.sql
和javax.sql
包含JDBC编程的所有接口; - JDBC常用接口和类:
-
接口/类 作用 DriveManager
加载驱动程序 Connection
连接数据库(打开、关闭) Statement
静态操作SQL语句 PreparedStatement
动态操作SQL语句 CallableStatement
调用存储过程 ResultSet
保存数据记录的结果集合 ResultSetMetaData
结果集的元数据 DatabaseMetaData
数据库的元数据 - JDBC编程步骤:
- 加载数据库驱动(jar包)
- 获得数据库连接
- 创建语句
- 执行查询、添加、修改、更新
- 遍历结果集
- 关闭数据库连接
- 3.数据库连接:
- 数据库打开的连接有线,所以连接使用完成需要关闭
Class.forName
加载驱动DriverManager
获得连接(getConnection ...
)
- 4.Statement语句:
- SQL的描述
- 可以操作各种SQL语句(DDL、DML、DCL等)
- 创建表
- 插入数据
- 5.ResultSet结果集:
- 调用语句
executeQuery
方法返回结果集对象 - 常用方法:
next()
:返回boolean类型数据,用来判断结果集中是否有数据getXXX()
:获得结果集中数据项(根据列名称、列索引)
- 调用语句
- 6.PreparedStatement:
- 预定义语句,继承Statement
- 动态操作
- 7.CallableStatement:
- 继承PreparedStatement,调用存储过程
- 用法:
- 调用简单的存储过程
- 调用有输入参数的存储过程
- 调用有输入、输出参数的存储过程
- 命令行创建存储过程:
create procedure all_customers() select * from <表名>
- 命令行调用:
call all_customers()
- 8.DAO设计模式:
- Data Access Object (数据访问对象)
- 目的:封装,解耦合。
说明:在观看视频时感觉老师讲解较快,部分内容较陌生,所以没有仔细观看后面几个视频,练习时只练习了命令行下的mysql,对于用Java中的代码实现数据库连接仍然需要熟悉和练习。
我使用命令行做了一个关于海贼王中草帽海贼团最新悬赏的数据表:
草帽海贼团最新悬赏
实验楼(只看完了基础篇)
- 1.SQL的介绍及MySQL的安装:
- 安装 MySQL 服务端、核心程序:
sudo apt-get install mysql-server
- 安装 MySQL 客户端:
sudo apt-get install mysql-client
- 验证是否安装并启动成功:
sudo netstat -tap | grep mysql
- 用 gedit 修改 MySQL 的配置文件(my.cnf):
sudo gedit /etc/mysql/my.cnf
- 启动 MySQL 服务:
sudo service mysql start
- 使用 root 用户登录:
mysql -u root
- 退出:
quit
或者exit
- 其他查看表和数据库的命令和网易云课堂第一节以及书中的内容相似。
- 安装 MySQL 服务端、核心程序:
- 2.创建数据库并插入数据:
- 创建、添加、修改的操作和网易云课堂第一节以及书中的内容相似。
- 数据类型:
- char 和 varchar 的区别: char 的长度是固定的,而 varchar 的长度是可以变化的,比如,存储字符串 “abc",对于
char(10)
,表示存储的字符将占 10 个字节(包括 7 个空字符),而同样的varchar(12)
则只占用4个字节的长度,增加一个额外字节来存储字符串本身的长度,12 只是最大值,当你存储的字符小于 12 时,按实际长度存储。 - enum 和 set 的区别: enum 类型的数据的值,必须是定义时枚举的值的其中之一,即单选,而 set 类型的值则可以多选。
- char 和 varchar 的区别: char 的长度是固定的,而 varchar 的长度是可以变化的,比如,存储字符串 “abc",对于
- 在大多数系统中,SQL 语句都是不区分大小写的。
- 3.SQL 的约束:
- 约束的分类:
- 加载文件中的数据:
source /home/*
- default 约束只会在使用 insert 语句时体现出来,insert 语句中,如果被 default 约束的位置没有值,那么这个位置将会被 default 的值填充;
- 当 insert 语句新插入的数据和已有数据重复的时候,如果有 unique 约束,则 insert 失败;
- 一个表可以有多个外键,每个外键必须 reference (参考) 另一个表的主键,被外键约束的列,取值必须在它参考的列中有对应值;
- 被非空约束的列,在插入值时必须非空。
- 4.SELECT语句详解:
- select 语句的基本格式为:
select <要查询的列名> from <表名字> where <限制条件>;
- where 限制条件可以有数学符号 (
=
,<
,>
,>=
,<=
) ; - where 后面可以有不止一条限制,而根据条件之间的逻辑关系,可以用 or(或) 和 and(且) 连接;
- 关键词
in
和not in
用于筛选“在”或“不在”某个范围内的结果; - 关键字
like
在SQL语句中和通配符一起使用,通配符代表未知字符。SQL中的通配符是 _ 和 % 。其中 _ 代表一个未指定字符,% 代表不定个未指定字符; order by
的结果是升序排列,而使用关键词asc
和desc
可指定升序或降序排序。- SQL 允许对表中的数据进行计算。对此,SQL 有 5 个内置函数:
COUNT
SUM
AVG
MAX
MIN
使用as
关键词可以给值重命名,比如最大值被命名为了max_salary:select MAX(salary) as max_salary,MIN(salary) from employee;
- 子查询(多层);
- 连接查询:
join on
语法。
- select 语句的基本格式为:
- 5.修改和删除:
- 删除一张表:
drop table <表名字>
; - 重命名一张表:
rename table <原名> to <新名字>
&alter table <原名> rename <新名>;
&alter table <原名> rename to <新名>;
- 修改一列的数据类型:
alter table <表名字> change <原列名> <新列名> <数据类型> <约束>;
&alter table <表名字> modify <列名字> <新数据类型>;
- 其他内容与网易云课堂中的第一节内容相似。
- 删除一张表:
- 6.其他基本操作:
- 对一张表中的某个列建立索引:
alter table <表名字> add index <索引名> <列名>;
&create index <索引名> on <表名字> <列名>;
- 创建视图的语句格式为:
create view <视图名(列a,列b,列c)> as select <列1,列2,列3> from <表名字>;
- 导入操作:
load data infile <'文件路径'> into table <表名字>;
- 导出操作:
select <列1,列2> into outfile <'文件路径和文件名'> from <表名字>;
(注意:语句中 “文件路径” 之下不能已经有同名文件。) - mysqldump 是 MySQL 用于备份数据库的实用程序。使用 mysqldump 备份的语句:
mysqldump -u root 数据库名>备份文件名;
(备份整个数据库)mysqldump -u root 数据库名 表名字>备份文件名;
(备份整个表)
- 备份与导出的区别: 导出的文件只是保存数据库中的数据;而备份,则是把数据库的结构,包括数据、约束、索引、视图等全部另存为一个文件。
- 恢复:使用source 语句或者把刚才备份的 bak.sql 恢复到 test 数据库:
mysql -u root test < bak.sql
- 对一张表中的某个列建立索引:
- 7.进阶篇:
教材学习中的问题和解决过程
问题1:在虚拟机中安装mysql时显示无法定位软件包。(读取信息没出问题)
问题1解决方案:(搜索)
- 之前我有遇到过相似的问题,记得是要导入ppa的源,不过查了一下那是针对atom安装包的,对于mysql不使用,所以尝试了其他方法:
尝试一:根据搜索到的答案,我按照步骤完成,导入了一个mirror的源,但是重新安装仍然显示无法定位软件包;
尝试二:更新系统并且换掉软件源,并再次更新,然而我依然没有成功安装;
尝试三:先安装wine,再安装其他使用apt-get安装的软件,最后终于成功安装mysql。
不过我也产生了新的疑问:wine到底是什么?继续搜索,我得到了答案:简单来说就是一个运行在linux系统上的,可以移植windows的程序在Linux上运行的模拟器。大概是因为它的兼容性使得一些在Linux上使用apt-get安装的软件得以安装。
问题2:在启动mysql时遇到Error。
- 问题2解决方案:(搜索)
首先得到一个简洁的解决方法,然而并没有用。
之后又浏览了几篇详细的资料,进行了尝试,
可惜找到的这种方法仍然不适用:
继续查找:
之后我又成功了,方法是使用mysql -u root -p
,其中,-p 的含义是输入root用户的密码(如果root没有密码就可以省略),关于该启动问题的具体原因,
详见:MySQL ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)的真正原因问题3:关于一开始在视频和书中看到的varchar类型是什么?
问题3解决方案:(搜索)(实验楼)
在实验楼中,我得到了相关解答及其与char的比较:
看完之后,我觉得这个char和varchar的区别就像是在最初配置虚拟机的时候的“动态分配内存”与“固定内存”一样,只是在需要启用的时候开放相应空间。
关于varchar类型更详细的介绍,详见:MySql中的varchar类型
代码调试中的问题和解决过程
问题1:在测试简易计算器时,无法识别“*”,被当做通配符。
问题1解决方案:(搜索)
根据娄老师的实验介绍,是不建议使用“*”的,建议用“x”代替:
不过我仍然想尝试一下,于是查找到相关资料进行尝试,在运行时给乘号加上单引号,即‘*’就可以被识别了!
- 问题2:在运行数组测试时出现StackOverflowError。
问题2解决方案:(查阅API文档)(搜索)
在API中找到:这是一个堆栈溢出错误,
之后又进行相关搜索:
找到相关原因是递归调用的死循环太多或者数据过大,但是我没有查找到具体的解决方案,我就只好在有效数据之外加了一层循环,使得在不传入命令行参数时输出结果显示为0:问题3:在修改文件名之后,git commit信息提交,没想到在git push后之前提交的文件夹内的所有文件的commit信息全部变成这次的提交信息,想要撤回这次提交。
问题3解决方案:(搜索)(博客园提问)
我先试着搜索,然而查到了一大堆看的不太懂的东西,虽然都和git有关,但是都没说到撤回push的方法,我因为害怕再次出现类似错误就没敢尝试,所以又在博客园提问,谢涛老师提供了一篇帮助资料:Git HowTo: revert a commit already pushed to a remote repository
认真阅读后我选择了最简单的一种方法尝试,解决了问题,以后在遇到类似问题应该新建一个远程仓库进行测试。
代码托管
- week9:(本周显示的this week统计代码量错误,可能是因为撤回commit的原因,准确代码量统计见学习进度条)
(statistics.sh脚本的运行结果截图)
上周考试错题总结(绿色选项为正确答案)
第八周测试:
错题1:在try-catch块中finally子句是必需的.
A .true
B .false- 错误原因:这个题真的是紧张看错了。
加深理解:try-catch语句可以带有一个可选的finally子句,而如果带了finally子句,无论以何种方式退出try块都要执行这段代码。
错题2:下面哪种异常类型必须被一个方法捕获,或者必须列在抛出它的方法的头部?
A .file stream(文件流)
B .IO
C .checked(必检异常)
D .unchecked(免检异常)
E .none of the above(以上均不是)- 错误原因:没有弄清楚IO和必检异常的一些区别。
解析:必检异常必须始终被捕获或抛出,否则会产生一个编译错误。
- 错题3:如果有以下程序片段:
public class Main {
public static void main(String[] args) {
try {
int number = Integer.parseInt(args[0]);
System.out.println(number++);
} catch(NumberFormatException ex) {
System.out.println("必须输入数字");
}
}
}
执行时若指定命令行自变量 one,以下描述何者正确?
A .编译错误
B .显示"必须输入数字"
C .显示 ArrayIndexOutOfBoundException 堆栈追踪
D .不显示任何讯息
- 错误原因:没有具体分析,缺少相关实践。
解析:在传入one后,由于one不是整型数类型,所以抛出该异常。
- 错题4:如果有以下程序片段:
public class Main {
public static void main(String[] args) {
try {
int number = Integer.parseInt(args[0]);
System.out.println(number++);
} catch(RuntimeException | NumberFormatException ex) {
System.out.println("必须输入数字");
}
}
}
执行时若没有指定命令行自变量,以下描述何者正确?
A .编译错误
B .显示"必须输入数字"
C .显示 ArrayIndexOutOfBoundException 堆栈追踪
D .不显示任何讯息
- 错误原因:没有具体分析,缺少相关实践。
解析:没有指定命令行自变量,则会导致编译错误。
- 应该改成这样,就可以抛出异常了:
public class Main {
public static void main(String[] args) {
try {
int number = Integer.parseInt(args[0]);
System.out.println(number++);
} catch(RuntimeException ex) {
System.out.println("必须输入数字");
}
}
}
或者改成这样:
public class Main {
public static void main(String[] args) {
try {
int number = Integer.parseInt(args[0]);
System.out.println(number++);
} catch(NumberFormatException ex) {
System.out.println("必须输入数字");
}
}
}
- 运行结果如下:
结对及互评
- 张旭升本周状态一般,对于数据库仍然需要深入学习,感觉本周的练习强度不够,想要掌握数据库我们还需要在认真看完资料后进一步探讨,而我这周也只是进行了命令行的简单练习。先把理论面铺开,再在后续时间里找时间实践。
点评过的同学博客和代码
其他(感悟、思考等,可选)
感悟
- 本周内容较多,感觉数据库完全就是一个新内容,只是可以通过代码的方式实现,本周我的数据库自主实践环节较少,主要是将一部分时间投入到课堂的实践和课后任务中。感觉本周使用xampp连接访问数据库没什么问题,但是命令行环境配置问题就有些多了,不过都靠自己解决了!
- 其次,在本周的实践课中,一下子感觉到任务量加大,再加上涉及一些之前的内容,我觉得自己的基础不是很扎实,我现在只是偶尔回顾一下基础,在调用一些方法时仍然会出现一些编译错误,还有我发现自己上课时效率较低,注意力不集中,可能是晚上睡的太晚,过于焦虑。在精力分配上我应该更注重自身的情况。
- 比如说:在感觉枯燥的时候练习一下markdown排版,或者适当放松一下,不能因为几件事的时间安排不合理就拖延了整个进程,这是我一直想改掉的习惯。
- 总之,想要不脱离群体,又因为个人情况而特立独行并不容易,不过我仍然会坚持走自己的路,做好自己能够做好的事。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 95/95 | 1/4 | 12/12 | 学会了编写简单的脚本和课本上的java程序 |
第二周 | 512/607 | 1/5 | 14/26 | 学会了Scanner类编写简单的java程序,了解了数据转换相关知识 |
第三周 | 484/1091 | 1/6 | 14/40 | 学会了创建简单的String,Random,Math等类的对象,安装并使用IDEA工具,并且了解了一些java位运算符 |
第四周 | 1176/2267 | 2/8 | 24/64 | 学会了条件及循环语句的基本表达,大致了解数组元素及对象数组的概念 |
第五周 | 838/3105 | 1/9 | 14/78 | 加深了对面向对象、方法结构和类定义的理解 |
第六周 | 427/3532 | 1/10 | 12/90 | 主要了解super调用函数的方法,继承及其目的 |
第七周 | 1086/4618 | 2/12 | 18/108 | 了解接口,理解多态,大致学习了工厂模式,UML建模,TDD |
第八周 | 537/5155 | 1/13 | 12/120 | 了解I/O流的作用,学会了异常处理的方法,API |
第九周 | 412/5567 | 1/14 | 12/132 | 大致了解栈的数据存放、递归思想并进行相应练习,markdown拓展,数据库基础(命令行操作)(代码实现) |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
计划学习时间:16小时
实际学习时间:12小时
有效学习时间:4小时
改进情况:本周先进行视频学习,发现自己对视频中内容不熟,于是又对照课本学习。本周也抽出一部分时间拓展mardown格式,对于通过代码实现数据库连接并传输数据需要加强练习。
(有空多看看现代软件工程 课件 软件工程师能力自我评价表)