发表于: 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.CreateAtUpdateAt的意义分别是创建时间和修改时间,这两个时间应该在什么情况下赋值?是否应该开放给外部调用的接口?

2个字段如果写成“CreatedAt”和“UpdatedAt”更符合要求。

1,“CreatedAt”是在数据新建时获取的,以后这个字段不会再变化。“UpdatedAt”是在数据进行修改操作时获取的,随着每一次的修改而做出相应的变化。

2,分2种情况。

1)如果是查询接口调用,是可以的。

2)如果是修改或者删除等其他接口,是不可以开放的。这两个字段涉及到对数据库操作的记录,只能由代码来自动控制,而不能把权限放开。

 

26.修真类型应该是直接存储Varchar,还是应该存储int? 

int,这个项目的表其实不只有一张的设计比较好。修真类型并不多,同时需要维护的映射表也不会经常变动。修真类型用外键更好。虽然varchar可以用,但是可能会大量重复,而且不利于之后更新维护。

 

27.varchar类型的长度怎么确定?有什么样的原则,和TextLongText的区别是什么? 

1VARCHAR是可以保存长度可变的字符串。如:一个用户名字段不能确定长度,只知道不超过10个字符,就可以选择varchar类型。根据需求与实际情况来考虑,不能千篇一律。 比如:用户名,谁的名字会有255/3=85个字符?所以也没必要那么长,但又不能定义成CHAR(),所以给个够用的长度varchar(20)或更少varchar(10)即可,考虑少数民族可以长点。 varchar的长度,最好是在够用(需要适当预测未来需求)且方便管理的前提下尽可能短。

2它们都是MySQL数据库的字符串类型,用来存储字符数据。区别是存储的数据长度、大小不一样。我们可以根据需求选择使用哪种字符串类型。

mysql数据库的varcharr类型在4.1以下版本中最大长度限制为255字节

mysql5.0以上的版本中varchar数据类型的长度支持到了65535字节。

TextLongText 也是长度可变的类型

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;//每页的显示的数据

1limit用法

select * from tablename limit #{start},#{size}

start是从哪里开始显示

size是每页显示多少条记录

2总记录数totalCount

select  count(1) from tablename

3总页数

totalPage=totalCount/pageSize 向上取整

2pageSize*currPage < totalCount 会有下一页,否则没有。

可以事先算出totalPage只有小于totalPage才有下一页。

 

29.为什么不可以用Select * from table? 

1SELECT  * 语句取出表中的所有字段,不论该字段的数据对调用的应用程序是否有用,这会对服务器资源造成浪费,甚至会对服务器的性能产生一定的影响。

2如果表的结构在以后发生了改变,那么 SELECT  * 语句可能会取到不正确的数据甚至是出错。

3执行 SELECT  * 语句时,SQL Server首先要查找出表中有哪些列,然后才能开始执行 SELECT  * 语句,这在某些情况会产生性能问题。

4使用 SELECT  * 语句将不会使用到覆盖索引,不利于查询的性能优化。

5在文档角度来看, SELECT  * 语句没有列明将要取出哪些字段进行操作,所以也是不推荐的。

 

30.maven是什么,和Ant有什么区别?

1Maven Apache 开源组织奉献的一个开源项目。Maven 这个词可以翻译为“知识的积累”,也可以翻译为“专家”或“内行”。

Maven 的本质是一个项目管理工具,将项目开发和管理过程抽象成一个项目对象模型(POM)。开发人员只需做一些简单的配置,就可以批量完成项目的构建、报告和文档的生成工作。

Maven 是跨平台的,这意味着无论是在 Windows 上,还是在 Linux 或者 Mac 上,都可以使用同样的命令。

我们一直在不停地寻找避免重复的方法。设计的重复、编码的重复、文档的重复,当然还有构建的重复。Maven 最大化地消除了构建的重复,抽象了构建生命周期,并且为绝大部分的构建任务提供了已实现的插件,我们不再需要定义过程,甚至不需要再去实现这些过程中的一些任务

2mavenant的目的不同。下面只说明只说明这两个工具的等同组件之间的区别。


  

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>任务

扩展语言
  

插件是用 JellyXML)编写的。

插件是用 Java 语言编写的。

构建规则可扩展性

通过定义 <preGoal> <postGoal> 使构建 goal 可扩展。

构建规则不易扩展;可通过使用 <script> 任务模拟 <preGoal> <postGoal> 所起的作用。

 

任务1小结

任务一从设计表开始引入,引入了各种数据库管理工具,并且提到了NavicatNavicat通过图形化管理,节约了很多时间和精力。选用Mysql数据库。

 

设计表的时候特别提醒了,ID(自增Long),create_at,update_at(所有的时间都用Long)。使用Navicat导入导出。通过任务,使用索引。

 

配置Java开发环境变量,复习JREJDK。复习配置Maven。通过clean,install,package,deploy,学习Maven 生命周期。查找Jar包,通过查看本地的.m2,如果不在,查看自己的设置。

 

使用数据库,通过JdbcTemplateMybatis分别完成数据库的操作。习惯中,JDBCTemplate的时候分离InterfaceImpl;但是,使用Mybatis的时候,无论把它看作dao或者mapper,都不使用impl类。使用xml和注解分别配置Mybatis的操作。

 

使用Junit单元测试。main函数也按照任务要求做了测试。我的测试放在testjava下。使用Spring,使用xml文件和注解一起使用Spring。先设计测试用例,然后设计接口,之后设计Impl类,是一种自上而下的设计方式。

 

使用日志,本任务使用log4j日志。使用Debug模式,复习查看单步执行时的变量值。

 

使用远程服务器。完成部署数据库到远程DB,从本地直接连远程。一定要在本地调试好等问题。我用的是IntelliJ IDEA,设置打包。远程部署MavenMysql客户端。用Maven命令跑单元测试。

 

使用了try catch finally。对比建索引和不建索引的效率,是通过数据库里插入超过100万条数据完成的。

 

最后,将代码上传到git。这个项目是一个处理单个表的后端项目。

 

问题,困惑,疑难:

目前没有问题。通过Mybatis给出的getter错误,更好理解了Mybatis用的语句和Mysql的对应。



二,今天问题:

准备任务2报告


三,今天的收获:

复习


四,明天的计划:

任务2



返回列表 返回列表
评论

    分享到