近排工作的技术经验总结


数据库部分

假设有如下table:

id name point point2 mtime
1 AA 50 52 2019-6-28 10:10:10
2 BB 80 60 2019-6-27 10:10:17

对应SQL:

CREATE TABLE `tab1` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(16) DEFAULT NULL,
  `point` int(11) NOT NULL DEFAULT '0',
  `point2` int(11) NOT NULL DEFAULT '0',
  `mtime` datetime NOT NULL ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
)

1. 在结果集里比较两个字段返回较大的

初次实现多数人会想到max()函数,但要注意max是聚合函数,要配合group by来使用; 现在我只想比较point和point2的大小; 此时应该使用greatest/least。

SELECT `name`,GREATEST(`point`,`point2`) FROM tab1;

结论
greatest(字段1,字段2,..,字段n) 取最大值
least(字段1,字段2,…,字段n) 取最小值
注意
当greatest里参数中只要有一个是null,则返回null, least也是; 如果想避免返回null则可以使用if语句规避。

2. 从select结果中创建临时表

在存储过程中创建临时表,最常用是create temporary table tmp_table ( f1 varchar(5), f2 int ) 然之后insert into tmp_tab select x,y from tab1这种形式; 其实可以整合到一个语句完成。

create temporary table tmp_table select x,y from tab1

3. 存储过程里通过名字(字符串)去调用别的存储过程

直接提供示例sql

DELIMITER $$
USE `dbName`$$

DROP PROCEDURE IF EXISTS `sp1`$$

CREATE DEFINER=`root`@`%` PROCEDURE `sp1`(
    procName VARCHAR(64), 
    lastTime DATETIME,
    idBeg LONG,
    idEnd LONG,
    cityid VARCHAR(16)
)
BEGIN
    DECLARE   sql_stmt   VARCHAR(500);
     SET sql_stmt=CONCAT("call ", procName, "('" , lastTime, "',", idBeg, ",", idEnd, ",'", cityid, "'", ")");
     SET  @sqlstmt= sql_stmt;
     PREPARE sqlstr1 FROM @sqlstmt;
     EXECUTE sqlstr1;
     DEALLOCATE PREPARE sqlstr1;
END$$
DELIMITER ;

4. 存储过程返回时间格式到java

正常来说数据库的字段类型是datetime,就可以对应到java里的Date类型; 但是当select返回的时间是经过处理的就要注意,返回可能会变成字符串。 譬如SELECTname,GREATEST(mtime,'0') FROM tab1 这时候java程序用Date变量去接收有可能出错; 可以用过下面示例解决

## 下面语句要在存储过程中才能用
DECLARE minDatetime DATETIME DEFAULT 0;
SELECT `name`,GREATEST(mtime,minDatetime) FROM tab1;

FTP

开发过程遇到FTPClient MalformedServerReplyException: Truncated server reply: ‘220 ‘

经查error code,220是正常码;
本人用的ftp客户端是org.apache.commons.net.ftp.FTPClient, 解决办法是
登录前调用一次ftpClient.setStrictReplyParsing(false);
理由是对于不是ftps协议的明文ftp,可能认为不安全,这时候setStrictReplyParsing(false)不使用严格响应规则,就不会发生异常了。

本人简单封装的ftp客户端在另一文章发出,有需要的朋友可参考。

/latefirstcmt/18