• 回想“流与文件”章节,如何将一组对象存储到文件中?主要步骤是什么。

1.首先要将对象序列化,需要对象实现序列化接口,然后通过java的ObjectOutputStream的writeObject()方法将对象序列化的数据写到指定的文件中,再使用java 的 ObjectInputStream的readObject()方法来进行读取序列化后的文件

public class Person implements Serializable {
}

2. 主要步骤就是,使用Java集合架构储存数据,再使用流将数据存储到文件中

  • 关系数据库中使用表存储数据。查询资料回答:表的设计应该遵循什么基本规范?如果要将Student对象(学号、姓名、年龄、分数、学院)存入数据库,要怎么设计表?设计几个表?

1.命名规范

数据库表名、字段名、索引名等都需要命名规范,可读性高(一般要求用英文),让别人一看命名,就知道这个字段表示什么意思。

account_no,account_number
复制代码
  • 表名、字段名必须使用小写字母或者数字,禁止使用数字开头,禁止使用拼音,并且一般不使用英文缩写。
  • 主键索引名为pk_字段名;唯一索引名为uk_字段名;普通索引名则为idx_字段名

2.选择合适的字段类型

设计表时,我们需要选择合适的字段类型,比如:

  • 尽可能选择存储空间小的字段类型,就好像数字类型的,从tinyint、smallint、int、bigint从左往右开始选择
  • 小数类型如金额,则选择 decimal,禁止使用 float 和 double
  • 如果存储的字符串长度几乎相等,使用 char 定长字符串类型。
  • varchar是可变长字符串,不预先分配存储空间,长度不要超过5000
  • 如果存储的值太大,建议字段类型修改为text,同时抽出单独一张表,用主键与之对应。
  • 同一表中,所有varchar字段的长度加起来,不能大于65535. 如果有这样的需求,请使用TEXT/LONGTEXT 类型。

3. 主键设计要合理

主键设计的话,最好不要与业务逻辑有所关联。有些业务上的字段,比如身份证,虽然是唯一的,一些开发者喜欢用它来做主键,但是不是很建议哈。主键最好是毫无意义的一串独立不重复的数字,比如UUID,又或者Auto_increment自增的主键,或者是雪花算法生成的主键等等;

4. 选择合适的字段长度

其实在mysql中,varcharchar类型表示字符长度,而其他类型表示的长度都表示字节长度。比如char(10)表示字符长度是10,而bigint(4)表示显示长度是4个字节,但是因为bigint实际长度是8个字节,所以bigint(4)的实际长度就是8个字节。

我们在设计表的时候,需要充分考虑一个字段的长度

5,优先考虑逻辑删除,而不是物理删除

  • 物理删除:把数据从硬盘中删除,可释放存储空间
  • 逻辑删除:给数据添加一个字段,比如is_deleted,以标记该数据已经逻辑删除。
  • 为什么不推荐使用物理删除,因为恢复数据很困难
  • 物理删除会使自增主键不再连续
  • 核心业务表 的数据不建议做物理删除,只适合做状态变更。

6. 每个表都需要添加这几个通用字段如主键、create_time、modifed_time等

表必备一般来说,或具备这几个字段:

  • id: 主键,一个表必须得有主键,必须
  • create_time: 创建时间,必须
  • modifed_time: 修改时间,必须,更新记录时,需要更新它
  • version : 数据记录的版本号,用于乐观锁,非必须
  • remark :数据记录备注,非必须
  • modified_by :修改人,非必须
  • creator :创建人,非必须

7. 尽可能使用not null定义字段

如果没有特殊的理由, 一般都建议将字段定义为 NOT NULL 。

为什么呢?

  • 首先, NOT NULL 可以防止出现空指针问题。
  • 其次,NULL值存储也需要额外的空间的,它也会导致比较运算更为复杂,使优化器难以优化SQL。
  • NULL值有可能会导致索引失效
  • 如果将字段默认设置成一个空字符串或常量值并没有什么不同,且都不会影响到应用逻辑, 那就可以将这个字段设置为NOT NULL

8. 设计表时,评估哪些字段需要加索引

