1. 从pl/sql查询字段类型为number并且长度大于16位的内容显示为科学计数法的计数方法,后经查找找到了如下解决办法:
1.1. 在toad中->view->option->data->display large number in scientific notation,不选择该选项即可在pl/sql developer中->tools->preferences->sql windows->number fields tochar,选中该选项即可。
1.2. 查看numw参数
sql>show numw
numwidth 10
修改此参数为需要位数,如:
set numw 19
之后查询此字段内容正常。
1.3 还可以直接通过to_char形式
select to_char(double1) from table
2. 关于在oracle中number超过16位的,java提取出来之后变成科学计数法的,可以用下面的解决办法
关于科学计数法,就是( 1200=1.2e3 )
NumberFormat ns = NumberFormat.getInstance();
ns.setGroupingUsed(false);
ns.format(xx);
3. 关于oracle 的number 在java提取之后,精度丢失问题
oracle number(16) 当number位数超过16之后,在java里面就不能用double来对应,应该用BigDecimal
精度存到oracle是不会丢失的,可以通过sqlplus查看!
4. 关于oracle插入中文问题
在pl/sql上直接insert中文到char,没问题,但是到了java上插入中文,就报出 仅能绑定要插入 LONG 列的 LONG 值
刚开始以为是java的编码到 oracle 的问题,
然后用select userenv('language') from dual;
然后得到zhs16gbk,这个没错啊,我到了java里面同样用了 new String(str1.getBytes("gbk"),"gbk");
问题还是解决不了
后来看了本地客户端是10.1,服务器是10.2,然后找了oracle 的jdbc下的ojdbc版本,我的是ojdbc14,服务器是ojdbc6,我换了一下,解决了问题!!
5. 关于Spring+hibernate 统计语句问题
String sql = "select sum(y.amount),count(*) from InsuredRolldtlTemp y where y.id.batchid='"+batchid+"'";
List list = getHibernateTemplate().find(sql);
return list;
List mxlist = dao.get();
Object[] object = (Object[]) mxlist.get(0);
double sum = (double)object[1];
double count = (double)object[1];
6. 关于log4j
Log4j.properties 配置文件
log4j.rootLogger=INFO,R,stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
# Pattern to output the caller's file name and line number.
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%C:%L) - %m%n
log4j.logger.ShareDblog=INFO,R4
log4j.appender.R4=org.apache.log4j.DailyRollingFileAppender
log4j.appender.R4.File=../exchglogs/shareDb.log
log4j.appender.R4.layout=org.apache.log4j.PatternLayout
log4j.appender.R4.layout.ConversionPattern=%m%n
Java 代码调用
private static Logger log = Logger.getLogger("ShareDblog");
log.info("success!!!!");
查看日志,在tomcat根目录下的 exchglogs目录下
7. oracle 分页
rownum 取记录数
String sql = "from YbMrqsData y where y.id.qsrq='"+qsrq+"' and rownum=1";
8.Java 编码
打印所以系统属性: System.getProperties().list(System.out);
设置系统属性: System.setProperty("file.encoding", "UTF-8");
System.setProperty("sun.jnu.encoding", "UTF-8");
关于 file.encoding 和 sun.jnu.encoding 的区别
sun.jnu.encoding 影响文件名的创建,而 file.encoding 则影响到文件内容。
所以说,在我们使用 Java 处理中文文件的时候,如果发现文件的中文内容没有乱码,而文件的中文名发生乱码,我们就应当多考虑一下 sun.jnu.encoding 和 file.encoding 的区别了。
在Eclipse 里面,在 class 文件右键属性,修改Text file encoding 编码,其实修改的就是 file.encoding 编码
测试编码:
String str = new String("测试".getBytes(),"UTF-8");
8. Linux 程序端口占用情况
今天发现服务器上Tomcat 8080端口起不来,老提示端口已经被占用。
使用命令:
ps -aux | grep tomcat
发现并没有8080端口的Tomcat进程。
使用命令:netstat –apn
发现8080端口被PID为9658的Java进程占用。
进一步使用命令:ps -aux | grep java,或者直接:ps -aux | grep pid 查看
就可以明确知道8080端口是被哪个程序占用了!然后判断是否使用KILL命令干掉!
方法二:直接使用 netstat -anp | grep portno
即:netstat –apn | grep 8080
9. Linux 下日志的分割,使用linux自带的 logrotate
10. Tomcat 的远程 debug
找到tomcat/bin/catalina.out 加上下面这一句
declare -x CATALINA_OPTS="-server -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=9999"
11. Spring quartz 定时任务
为什么有的时候一部署到tomcat定时任务就启动,有时候就不会??
假如设定的是每10分钟一次,现在的时间是15:10分,现在部署就会立即启动,定时任务参照的是系统时间
12. Hibernate中createSQLQuery 取值ClassCastException
Query query = sessions.createSQLQuery("select * from Diary");
List<Diary> list = query.list();
System.out.println(list.get(0).getLid());
取值会出现ClassCastException 强制转换错误.
正确写法
List<Diary> list = sessions.createSQLQuery("select * from Diary").addEntity(Diary.class).list();
System.out.println(list.get(0).getLid());
13. Spring 的 Quartz 定时任务,当Tomcat 有 start,stop,reload 操作时,整个Tomcat下的定时任务都会停止
这是因为定时任务所关联的JAR包都在Tomcat上面,当几个应用共用Tomcat里面的JAR包时候,Tomcat 一有相关操作,定时任务就会报出找不到方法的错误,然后就自动停止
解决办法: 定时任务把相关JAR包添加到自己的项目底下,不要共用JAR包
14. 奇怪的奇数判断问题
x % 2 == 1
这个只能用来判断正奇数,比如:1 3 5 7 9
要判断: -1 -3 -5
必须这样写: x &1 ==1 or x %2 != 1
15. if(list.size()>0&&list!=null) 假如 list=null ,list.size()就会直接报错,建议把if里面的判断条件呼唤位置,先判断是否为空,再判断长度
16. 文件传送问题,FTP
文件正在上送或者正在读取,其他程序是不能转移或者改名
17.关于换行符
Linux和Unix系统的换行是"\n",而Windows的换行并不是直接的"n",是"\r\n"。所以out.write("\n")只能得到一个黑框,因为Windows不认为这是个“换行”。 直接从记事本输入的话,Windows自动输入了"\r\n",所以从从文本文件中读出来的也是"\r\n",可以正常显示。
那么这是为什么呢?稍微学过正则表达式的朋友都知道:\r是回车符,而\n是换行符。Windows默认\n在文档中显示的是一个空格或者小黑框。所以,要先回车,再换行。
13是回车 \r 将光标移动到 当前行的前面(此时插入符的纵坐标没有改变)
10换行 \n 将光标移动到 下一行(此时插入符的横坐标没有改变)
回车的本质就是将插入符移动到屏幕最左边。
插入符就是咱们说的光标.
windows linux中的换行 是不一样的
linux System.getProperty("line.separator");
18. 关于hibernate加载实体类问题
由于数据库某张表没有设置主键,但是映射的实体类设置了主键
那张表有多条数据对应实体类的主键相同,但是某个属性不一样,在Hibernate查询记录时,由于主键相同,所以取了第1条,其他数据都一样,Hibernate直接从缓存区取数据
PS:解决办法,数据库设主键,或者把表多属性设置成主键,或者Hibernate通过sql语句查询的时候生成Dto.
19.Socket
ServerSocket.setSotimeout() // 服务端设超时,只能判断连接超时,就是特定时间内有没客户端连接进来
Socket.setsotimeout() //客户端设超时。判断读写超时,就是特定时间内客户端有没读写数据,没有就抛出读写超时异常
判断是否连接超时,连接异常
try {
socket.sendUrgentData(0xFF);
} catch (Exception ex) {
if (socket != null)
socket.close();
}
20.随机更新 数据库中N条记录
1. 随机取得表中任意N条记录的方法
select top N * from table_name order by newid()
2.随机更新记录
declare @cardid varchar(20)
select top 1 @cardid=cardid from ic_inline order by newid()
select @cardid
update ic_inline set settlmtdt='20121022' where cardid = @cardid
3;取随机数
select floor(rand()*N) ---生成的数是这样的:12.0
select cast( floor(rand()*N) as int) ---生成的数是这样的:12
21.关于HQL的select new 对象
select new com.hxsmart.sicard.core.webapp.model.card.SiInfoHzDto" +
"(n.id.interfaceid,n.region,n.insuredid,n.name,n.sex)");
属性不能为空,要不会抛出could not instantiate: com.hxsmart.sicard.core.webapp.model.card.SiInfoHzDto错误
22. Hibernate
save 方式保存,先更新,再保存,有重复对象就更新保存
insert 不能有重复对象
23.生成PDF的时候,要用 才能显示东西
24.关于数据库中存有datetime类型,比如 2012-10-10 12:34:56
直接select * from ic_text where time = '2012-10-10 12:34:56'
这是查不出结果的,必须如下
select * from ic_text where time >= '2012-10-10 00:00:00' and time <= '2012-10-10 23:59:59'
在java里面就这样:
String startdate = DateUtil.formatDateToString(date, "yyyy-MM-dd")+" 00:00:00";
String enddate = DateUtil.formatDateToString(date, "yyyy-MM-dd")+" 23:59:59";
hql.append("from InsuredRollbatch where proctm >='").append(startdate).append("' and proctm<='").append(enddate).append("'");
25. 关于Hibernate 采用内连接还是外连接问题
外连接影响的性能十分大,最好关掉外连接
Hibernate:
hibernate.cfg.xml
hibernate.max_fetch_depth = 0
JPA
@OneToOne(optional=false)
26.关于hibernate 打印 sql语句
<!--显示的sql语句格式化-->
<property name="hibernate.show_sql">true</property>
<!--使显示的sql语句-->
<property name="format_sql">true</property>
27. java Runtime.getRunTime.exec(String command)的使用
当要调用一个外部程序的时候,java提供了exec方法,具体用法是:Runtime.getRunTime.exec("cmd /C Start mailto: abc@xxx.com").其中cmd /c是调用cmd下的start命令,它相当于对一个文件双击。也可以用Runtime.getRunTime.exec("c:\\EXCEl.exe d:\\a.xls")来打开D盘下的excel文件.
28. Hibernate 无主键映射问题
数据库表中如果没有主键,那么HIBERNATE就不应该设置主键映射,就拿最基本的查询来说.如果你改成有主键表映射文件的形式,那么Table中的custid如果有相同值的话,你从Dao中查出来的数据.凡是custid相同的数据.都会显示同一条,这不是我们想要的结果.
用hibernate开发要注意数据库中的每张表都应该有一个主键的。
可以无主键的,无主键就是所有的列联合成为一个主键,映射后会多出一个Java文件是表名id.java文件,意思是封装过了的表存入id那个类中
29.Hibernate 映射问题
实体类对应表结构,字段数量可以小于等于表的字段,但是不能大于表中存在的字段
比如table1,里面有name,sex,id
那么实体类 table1.java 可以有name,sex映射,但是不能多出一个不存在的字段,比如address
30,Hibernate 保存
hibernate保存的时候,联合主键里面的字段可以为空
31.关于hibernate联合主键查询语句返回值为空的问题
在hibernate中,配置在组合主键中的字段,若只要有一个的值为null那么,hibernate会将整行对应的实体置为null。
如果表字段为空,映射到实体类,字符类型为=NULL,数值类型为=0
但是如果表的字段对应到实体类是联合主键,假如其中一个是NULL,比如说table.name 是空,那么映射到实体类打印的时候就会报错
32. 惠州交换的关于资金划拨,其中一张表木有主键的问题
zrpch number(12), /*注入批次号*/
grsxh NUMBER(12), /*人员编号 唯一索引,惠州变更,河源是aac001 N(20)*/
sfzh VARCHAR2(18), /*身份证号惠州变更,河源是aac002*/
zrzje number(12,2), /*注入总金额*/
zrdwje number(12,2), /*注入单位金额*/
zrgrje number(12,2), /*注入个人金额*/
jfny number(8), /*缴费年月*/
ssny number(8), /*所属年月*/
zrsj number(16), /*注入时间*/
xzlx VARCHAR2(3), /*险种类型 50综合基本医疗
xwxh VARCHAR2(20),/*未知 惠州新增*/
xtjgdm VARCHAR2(4)/*系统机构代码 惠州新增*/
表中没有主键,得知,hibernate 做实体映射,必须得有一个ID,或者一个联合主键,网上资料查明,假如数据库表中没有主键,可以通过HIBERNATE把所有属性
设置为联合主键,但是这样会出现问题,联合主键其中一个属性为空,那么这个对象就为空,不可取,所以办法就是不要实体映射,直接弄一个表相对应的JAVA BEAN
DAO层这样写:
String sql = "select * from SYSDBA.YB_GRZHZR_DATA_GFH y where y.zrpch="+batchid+"";
List dtlList = getSession().createSQLQuery(sql).list();
try {
List<YbGrzhzrData> ybList = new ArrayList<YbGrzhzrData>();
YbGrzhzrData yb = null;
for(int i=0;i<dtlList.size();i++){
yb = new YbGrzhzrData();
Object[] ob = (Object[]) dtlList.get(i);
yb.setZrpch((BigDecimal)ob[0]);//注入批次号
yb.setGrsxh((BigDecimal)ob[1]); //个人顺序号
yb.setSfzh((String)ob[2]);//身份证
yb.setZrzje((BigDecimal)ob[3]); //注入总金额
yb.setZrdwje((BigDecimal)ob[4]); //注入单位金额
yb.setZrgrje((BigDecimal)ob[5]); //注入个人金额
yb.setJfny((BigDecimal)ob[6]);//缴费年月
yb.setSsny((BigDecimal)ob[7]);//所属年月
yb.setZrsj((BigDecimal)ob[8]);//注入时间
yb.setXzlx((String)ob[9]);//险种类型
ybList.add(yb);
}
return ybList;
} catch (Exception e) {
System.out.println("获得划拨明细记录出错,转换异常:"+e.getMessage());
return null;
}
}
33. 如何做权限控制
1. 要有用户,角色,还有权限表
为角色赋予 管理员,普通人员等,每个人都有不同的权限,然后再把用户赋予
34. Sql 赋值问题
declare @a int
select @a = 1,
select @a
这里会打印出控制,原因是第2行和第3行挤在一起写,第二次取的变量还没有初始化,正确写法如下
declare @a int
select @a = 1
select @a
35. 关于socket的收发形式
遇到社保局发送查询信息,半天没反应,原始是
如果SocketA接受的方式是按行形式,那么SocketB发送给SocketA的时候,一定要在末尾加换行符号
最标准的收发形式应该在报文前加长度,这样收报文的时候截取前面的长度,然后再截取内容
如果按照行方式,在内容里面不小心加了一个换行,那就出错了!~
36. 如果hql 用 select new的形式
那么select new test
这个test如果不是实体类,是Pojo类,那就要加包名,select new cn.dxy.test()
而且这个test要有无参构造函数,int要变成integer,要序列化
37. 在sybase15.7上面有个漏洞,每次建库之后赋予DBO权限,数据库就会重建,解决办法如下:
1 设置可以更改系统表
sp_configure 'allow updates to system tables',1
2 把master里面的系统表 sysdatabases 里面的属性 durability 改成1,注意
38. SYBASE 数据库某个字段是vchar 60宽度, ORACLE也是VCHAR2 60宽度
但是把SYBAES移动ORACLE报错 当前值66,最大值60
经发现,ORACLE的字符集是ALU32UTF8,是UTF8字符集,一个中文占用3个字节,最大只能存20个中文
解决办法: 赋值的时候,把超出20个中文的截出
39. 数据库某个字段是 char类型,比如说 name char() ; name="12345"
但是在hibernate中用 createSqlQuery查询的时候,返回的是"1",只返回前面的,解决办法,增加 addScaler
String hql = "select trandt from ic_inline as line where line.tradetype !='0701'";
List<String> dl = getSession().createSQLQuery(hql).addScalar("trandt",Hibernate.STRING).list();
40. Hibernate getSession一定要关闭,
而且不能这样关: getSession.close();
正确关闭方法: 1. Session session = getSession(); session.close();
2. releaseSession(session)