MYSQL对日期类型直接支持like。Oracleto_cahr() SqlServer cast() ,convert() 将日期类型先转换为字符串,然后在进行截取。
2、异构数据库
同一套程序同时支持多个类型的数据库。HQL不能消除不同数据库厂商的个性应用。大多数据库厂商都是基于SQL92、SQL99标准。
SQL常见差异:
| Oracle | SqlServer | MySql |
取记录数 | rownum | top | limit |
日期 | to_char、to_date | cast、convert | 之间当日期类型为字符串 |
字符串拼接 | || | + | concat |
个性函数 |
|
|
|
MYSQL中拼接字符串
SELECT CONCAT(sys_code_id,'-',NAME) FROMsys_code_b
3、异构数据库实现原理
1)设置一个全局变量,database=MYSQL5
2)在程序中,加if语句
If(database==”MYSQL5”){
sql = “select * from contract_c limit 100”
}else(database==”SQLSERVER2000”){
sql= “select top 100 * from contract_c”
}
最终能实现,程序直接修改数据库配置即可立即切换数据库。
4、怎样快速的实现,关键在于选择循环对象。
合同、货物、厂家、附件,在这里挑选一个循环次数最少,获取到数据最快的一个对象。
大数据测试。在日常记录少的情况下,程序员会忽略程序的性能问题。
利用已有数据,进行多次循环
Excel2003 2007
列:255 16384
行:65535 1048576
6、月统计,在企业中相当的典型。
例如:基层供电局每个月,每个季度,每年都要上报人事报表。
在职职工表,在职的职工数,离职的,退休,死亡
基层供电所上报到分局,分局汇总上报市局,市局汇总上报到省局,省局汇总上报到国网。
国家财政拨款,发工资。
年、季度、月、周、日统计。
对程序而言就是一个where条件的改变。
8、购销合同打印业务
打印API
1) 日期类型转中文日期格式
UtilFuns.formatDateTimeCN(UtilFuns.dateTimeFormat(contract.getSigningDate()))
2) 图片如何插入
POI插入图片时,给定起始单元格位置和结束单元格位置,它自动平铺。会带来图像失真。事先调整好单元格范围,高度和宽度。图片会压线,要设置一定的偏移量。
HSSFPatriarch patriarch =sheet.createDrawingPatriarch(); //addpicture
poiUtil.setPicture(wb, patriarch,rootPath+"make/xlsprint/logo.jpg", curRow, 2, curRow+4, 2);
3) 插入分页符,在何处插入,插入时怎么避免打印一个空白页
if(p>0){
sheet.setRowBreak(curRow++); //在第startRow行设置分页符
}
4) 插入一个线
poiUtil.setLine(wb, patriarch, curRow, 2,curRow, 8); //draw line
5) 给金额类型加前缀,
HSSFDataFormatformat = wb.createDataFormat();
returnformat.getFormat("\"¥\"#,###,##0.00"); //设置格式
#代表一位数值,如果数值不存在,不显示
0代表一位数值,如果数值不存在用0代替。
6) 公式,乘法、合计
nCell.setCellType(HSSFCell.CELL_TYPE_FORMULA);
nCell.setCellFormula("F"+String.valueOf(curRow)+"*H"+String.valueOf(curRow));
nCell.setCellFormula("SUM(I"+String.valueOf(curRow-4)+":I"+String.valueOf(curRow-1)+")");
7) 合并单元格
合同单元格后,除第一个单元格会根据设定的样式生效。后续单元格没有边框线。
当前POI3.0支持2003,打印到2013或者WPS,会显示不全。
POI升级版本不兼容。合并单元格,画线
region = new Region(curRow-1, (short)(1),curRow-1, (short)3); //纵向合并单元格
sheet.addMergedRegion(region);
写数据是操作合并前的第一个单元格
8) 指定输出到单元格的内容类型为数值
nCell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);
9) 审单人,等量空格替换
utilFuns.fixSpaceStr(contract.getCheckBy(),26)
业务逻辑控制
10) 同一个厂家的货物才能打印的同一页纸上。
11) 厂家跟着货物,循环货物才能得到对应的厂家,然后怎么写到现在的位置。
12) 厂家信息只用第一个货物的信息
13) 重要程度,循环拼接星星。
14) *将数据和业务分离。
9、读程过程
思路:
数据和业务分离,将每页的数据缓存起来,打印时,只需循环页数,获取每一页的数据,直接输出。
目的:写代码时,关注点少,将更多精力投入到一个地方。减少代码的复杂度。
实现:
怎样缓存数据?
字符串数组String[] ,不同页一款的两款的字段数不同。突然有一天,客户说你给我增加一个字段。
ArrayLIst,动态数组,遍历数据时,通过序号进行遍历。加字段,会影响后续顺序。访问时,只能按序号,调用时,不能明确知道调用的谁。
MAP,key+value。
每页数据缓存到一个MAP集合中,将一个页的MAP放在一个ArrayList中。