首先,评估你的表数据量。如果你的表数据量只有一百几十行,就没有必要加索引。否则设计表的时候,如果有查询条件的字段,一般就需要建立索引。但是索引也不能滥用:

  • 索引也不要建得太多,一般单表索引个数不要超过5个。因为创建过多的索引,会降低写得速度。
  • 区分度不高的字段,不能加索引,如性别等
  • 索引创建完后,还是要注意避免索引失效的情况,如使用mysql的内置函数,会导致索引失效的
  • 索引过多的话,可以通过联合索引的话方式来优化。然后的话,索引还有一些规则,如覆盖索引,最左匹配原则等等。

9. 不需要严格遵守 3NF,通过业务字段冗余来减少表关联

数据库三范式(3NF

  • 第一范式:对属性的原子性,要求属性具有原子性,不可再分解;
  • 第二范式:对记录的唯一性,要求记录有唯一标识,即实体的唯一性,即不存在部分依赖;
  • 第三方式:对字段的冗余性,要求任何字段不能由其他字段派生出来,它要求字段没有冗余,即不存在传递依赖;

10. 避免使用MySQL保留字

如果库名、表名、字段名等属性含有保留字时,SQL语句必须用反引号来引用属性名称,这将使得SQL语句书写、SHELL脚本中变量的转义等变得非常复杂。

因此,我们一般避免使用MySQL保留字,如select、interval、desc等等

如果要设计将Student对象(学号、姓名、年龄、分数、学院)存入数据库,需要设计两个表

第一个表为 学生信息表:包括学号,姓名,年龄,学院
第二个表为 学生成绩表:包括学号,姓名,分数

  • JDBC编程的一般步骤是哪些?

第一步:注册驱动(告诉Java程序,即将要连接那个品牌的数据库)
第二步:获取连接(表示JVM的进程和数据库进程之间的通道打开了,这属于进程之间的通信,重量级的,使用完后一定要关闭)
第三步:获取数据库操作对象(专门执行sql语句的对象)
第四步:执行SQL语句(DQL DML ...)
第五步:处理查询结果集(只有第四步执行select语句时,才会执行第五步)
第六步:释放资源(使用完资源后一定要关闭资源。Java和数据库属于进程间通信,开启后一定要关闭)

package com.xzh.jdbc;import javax.xml.transform.Result;
import java.sql.*;public class Test {public static void main(String[] args) {Connection conn = null;Statement stmt = null;ResultSet res = null;try {// 第一步:注册驱动(告诉Java程序,即将要连接那个品牌的数据库)Class.forName("com.mysql.jdbc.Driver");// 第二步:获取连接(表示JVM的进程和数据库进程之间的通道打开了,这属于进程之间的通信,重量级的,使用完后一定要关闭)String url = "jdbc:mysql://localhost:3306/xzh";String user = "root";String password = "333";conn = DriverManager.getConnection(url, user, password);// 第三步:获取数据库操作对象(专门执行sql语句的对象)stmt = conn.createStatement();// 第四步:执行SQL语句(DQL DML ...)String sql = "select empno as a,ename from emp";res = stmt.executeQuery(sql);// 专门执行DQL语句// 专门执行DML语句的(insert delete update)// 返回值是“影响数据库中的记录条数”//int c =stmt.executeUpdate(sql);// 第五步:处理查询结果集(只有第四步执行select语句时,才会执行第五步)while (res.next()) {String empno = res.getString("a");String ename = res.getString("ename");System.out.println(empno + "," + ename);}} catch (SQLException e) {e.printStackTrace();}catch (ClassNotFoundException e){e.printStackTrace();}finally {// 第六步:释放资源(使用完资源后一定要关闭资源。Java和数据库属于进程间通信,开启后一定要关闭)if (stmt != null) {try {stmt.close();} catch (SQLException e) {e.printStackTrace();}}if (conn != null) {try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}}
}
  • Statement与PreparedStatement有何区别?

1.PreparedStatement是预编译的,对于批量处理可以大大提高效率. 也叫JDBC存储过程
2.使用 Statement 对象。在对数据库只执行一次性存取的时侯,用 Statement 对象进行处理。PreparedStatement 对象的开销比Statement大,对于一次性操作并不会带来额外的好处。
3.statement每次执行sql语句,相关数据库都要执行sql语句的编译,preparedstatement是预编译得,   preparedstatement支持批处理

  • 怎么将数据库中表的数据组装成一个对象?

可以先创建一个对象如Student,生成setter/getter等方法获取相应属性值;创建一个列表,循环把新生成对象赋值并加入列表

第14周 预习实验与作业:Java数据库编程相关推荐

  1. java 密钥工厂 desede_20145212 实验五《Java网络编程》

    20145212 实验五<Java网络编程> 一.实验内容1.运行下载的TCP代码,结对进行,一人服务器,一人客户端: 2.利用加解密代码包,编译运行代码,一人加密,一人解密: 3.集成代 ...

  2. java基础类库——java数据库编程,JDBC连接(原生数据库连接)(十)

    java数据库编程,JDBC连接(原生数据库连接) JDBC严格来讲不属于一门技术,它属于一种服务.所有的操作流程都是固定的.JDBC是java提供的数据库操作的一个标准(它就是一组相关的标准接口), ...

  3. java数据库编程——元数据(metadata)+web 与企业应用中的连接管理

    [0]README 1) 本文部分文字描述转自 core java volume 2 , 测试源代码均为原创, 旨在理解 java数据库编程--元数据(metadata)+web 与企业应用中的连接管 ...

  4. java数据库编程——事务

    [0]README 1) 本文部分文字描述转自 core java volume 2 , 测试源代码均为原创, 旨在理解 java数据库编程--事务 的基础知识 : 2)for database co ...

  5. java数据库编程——可滚动和可更新的结果集

    [0]README 1) 本文部分文字描述转自 core java volume 2 , 测试源代码均为原创, 旨在理解 java数据库编程--可滚动和可更新的结果集 的基础知识 : 2)for da ...

  6. java数据库编程——执行查询操作(二)

    [0]README 1) 本文部分文字描述和source code 均转自 core java volume 2 , 旨在理解 java数据库编程--执行查询操作(二) 的基础知识 : 2) 本文和 ...

  7. java数据库编程——执行查询操作(一)

    [0]README 1) 本文部分文字描述和source code 均转自 core java volume 2 , 旨在理解 java数据库编程--执行查询操作 的基础知识 : 2) 本文和 jav ...

  8. java数据库编程——执行SQL 语句

    [0]README 1) 本文文字描述+source code 均转自 core java volume 2 , 旨在理解 java数据库编程--执行SQL 语句 的基础知识 : 2)for sour ...

  9. java数据库编程中查询结果的表格式输出_Java数据库编程中查询结果的表格式输出...

    派性劳拉德高顺价老僧水牌电烫,湟中胜利财大不恤名花抹胸,果儿四坝风冈普基挡车关掉临池,脑死愀然草荐木笼电能.公话理念湮没不讳公使难看! 摄氏欠安宣和拉道开封关掉明洁名贵.不名滑膜俊美盲女长虹火主乐律超 ...

