java 开发遇到的坑

灰太狼 2022-06-14 02:54 582阅读 0赞

一、数据库问题

1、MySQL max_allowed_packet设置及问题

1、mysql根据配置文件会限制server接受的数据包大小。
有时候大的插入和更新会被max_allowed_packet 参数限制掉,导致失败。

查看目前配置
show VARIABLES like ‘%max_allowed_packet%’;

设置配置

方法1
可以编辑my.cnf来修改(windows下my.ini),在[mysqld]段或者mysql的server配置段进行修改。
max_allowed_packet = 20M

方法2

set global max_allowed_packet = 2*1024*1024*10

说明:方法2的设置如果mysql服务重启,则会还原到初始状态

设置完毕后当前链接不会升效,只有新的链接才会升效

数据库所在服务器内存不够用,mysql也会重置max_allowed_packet

2、group_concat函数

1、用了group_concat后,select里如果使用了limit是不起作用的

2、用group_concat连接字段的时候是有长度限制的,默认1024

修改默认字符大小

1).在MySQL配置文件中加上

group_concat_max_len = 102400 #你要的最大长度

2).可以简单一点,执行语句,可以设置作用范围

SET GLOBAL group_concat_max_len=102400;

SET SESSION group_concat_max_len=102400;

3、系统默认的分隔符是逗号

1)修改默认的分隔符

select group_concat(f_a separator ‘_‘) from t_one group by f_b;

separator 是一个关键字,后面跟着要进行分隔的字符

3、mysql 遇到utf8mb4插入异常

1、mysql 支持的 utf8 编码最大字符长度为 3 字节,三个字节的 UTF-8 最大能编码的 Unicode 字符是 0xffff,Emoji 表情(Emoji 是一种特殊的 Unicode 编码,常见于 iOS 和 Android 手机上),和很多不常用的汉字,常常为四个字节,这时就需要utf8的扩展编码utf8mb4,utf8 编码最大字符长度为 4 字节

1)–修改数据库字符集
ALTER DATABASE test CHARACTER SET = utf8mb4;
2)–修改表字符集
alter table test convert to character set utf8mb4;
3)–修改字符字符集
ALTER TABLE test CHANGE COLUMN name name varchar(12) CHARACTER SET utf8mb4;

4、多表更新

1)

update table A

left join table B

on A.id = B.aId

Set B.updateTime = ‘2017-05-31 12”12”12’,

A.updateTime = ‘2017-05-31 12”12”12’

Where A.id =1

2)

update table A,table B

set B.updateTime = ‘2017-05-31 12”12”12’,

A.updateTime = ‘2017-05-31 12”12”12’

where A.id = B.aId and A.id =1

5、多表删除

1)

delete A,B from A

left join B ON A.id=B.AId

where a.id=1

2)

delete A, B from A, B

where A.id=B.aId and a.id=1

注意此处的delete A, B from 中的A, B 不能是别名

6、中文按字母排序

1、如果存储姓名的字段采用的是 utf8字符集,需要在排序的时候对字段进行转码排序;

select name from stu_user

order by convert(name using gbk) asc;

7、状态字段设计

1、有些标识状态的字段,在数据库设计的时候进入加工能减少代码处理

如上表:请假状态(1未审批,2同意,4销假,3驳回)

有一个int 类型的标识字段,也有一个String的描述字段,用以减少页面的展示判断

2、

每个二维码为从获取30天失效,

后台要统计出失效与未失效的二维码,

我们在获取时将效时间插入数据库,统计时传入日期与失效日期比较,统计出列表

8、数据查询

1、关联查询

1)

select * from table A

left join table B on A.id=b.Aid and B.type=1

where a.createTime=’2017-05-31’

2)

select * from table A

left join table B on A.id=b.Aid

where a.createTime=’2017-05-31’ and B.type=1

2、where与having的区别

1、where对分组前的属性进行筛选

2、having对分组后的每个组的整体属性进行筛选,用聚合函数体现

使用说明,在条件允许的情况下尽量使用where

3、left join 与right join 、inner join的区别

1、left join 以左表数据为基准,right join以右表数据为期准,inner以两表共同存在数据为基准

2、使用原则:

1)在条件允许的情况 优先使用 inner join

2)在条件允许的情况下,优先使用表数据少的为基表

