﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-我在云端-文章分类-java基础</title><link>http://www.blogjava.net/chinan/category/53201.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 22 Oct 2013 08:35:23 GMT</lastBuildDate><pubDate>Tue, 22 Oct 2013 08:35:23 GMT</pubDate><ttl>60</ttl><item><title>JAVA中的UTF-16编码</title><link>http://www.blogjava.net/chinan/articles/404993.html</link><dc:creator>何健超</dc:creator><author>何健超</author><pubDate>Tue, 15 Oct 2013 00:43:00 GMT</pubDate><guid>http://www.blogjava.net/chinan/articles/404993.html</guid><wfw:comment>http://www.blogjava.net/chinan/comments/404993.html</wfw:comment><comments>http://www.blogjava.net/chinan/articles/404993.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chinan/comments/commentRss/404993.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chinan/services/trackbacks/404993.html</trackback:ping><description><![CDATA[<a href="http://www.cnblogs.com/maxupeng/archive/2011/06/22/2087579.html">http://www.cnblogs.com/maxupeng/archive/2011/06/22/2087579.html<br /><br /><br /><a href="http://www.ibm.com/developerworks/cn/java/j-unicode/">http://www.ibm.com/developerworks/cn/java/j-unicode/</a></a><img src ="http://www.blogjava.net/chinan/aggbug/404993.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chinan/" target="_blank">何健超</a> 2013-10-15 08:43 <a href="http://www.blogjava.net/chinan/articles/404993.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PreparedStatement的用法</title><link>http://www.blogjava.net/chinan/articles/396827.html</link><dc:creator>何健超</dc:creator><author>何健超</author><pubDate>Thu, 21 Mar 2013 15:22:00 GMT</pubDate><guid>http://www.blogjava.net/chinan/articles/396827.html</guid><wfw:comment>http://www.blogjava.net/chinan/comments/396827.html</wfw:comment><comments>http://www.blogjava.net/chinan/articles/396827.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chinan/comments/commentRss/396827.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chinan/services/trackbacks/396827.html</trackback:ping><description><![CDATA[<p><span style="font-size: 14pt;"><strong>为什么要始终使用PreparedStatement代替Statement?</strong></span><br /></p><hr /><p>&nbsp;一.代码的可读性和可维护性.</p><p>&nbsp; &nbsp; 采用Statement方式，看似很直观的字符串拼接sql语句，实际却容易出错而且难以维护。而采用PreparedStatement方式，通过?占位，可以清晰理解sql结构，无论从可读性还是可维护性上来说.都比直接用Statement的代码更值得推崇。 </p><p>二.PreparedStatement尽最大可能提高性能.&nbsp;</p>  <p>&nbsp; &nbsp; 每一种数据库都会尽最大努力对预编译语句提供最大的性能优化.因为预编译语句有可能被重复调用.所以语句在被DB的编译器编译后的执行代码被缓存下来,那么下次调用时只要是相同的预编译语句就不需要编译,只要将参数直接传入编译过的语句执行代码中(相当于一个涵数)就会得到执行.这并不是说只有一个Connection中多次执行的预编译语句被缓存,而是对于整个DB中,只要预编译的语句语法和缓存中匹配.那么在任何时候就可以不需要再次编译而可以直接执行.而statement的语句中,即使是相同一操作,而由于每次操作的数据不同所以使整个语句相匹配的机会极小,几乎不太可能匹配.比如:<br /></p><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->insert&nbsp;into&nbsp;a_table(col1,col2)&nbsp;values&nbsp;('aa','bb');&nbsp;&nbsp;&nbsp;&nbsp;<br />insert&nbsp;into&nbsp;a_table(col1,col2)&nbsp;values&nbsp;('aa','bb');</div><p>&nbsp; &nbsp; &nbsp;即使是相同操作但因为数据内容不一样,所以整个个语句本身不能匹配,没有缓存语句的意义.事实是没有数据库会对普通语句编译后的执行代码缓存.</p>  <p>&nbsp; &nbsp; &nbsp;当然并不是所以预编译语句都一定会被缓存,数据库本身会用一种策略,比如使用频度等因素来决定什么时候不再缓存已有的预编译结果.以保存有更多的空间存储新的预编译语句.<br /> 三.防止SQL注入</p>  <p>&nbsp; &nbsp; 如果我们有如下sql语句对用户进行验证：&nbsp;</p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->String&nbsp;sql&nbsp;=&nbsp;"select&nbsp;*&nbsp;from&nbsp;tb_name&nbsp;where&nbsp;name=&nbsp;'"+varname+"'&nbsp;and&nbsp;passwd='"+varpasswd+"'";</div><p>&nbsp; &nbsp; &nbsp;那么当把[' or '1' = '1]作为varpasswd传入进来.用户名随意,看看会成为什么?</p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->&nbsp;select&nbsp;*&nbsp;from&nbsp;tb_name&nbsp;=&nbsp;'any_value'&nbsp;and&nbsp;passwd&nbsp;=&nbsp;''&nbsp;or&nbsp;'1'&nbsp;=&nbsp;'1';</div><p>&nbsp; &nbsp; &nbsp;因为'1'='1'肯定成立,所以可以任何通过验证.更有甚者:把[';drop table tb_name;]作为varpasswd传入进来,则:<br /></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->select&nbsp;*&nbsp;from&nbsp;tb_name&nbsp;=&nbsp;'any_value'&nbsp;and&nbsp;passwd&nbsp;=&nbsp;'';drop&nbsp;table&nbsp;tb_name;</div><p>&nbsp;&nbsp;&nbsp;&nbsp;有些数据库是不会让你成功的,但也有很多数据库就可以使这些语句得到执行.</p><p>&nbsp;&nbsp;&nbsp;&nbsp;而如果我们使用预编译语句.那么传入的任何内容就不会和原来的语句发生任何匹配的关系.只要全使用预编译语句,就用不着对传入的数据做任何过虑.而如果使用普通的statement,有可能要对drop,or等等sql关键字、各种转义字符;等做费尽心机的判断和过虑.&nbsp;</p><hr /><img src ="http://www.blogjava.net/chinan/aggbug/396827.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chinan/" target="_blank">何健超</a> 2013-03-21 23:22 <a href="http://www.blogjava.net/chinan/articles/396827.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java基础备注</title><link>http://www.blogjava.net/chinan/articles/393927.html</link><dc:creator>何健超</dc:creator><author>何健超</author><pubDate>Mon, 07 Jan 2013 13:15:00 GMT</pubDate><guid>http://www.blogjava.net/chinan/articles/393927.html</guid><wfw:comment>http://www.blogjava.net/chinan/comments/393927.html</wfw:comment><comments>http://www.blogjava.net/chinan/articles/393927.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chinan/comments/commentRss/393927.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chinan/services/trackbacks/393927.html</trackback:ping><description><![CDATA[<div><div>1、java中，Integer和Integer类型比较时，是对象间的相等比较，不要直接用==，最好是其中一个调用一下intValue()方法，这样，就变成了int与Integer比较，java 5的机制会保证二者的拆箱操作的。</div><div>2、对于一个字符串，调用split(":")这样的形式，当作为分隔符的最后一个字段是空的时候，会直接忽略最后一个字段。此时可以考虑用：split(":",-1)。</div><div>3、定义double值时，注意对其进行加减操作的精度问题。比如：double a = 19.9,在实际存储时，值为：19.89999999999999999999999999 （http://www.binaryconvert.com/result_double.html?decimal=056046057）。</div><div>4、StringBuffer 与 StringBuilder 中的方法和功能完全是等价的，只是StringBuffer 中的方法大都采用了 synchronized 关键字进行修饰，因此是线程安全的，而 StringBuilder 没有这个修饰，可以被认为是线程不安全的。StringBuffer 始于 JDK 1.0，StringBuilder 始于 JDK 1.5。从 JDK 1.5 开始，带有字符串变量的连接操作（+），JVM 内部采用的是StringBuilder 来实现的，而之前这个操作是采用 StringBuffer 实现的。通常情况下，使用StringBuilder即可。这里有一个性能考量的点：StringBuilder的构造函数中，推荐new StringBuilder(capability)，采用这种方式需要预估StringBuilder大概需要容纳的字符个数，估计量稍微偏大一点也比不估计的好。不然的话会出现原定容量不够，字符串的频繁拷贝的情形。此外，当我们需要截掉StringBuilder所代表的字符串最后一位时，可以直接采用setLength的方式。</div><div>5、当我们对Arrays.asList返回的List进行添加或删除时将会报 java.lang.UnsupportedOperationException 异常。set(index,value)是可以的。</div></div><div></div><img src ="http://www.blogjava.net/chinan/aggbug/393927.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chinan/" target="_blank">何健超</a> 2013-01-07 21:15 <a href="http://www.blogjava.net/chinan/articles/393927.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>