最新文章

  1. 函数或变量 rtenslearn_c 无法识别_Stata:过度识别检验一文读懂
  2. Python主要智能优化算法库汇总
  3. 121. Leetcode 5. 最长回文子串 (动态规划-子序列问题)
  4. MS17-010漏洞复现
  5. EMC测试中骚扰源头的寻找
  6. win7 oracle 冷恢复
  7. 循道丨全球最大资管公司贝莱德的崛起
  8. 51单片机彩灯控制器c语言代码,【原创】第九届蓝桥杯单片机:彩灯控制器源程序和题目...
  9. 免费下论文的网站有哪些?
  10. 求方差FPGA的实现方法
  11. python 解压文件 重名_Python批量重命名压缩文件
  12. (predicted == labels).sum().item()作用
  13. 【Golang开发面经】字节跳动(三轮技术面)
  14. [Python]使用QRCode生成彩色二维码
  15. 中国银联正式开展非标商户管理试点工作 将严打“大商户模式”
  16. Keras,今天7岁啦
  17. Sklearn实现非线性回归
  18. Java压缩字符串的方法收集
  19. 说明T1线路的传输速率是1.544Mbps
  20. RGB与HSV等的转换

热门文章

  1. Android百度语音识别/语音助手
  2. nlp技能,jieba分词
  3. 解决极值中的神奇设k法_神奇宝贝Go拥有对您的Google帐户的完全访问权限。 这是解决方法[更新]...
  4. 《微SaaS创富周刊》第5期:基于A/B测试的20+创富项目盘点
  5. Day 12 C. Interesting Story
  6. PDF加密软件保护新姿势
  7. 计算机应用基础ascii码运算,自考计算机应用基础真题及答案
  8. QQ红包终于支持微信支付了
  9. python画大象_Python Day21
  10. 前端开发中提到的“脚手架”是指什么?