4、group by 与 with rollup

select * from teacher_askleave_attendance

group by schoolId with rollup

1、group by 按件件分组

2、With rollup 表明是否对分类聚合后的结果进行再汇总

9、数据库引擎

MyISAM是MySQL的默认存储引擎,基于传统的ISAM类型,支持全文搜索,但不是事务安全的,而且不支持外键。

InnoDB是事务型引擎,支持回滚、崩溃恢复能力、多版本并发控制、ACID事务,支持行级锁定

10、外键约束

  1. InnoDB支持5种方式,分列如下

    cascade方式 在父表上update/delete记录时,同步update/delete掉子表的匹配记录

set null方式 在父表上update/delete记录时,将子表上匹配记录的列设为null 要注意子表的外键列不能为not null On delete set null

No action方式 如果子表中有匹配的记录,则不允许对父表对应候选键进行update/delete操作

Restrict方式 同no action,都是立即检查外键约束

  1. 11、索引

1、普通索引

这是最基本的索引,它没有任何限制

CREATE INDEX indexName ON mytable(username(length));

二、唯一索引

它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一

CREATE UNIQUE INDEX indexName ON mytable(username(length))

-- 修改表结构

ALTER mytable ADD UNIQUE [indexName] ON (username(length))

-- 创建表的时候直接指定

CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, UNIQUE [indexName] (username(length)) );

三、主键索引

它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引

CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, PRIMARY KEY(ID) );

四、组合索引

为了形象地对比单列索引和组合索引,为表添加多个字段:

CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, city VARCHAR(50) NOT NULL, age INT NOT NULL );

12、数据库大小写敏感问题

数据库和表名在 Windows 中是大小写不敏感的,而在大多数类型的 Unix 系统中是大小写敏感的

13、数据库定时器

二、开发过程中的问题

1、StringEscapeUtils类的转义与反转义方法

String sql=”1’ or ‘1’=’1”;

System.out.println(“防SQL注入:”+StringEscapeUtils.escapeSql(sql)); //防SQL注入

  1. System.out.println("转义HTML,注意汉字:"+StringEscapeUtils.escapeHtml("<font>chen磊 xing</font>")); //转义HTML,注意汉字
  2. System.out.println("反转义HTML:"+StringEscapeUtils.unescapeHtml("<font>chen磊 xing</font>")); //反转义HTML
  3. System.out.println("转成Unicode编码:"+StringEscapeUtils.escapeJava("陈磊兴")); //转义成Unicode编码
  4. System.out.println("转义XML:"+StringEscapeUtils.escapeXml("<name>陈磊兴</name>")); //转义xml
  5. System.out.println("反转义XML:"+StringEscapeUtils.unescapeXml("<name>陈磊兴</name>")); //转义xml

2、汉字及json字符串传输过程中的转义及乱码问题

1)

2)

有些符号在URL中是不能直接传递的

3、腾讯云文件(腾讯云问题)

腾讯云文件为0KB的时候腾讯云返回的url不能访问,必须做验证为0KB的不允许上传

4、数据库存json格式数据

1、数据库存json数据的时候 json数据为双引号,如果html也用双引号会产生html 截断问题

5、上传附件的文件名称问题

腾讯云的文件名上传有限制及特殊符号易转义,对腾讯云的文件名上传需要条件验证

6、浏览器的编码解析问题

做传统的excel导出,然后想在浏览器中,让用户选择另存为,保存用户下载的xls文件,这个时候,可能的是在ie下出现乱码(ie,9,10,11)

7、html标签的嵌套规则

三、设计优化

1、代码封装

1、相同的业务处理提取成方法

2、数据库封装

1、相同的数据提交出来

如请假的图片附件表,可以提取到请假记录表中存json

3、模块封装

1、后台的类型设置可以用一个type区分提取出来

如,荣誉的类型,证书的类型

2、各种分组设置可以用一个type区分提取出来

如,检查组设置

发表评论

表情:
评论列表 (有 0 条评论,582人围观)

还没有评论,来说两句吧...

相关阅读

    相关 手机H5开发遇到

    手机h5与原生混合的app,出现了一些奇葩的事情,在这里与大家分享一下解决方案。 问题1:手机不支持:active伪类,这个问题刚开始用的是andriod测试过没有问题,后来