发表于: 2021-04-17 15:04:05
2 1147
一,今天完成的事情
任务一深度思考21及以后。任务一总结
21.自增ID有什么坏处?什么样的场景下不使用自增ID?
1,当需要合并新旧数据库的时候需要处理 id 冲突。如果新旧数据库的自增 id 类型不同,那么需要修改 id,测试如果有同索引的关联表的话也需要一同修改。不存在连续性,也就是说若表中存有3行数据,ID字段为1,2,3 那么当删除字段2时就变为1,3,不具有连续性。
2,正是因为自增ID的缺点也就是无法在多个表中,或者多个数据库中保持ID主键唯一不重复,所以若是使用分布式数据库以及数据合并的情况下时不能使用自增ID的。
此外,若是能够有其他的字段能作为主键保证唯一性,无需使用自增ID
22.什么是DB的索引,多大的数据量下建索引会有性能的差别,什么样的情况下该对字段建索引?
1,索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。
2,至少10万,通常应该在20万以上。实际使用有机会测试,如果加入索引,查询速度能够明显提高,那说明应该加上了。一般不会对你的插入等操作产生速度影响。
3,主键自动建立唯一索引。
频繁作为查询条件的字段应该创建索引。
查询中排序的字段创建索引将大大提高排序的速度(索引就是排序加快速查找)。
查询中统计或者分组的字段。
23.唯一索引和普通索引的区别是什么,什么时候需要建唯一索引。
1,相对于普通索引,唯一索引不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。在对该列进行增或改时,首先会检查是否重复,再执行增改操作,否则报出duplicate错误,拒绝操作。
2,当字段多且字段值没有重复的时候用唯一索引。普通索引和主键索引不支持空值,唯一索引支持空值,所以有空值的时候考虑唯一索引。一个表的主键只能有一个,而唯一索引可以建多个,所以已经有主键但是符合唯一索引要求的时候,建立唯一索引。
24.如果对学员QQ号做了一个唯一索引,在插入数据的时候,是否需要先判断这个QQ号已经存在了?
是。参考23“在对该列进行增或改时,首先会检查是否重复,再执行增改操作,否则报出duplicate错误,拒绝操作。”
25.CreateAt和UpdateAt的意义分别是创建时间和修改时间,这两个时间应该在什么情况下赋值?是否应该开放给外部调用的接口?
这2个字段如果写成“CreatedAt”和“UpdatedAt”更符合要求。
1,“CreatedAt”是在数据新建时获取的,以后这个字段不会再变化。“UpdatedAt”是在数据进行修改操作时获取的,随着每一次的修改而做出相应的变化。
2,分2种情况。
1)如果是查询接口调用,是可以的。
2)如果是修改或者删除等其他接口,是不可以开放的。这两个字段涉及到对数据库操作的记录,只能由代码来自动控制,而不能把权限放开。
26.修真类型应该是直接存储Varchar,还是应该存储int?
int,这个项目的表其实不只有一张的设计比较好。修真类型并不多,同时需要维护的映射表也不会经常变动。修真类型用外键更好。虽然varchar可以用,但是可能会大量重复,而且不利于之后更新维护。
27.varchar类型的长度怎么确定?有什么样的原则,和Text和LongText的区别是什么?
1,VARCHAR是可以保存长度可变的字符串。如:一个用户名字段不能确定长度,只知道不超过10个字符,就可以选择varchar类型。根据需求与实际情况来考虑,不能千篇一律。 比如:用户名,谁的名字会有255/3=85个字符?所以也没必要那么长,但又不能定义成CHAR(),所以给个够用的长度varchar(20)或更少varchar(10)即可,考虑少数民族可以长点。 varchar的长度,最好是在够用(需要适当预测未来需求)且方便管理的前提下尽可能短。
2,它们都是MySQL数据库的字符串类型,用来存储字符数据。区别是存储的数据长度、大小不一样。我们可以根据需求选择使用哪种字符串类型。
mysql数据库的varcharr类型在4.1以下版本中最大长度限制为255字节
mysql5.0以上的版本中varchar数据类型的长度支持到了65535字节。
Text和LongText 也是长度可变的类型
Text的最大长度是可以存储 65535 (2^16 – 1) 个字符
LongText的最大长度是可以存储4294967295 (2^32 – 1) 个字符。
28.怎么进行分页数据的查询,如何判断是否有下一页?
1,分页指将数据表中的数据分段展示给用户。一般会用到以下参数
private int currPage;//当前页数
private int pageSize;//每页显示的记录数
private int totalCount;//总记录数
private int totalPage;//总页数
private List<T> lists;//每页的显示的数据
1)limit用法
select * from tablename limit #{start},#{size}
start是从哪里开始显示
size是每页显示多少条记录
2)总记录数totalCount
select count(1) from tablename
3)总页数
totalPage=totalCount/pageSize 向上取整
2,pageSize*currPage < totalCount 会有下一页,否则没有。
可以事先算出totalPage,只有小于totalPage才有下一页。
29.为什么不可以用Select * from table?
1,SELECT * 语句取出表中的所有字段,不论该字段的数据对调用的应用程序是否有用,这会对服务器资源造成浪费,甚至会对服务器的性能产生一定的影响。
2,如果表的结构在以后发生了改变,那么 SELECT * 语句可能会取到不正确的数据甚至是出错。
3,执行 SELECT * 语句时,SQL Server首先要查找出表中有哪些列,然后才能开始执行 SELECT * 语句,这在某些情况会产生性能问题。
4,使用 SELECT * 语句将不会使用到覆盖索引,不利于查询的性能优化。
5,在文档角度来看, SELECT * 语句没有列明将要取出哪些字段进行操作,所以也是不推荐的。
30.maven是什么,和Ant有什么区别?
1,Maven 是 Apache 开源组织奉献的一个开源项目。Maven 这个词可以翻译为“知识的积累”,也可以翻译为“专家”或“内行”。
Maven 的本质是一个项目管理工具,将项目开发和管理过程抽象成一个项目对象模型(POM)。开发人员只需做一些简单的配置,就可以批量完成项目的构建、报告和文档的生成工作。
Maven 是跨平台的,这意味着无论是在 Windows 上,还是在 Linux 或者 Mac 上,都可以使用同样的命令。
我们一直在不停地寻找避免重复的方法。设计的重复、编码的重复、文档的重复,当然还有构建的重复。Maven 最大化地消除了构建的重复,抽象了构建生命周期,并且为绝大部分的构建任务提供了已实现的插件,我们不再需要定义过程,甚至不需要再去实现这些过程中的一些任务
2,maven和ant的目的不同。下面只说明只说明这两个工具的等同组件之间的区别。
| Maven | Ant |
标准构建文件 | project.xml 和 maven.xml | build.xml |
特性处理顺序 | ${maven.home}/bin/driver.properties ${project.home}/project.properties ${project.home}/build.properties ${user.home}/build.properties 通过 -D 命令行选项定义的系统特性 最后一个定义起决定作用。 | 通过 -D 命令行选项定义的系统特性 由 任务装入的特性 第一个定义最先被处理。 |
构建规则 | 构建规则更为动态(类似于编程语言);它们是基于 Jelly 的可执行 XML。 | 构建规则或多或少是静态的,除非使用<script>任务 |
扩展语言 | 插件是用 Jelly(XML)编写的。 | 插件是用 Java 语言编写的。 |
构建规则可扩展性 | 通过定义 <preGoal> 和 <postGoal> 使构建 goal 可扩展。 | 构建规则不易扩展;可通过使用 <script> 任务模拟 <preGoal> 和 <postGoal> 所起的作用。 |
任务1小结:
任务一从设计表开始引入,引入了各种数据库管理工具,并且提到了Navicat。Navicat通过图形化管理,节约了很多时间和精力。选用Mysql数据库。
设计表的时候特别提醒了,ID(自增Long),create_at,update_at(所有的时间都用Long)。使用Navicat导入导出。通过任务,使用索引。
配置Java开发环境变量,复习JRE和JDK。复习配置Maven。通过clean,install,package,deploy,学习Maven 生命周期。查找Jar包,通过查看本地的.m2,如果不在,查看自己的设置。
使用数据库,通过JdbcTemplate和Mybatis分别完成数据库的操作。习惯中,JDBCTemplate的时候分离Interface和Impl;但是,使用Mybatis的时候,无论把它看作dao或者mapper,都不使用impl类。使用xml和注解分别配置Mybatis的操作。
使用Junit单元测试。main函数也按照任务要求做了测试。我的测试放在test的java下。使用Spring,使用xml文件和注解一起使用Spring。先设计测试用例,然后设计接口,之后设计Impl类,是一种自上而下的设计方式。
使用日志,本任务使用log4j日志。使用Debug模式,复习查看单步执行时的变量值。
使用远程服务器。完成部署数据库到远程DB,从本地直接连远程。一定要在本地调试好等问题。我用的是IntelliJ IDEA,设置打包。远程部署Maven,Mysql客户端。用Maven命令跑单元测试。
使用了try catch finally。对比建索引和不建索引的效率,是通过数据库里插入超过100万条数据完成的。
最后,将代码上传到git。这个项目是一个处理单个表的后端项目。
问题,困惑,疑难:
目前没有问题。通过Mybatis给出的getter错误,更好理解了Mybatis用的语句和Mysql的对应。
二,今天问题:
准备任务2报告
三,今天的收获:
复习
四,明天的计划:
任务2
评论