1.2. 查看numw参数
sql>show numw
numwidth 10
修改此参数为需要位数,如:
set numw 19
之后查询此字段内容正常。
1.3 还可以直接通过to_char形式
select to_char(double1) from table
关于科学计数法,就是( 1200=1.2e3 )
NumberFormat ns = NumberFormat.getInstance(); ns.setGroupingUsed(false); ns.format(xx);
oracle number(16) 当number位数超过16之后,在java里面就不能用double来对应,应该用BigDecimal
精度存到oracle是不会丢失的,可以通过sqlplus查看!
在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,我换了一下,解决了问题!!
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];
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目录下
rownum 取记录数
String sql = "from YbMrqsData y where y.id.qsrq='"+qsrq+"' and rownum=1";
打印所以系统属性: 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");
今天发现服务器上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
找到tomcat/bin/catalina.out 加上下面这一句
declare -x CATALINA_OPTS="-server -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=9999"
为什么有的时候一部署到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());
这是因为定时任务所关联的JAR包都在Tomcat上面,当几个应用共用Tomcat里面的JAR包时候,Tomcat 一有相关操作,定时任务就会报出找不到方法的错误,然后就自动停止
解决办法: 定时任务把相关JAR包添加到自己的项目底下,不要共用JAR包
x % 2 == 1
这个只能用来判断正奇数,比如:1 3 5 7 9
要判断: -1 -3 -5
必须这样写: x &1 ==1 or x %2 != 1
文件正在上送或者正在读取,其他程序是不能转移或者改名
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");
由于数据库某张表没有设置主键,但是映射的实体类设置了主键
那张表有多条数据对应实体类的主键相同,但是某个属性不一样,在Hibernate查询记录时,由于主键相同,所以取了第1条,其他数据都一样,Hibernate直接从缓存区取数据
PS:解决办法,数据库设主键,或者把表多属性设置成主键,或者Hibernate通过sql语句查询的时候生成Dto.
ServerSocket.setSotimeout() // 服务端设超时,只能判断连接超时,就是特定时间内有没客户端连接进来 Socket.setsotimeout() //客户端设超时。判断读写超时,就是特定时间内客户端有没读写数据,没有就抛出读写超时异常 判断是否连接超时,连接异常 try { socket.sendUrgentData(0xFF); } catch (Exception ex) { if (socket != null) socket.close(); }
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
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错误
save 方式保存,先更新,再保存,有重复对象就更新保存
insert 不能有重复对象
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("'");
外连接影响的性能十分大,最好关掉外连接
Hibernate:
hibernate.cfg.xml
hibernate.max_fetch_depth = 0
JPA
@OneToOne(optional=false)
<!--显示的sql语句格式化-->
<property name="hibernate.show_sql">true</property>
<!--使显示的sql语句-->
<property name="format_sql">true</property>
当要调用一个外部程序的时候,java提供了exec方法,具体用法是:Runtime.getRunTime.exec("cmd /C Start mailto: [email protected]").其中cmd /c是调用cmd下的start命令,它相当于对一个文件双击。也可以用Runtime.getRunTime.exec("c:\\EXCEl.exe d:\\a.xls")来打开D盘下的excel文件.
数据库表中如果没有主键,那么HIBERNATE就不应该设置主键映射,就拿最基本的查询来说.如果你改成有主键表映射文件的形式,那么Table中的custid如果有相同值的话,你从Dao中查出来的数据.凡是custid相同的数据.都会显示同一条,这不是我们想要的结果.
用hibernate开发要注意数据库中的每张表都应该有一个主键的。
可以无主键的,无主键就是所有的列联合成为一个主键,映射后会多出一个Java文件是表名id.java文件,意思是封装过了的表存入id那个类中
实体类对应表结构,字段数量可以小于等于表的字段,但是不能大于表中存在的字段
比如table1,里面有name,sex,id
那么实体类 table1.java 可以有name,sex映射,但是不能多出一个不存在的字段,比如address
hibernate保存的时候,联合主键里面的字段可以为空
在hibernate中,配置在组合主键中的字段,若只要有一个的值为null那么,hibernate会将整行对应的实体置为null。
如果表字段为空,映射到实体类,字符类型为=NULL,数值类型为=0
但是如果表的字段对应到实体类是联合主键,假如其中一个是NULL,比如说table.name 是空,那么映射到实体类打印的时候就会报错
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; } }
1. 要有用户,角色,还有权限表
为角色赋予 管理员,普通人员等,每个人都有不同的权限,然后再把用户赋予
declare @a int
select @a = 1,
@a = @a +1
select @a
这里会打印出控制,原因是第2行和第3行挤在一起写,第二次取的变量还没有初始化,正确写法如下
declare @a int
select @a = 1
select @a = @a +1
select @a
遇到社保局发送查询信息,半天没反应,原始是
如果SocketA接受的方式是按行形式,那么SocketB发送给SocketA的时候,一定要在末尾加换行符号
最标准的收发形式应该在报文前加长度,这样收报文的时候截取前面的长度,然后再截取内容
如果按照行方式,在内容里面不小心加了一个换行,那就出错了!~
那么select new test
这个test如果不是实体类,是Pojo类,那就要加包名,select new cn.dxy.test()
而且这个test要有无参构造函数,int要变成integer,要序列化
1 设置可以更改系统表
sp_configure 'allow updates to system tables',1
2 把master里面的系统表 sysdatabases 里面的属性 durability 改成1,注意
但是把SYBAES移动ORACLE报错 当前值66,最大值60
经发现,ORACLE的字符集是ALU32UTF8,是UTF8字符集,一个中文占用3个字节,最大只能存20个中文
解决办法: 赋值的时候,把超出20个中文的截出
但是在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();
而且不能这样关: getSession.close();
正确关闭方法: 1. Session session = getSession(); session.close();
2. releaseSession(session)