﻿<?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-nighty-随笔分类-数据库</title><link>http://www.blogjava.net/nighty/category/31271.html</link><description>折腾的年华</description><language>zh-cn</language><lastBuildDate>Wed, 10 Apr 2013 00:56:48 GMT</lastBuildDate><pubDate>Wed, 10 Apr 2013 00:56:48 GMT</pubDate><ttl>60</ttl><item><title>Ubuntu Server 12.10 Mysql的主从复制笔记</title><link>http://www.blogjava.net/nighty/archive/2013/04/09/397601.html</link><dc:creator>寒武纪</dc:creator><author>寒武纪</author><pubDate>Tue, 09 Apr 2013 12:33:00 GMT</pubDate><guid>http://www.blogjava.net/nighty/archive/2013/04/09/397601.html</guid><wfw:comment>http://www.blogjava.net/nighty/comments/397601.html</wfw:comment><comments>http://www.blogjava.net/nighty/archive/2013/04/09/397601.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/nighty/comments/commentRss/397601.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nighty/services/trackbacks/397601.html</trackback:ping><description><![CDATA[二台服务器，A的内网IP为192.168.1.111，B的内网IP为192.168.1.222，A做为master，B做为Slave<br />1. &nbsp;配置A的Mysql<br />&nbsp; &nbsp; &nbsp;(1) &nbsp;vim /etc/mysql/my.cnf<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;去掉[mysqld]段中 server_id =1 和log_bin=/var/log/mysql/mysql-bin.log的#注释<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;加上 &nbsp;binlog-do-db = s3 &nbsp; &nbsp; s3就是要同步的数据库的名称，如果没有这一行，表示同步所有的数据，另外 binlog_ignore_db = mysql。要表示忽略同步的数据库名称为mysql，如果有多个要指定同步或是忽略同步的数据，就配置多行，保存退出。<br />&nbsp; &nbsp; &nbsp;(2) 创建一个复制用的账户(名称为repl,允许从远程连接，密码为123456)： <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; GRANT REPLICATION SLAVE, RELOAD,SUPER, NO *.* TO repl@'%' IDENTIFIED BY '123456';<br /><font color="#666666" face="宋体, Arial"><span style="font-size: 12px; line-height: 26px;">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</span></font>FLUSH PRIVILEGES;<font color="#666666" face="宋体, Arial"><span style="font-size: 12px; line-height: 26px;"><br /></span></font>&nbsp; &nbsp; &nbsp;(3) 重启mysql服务，或是直接reboot机器也可以<br />&nbsp; &nbsp; &nbsp;(4) 进入mysql，然后用 show master status\G &nbsp;查看二进制日志的状态，看到类似以下的结果：<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; +------------------+----------+--------------+------------------+<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; | File &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;| Position &nbsp;| Binlog_Do_DB | Binlog_Ignore_DB |</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; +------------------+----------+--------------+------------------+</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; | mysql-bin.000003 | &nbsp; &nbsp; 1376 &nbsp;| s3 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;| &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; |</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; +------------------+----------+--------------+------------------+</div>2. &nbsp;配置B的Mysql<br />&nbsp; &nbsp; &nbsp; (1)&nbsp;vim /etc/mysql/my.cnf<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;去掉[mysqld]段中 server_id =1 和log_bin=/var/log/mysql/mysql-bin.log的#注释，把server_id改为2，要和master机器的不一样。并增加以下内容：<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;binlog_do_db=s3<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;log-slave-updates<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 保存退出<br />&nbsp; &nbsp; &nbsp;(2) 重启mysql服务<br />&nbsp; &nbsp; &nbsp;(3) 进入mysql，执行<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CHANGE MASTER TO MASTER_HOST='192.168.1.111', MASTER_USER='repl',Master_Port=3306,MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000003',MASTER_LOG_POS=1376;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SLAVE START;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 注意上面的CHANGE语句中，MASTER_LOG_FILE和MASTER_LOG_POS就是上面1.4中提到的show master status命令得到的结果，指定二进制文件的名称和开始同步的位置。<br />&nbsp; &nbsp; &nbsp;(4) 查看SLAVE状态: &nbsp; &nbsp;show slave status\G<br /><div>*************************** 1. row ***************************</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Slave_IO_State: Waiting for master to send event</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Master_Host: 192.168.1.111</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Master_User: repl</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Master_Port: 3306</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Connect_Retry: 60</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Master_Log_File: mysql-bin.000003</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Read_Master_Log_Pos: 1376</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Relay_Log_File: mysqld-relay-bin.000002</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Relay_Log_Pos: 1355</div><div>&nbsp; &nbsp; &nbsp; &nbsp; Relay_Master_Log_File: mysql-bin.000003</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff0000;">Slave_IO_Running: Yes</span></div><div><span style="color: #ff0000;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Slave_SQL_Running: Yes</span></div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Replicate_Do_DB:&nbsp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Replicate_Ignore_DB:&nbsp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Replicate_Do_Table:&nbsp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp;Replicate_Ignore_Table:&nbsp;</div><div>&nbsp; &nbsp; &nbsp; Replicate_Wild_Do_Table:&nbsp;</div><div>&nbsp; Replicate_Wild_Ignore_Table:&nbsp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Last_Errno: 0</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Last_Error:&nbsp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Skip_Counter: 0</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Exec_Master_Log_Pos: 1376</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Relay_Log_Space: 1512</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Until_Condition: None</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Until_Log_File:&nbsp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Until_Log_Pos: 0</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Master_SSL_Allowed: No</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Master_SSL_CA_File:&nbsp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Master_SSL_CA_Path:&nbsp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Master_SSL_Cert:&nbsp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Master_SSL_Cipher:&nbsp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Master_SSL_Key:&nbsp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; Seconds_Behind_Master: 0</div><div>Master_SSL_Verify_Server_Cert: No</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Last_IO_Errno: 0</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Last_IO_Error:&nbsp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Last_SQL_Errno: 0</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Last_SQL_Error:&nbsp;</div><div>&nbsp; Replicate_Ignore_Server_Ids:&nbsp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Master_Server_Id: 1</div>&nbsp; &nbsp; 上面的红色二行如果为YES则表示已经正常连接，可以进行复制了。<img src ="http://www.blogjava.net/nighty/aggbug/397601.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nighty/" target="_blank">寒武纪</a> 2013-04-09 20:33 <a href="http://www.blogjava.net/nighty/archive/2013/04/09/397601.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>扩展commons dbutils的JavaBean转换方式</title><link>http://www.blogjava.net/nighty/archive/2011/04/26/349050.html</link><dc:creator>寒武纪</dc:creator><author>寒武纪</author><pubDate>Tue, 26 Apr 2011 08:41:00 GMT</pubDate><guid>http://www.blogjava.net/nighty/archive/2011/04/26/349050.html</guid><wfw:comment>http://www.blogjava.net/nighty/comments/349050.html</wfw:comment><comments>http://www.blogjava.net/nighty/archive/2011/04/26/349050.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/nighty/comments/commentRss/349050.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nighty/services/trackbacks/349050.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 引言：最近又用到dbutils，之前一直用Map映射的方式取出select的结果再手工做转换。有写过一篇文章说MapHandler方式的一个缺陷：<a title="关于commons dbutils组件的一个小缺陷分析" href="http://www.blogjava.net/nighty/archive/2011/02/12/344155.html">关于commons dbutils组件的一个小缺陷分析</a>&nbsp;，用这种方式，在项目不大的情况下，写一些Map到JavaBean的转换代码工作量不大，但是在数据库表过多并且表中的字段过多的情况下，这种重复的setter感觉有点烦。于是又重新思考了BeanHandler和BeanListHandler的情况，dbutils底层映射用的反射，性能上肯定有损失，不过在大多数项目规模不是很大的情况下，这点损失可以忽略，带来的代码减少却是比较可观。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 问题在哪里？先看一段官方的示例代码：<br />
</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><span style="color: #000000">QueryRunner&nbsp;run&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;QueryRunner(dataSource);<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Use&nbsp;the&nbsp;BeanHandler&nbsp;implementation&nbsp;to&nbsp;convert&nbsp;the&nbsp;first<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;ResultSet&nbsp;row&nbsp;into&nbsp;a&nbsp;Person&nbsp;JavaBean.</span><span style="color: #008000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /></span><span style="color: #000000">ResultSetHandler</span><span style="color: #000000">&lt;</span><span style="color: #000000">Person</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;h&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;BeanHandler</span><span style="color: #000000">&lt;</span><span style="color: #000000">Person</span><span style="color: #000000">&gt;</span><span style="color: #000000">(Person.</span><span style="color: #0000ff">class</span><span style="color: #000000">);<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Execute&nbsp;the&nbsp;SQL&nbsp;statement&nbsp;with&nbsp;one&nbsp;replacement&nbsp;parameter&nbsp;and<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;return&nbsp;the&nbsp;results&nbsp;in&nbsp;a&nbsp;new&nbsp;Person&nbsp;object&nbsp;generated&nbsp;by&nbsp;the&nbsp;BeanHandler.</span><span style="color: #008000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /></span><span style="color: #000000">Person&nbsp;p&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;run.query(<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">SELECT&nbsp;*&nbsp;FROM&nbsp;Person&nbsp;WHERE&nbsp;name=?</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;h,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">John&nbsp;Doe</span><span style="color: #000000">"</span><span style="color: #000000">);</span></div>
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这里有个地方有约束，就是要求示例中的JavaBean类Person中的字段定义要和数据库的字段定义一致。Java的命名习惯一般是骆峰写法，例如userId，那么数据库中就必须定义为userId，而问题在于：有时候我们需要数据库中字段的定义格式与JavaBean的命名不一样，比如数据库定义为：user_id，而JavaBean则定义为userId<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 看源代码可能有点费时间，在官方的example页面的最下面果然有一段关于自定义BeanProcessor的指引。摘录出来：<br />
<hr />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #3366ff">BasicRowProcessor uses a BeanProcessor to convert ResultSet columns into JavaBean properties. You can subclass and override processing steps to handle datatype mapping specific to your application. The provided implementation delegates datatype conversion to the JDBC driver. <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BeanProcessor maps columns to bean properties as documented in the BeanProcessor.toBean() javadoc. Column names must match the bean's property names case insensitively. For example, the firstname column would be stored in the bean by calling its setFirstName() method. However, many database column names include characters that either can't be used or are not typically used in Java method names. You can do one of the following to map these columns to bean properties: <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1. Alias the column names in the SQL so they match the Java names: select social_sec# as socialSecurityNumber from person <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2. Subclass BeanProcessor and override the mapColumnsToProperties() method to strip out the offending characters. </span><br />
<hr />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;大概意思就是提供二种方式：一种就是最直接的，用as关键字把colName重命名，另一种方式就是继承BeanProcessor类，重写mapColumnsToProperties()方法。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 那当然是第二种方式更加具有代表性。尝试了一下。代码如下：<br />
&nbsp;&nbsp;&nbsp;&nbsp;
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #008080">&nbsp;1</span><img id="Codehighlighter1_55_1274_Open_Image" onclick="this.style.display='none'; Codehighlighter1_55_1274_Open_Text.style.display='none'; Codehighlighter1_55_1274_Closed_Image.style.display='inline'; Codehighlighter1_55_1274_Closed_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" /><img style="display: none" id="Codehighlighter1_55_1274_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_55_1274_Closed_Text.style.display='none'; Codehighlighter1_55_1274_Open_Image.style.display='inline'; Codehighlighter1_55_1274_Open_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;CustomBeanProcessor&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;BeanProcessor&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_55_1274_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_55_1274_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
</span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">[]&nbsp;mapColumnsToProperties(ResultSetMetaData&nbsp;rsmd,<br />
</span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img id="Codehighlighter1_185_930_Open_Image" onclick="this.style.display='none'; Codehighlighter1_185_930_Open_Text.style.display='none'; Codehighlighter1_185_930_Closed_Image.style.display='inline'; Codehighlighter1_185_930_Closed_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" /><img style="display: none" id="Codehighlighter1_185_930_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_185_930_Closed_Text.style.display='none'; Codehighlighter1_185_930_Open_Image.style.display='inline'; Codehighlighter1_185_930_Open_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PropertyDescriptor[]&nbsp;props)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;SQLException&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_185_930_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_185_930_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;cols&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;rsmd.getColumnCount();<br />
</span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;columnToProperty[]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">[cols&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">];<br />
</span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Arrays.fill(columnToProperty,&nbsp;PROPERTY_NOT_FOUND);<br />
</span><span style="color: #008080">&nbsp;9</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" /><br />
</span><span style="color: #008080">10</span><span style="color: #000000"><img id="Codehighlighter1_381_894_Open_Image" onclick="this.style.display='none'; Codehighlighter1_381_894_Open_Text.style.display='none'; Codehighlighter1_381_894_Closed_Image.style.display='inline'; Codehighlighter1_381_894_Closed_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" /><img style="display: none" id="Codehighlighter1_381_894_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_381_894_Closed_Text.style.display='none'; Codehighlighter1_381_894_Open_Image.style.display='inline'; Codehighlighter1_381_894_Open_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;col&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;col&nbsp;</span><span style="color: #000000">&lt;=</span><span style="color: #000000">&nbsp;cols;&nbsp;col</span><span style="color: #000000">++</span><span style="color: #000000">)&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_381_894_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_381_894_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">11</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;columnName&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;rsmd.getColumnLabel(col);&nbsp;<br />
</span><span style="color: #008080">12</span><span style="color: #000000"><img id="Codehighlighter1_506_572_Open_Image" onclick="this.style.display='none'; Codehighlighter1_506_572_Open_Text.style.display='none'; Codehighlighter1_506_572_Closed_Image.style.display='inline'; Codehighlighter1_506_572_Closed_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" /><img style="display: none" id="Codehighlighter1_506_572_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_506_572_Closed_Text.style.display='none'; Codehighlighter1_506_572_Open_Image.style.display='inline'; Codehighlighter1_506_572_Open_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">null</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;columnName&nbsp;</span><span style="color: #000000">||</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;columnName.length())&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_506_572_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_506_572_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">13</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;columnName&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;rsmd.getColumnName(col);<br />
</span><span style="color: #008080">14</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">15</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;columnName&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;colNameConvent(columnName);&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;在这里进行数据库表columnName的特殊处理</span><span style="color: #008000"><br />
</span><span style="color: #008080">16</span><span style="color: #008000"><img id="Codehighlighter1_706_884_Open_Image" onclick="this.style.display='none'; Codehighlighter1_706_884_Open_Text.style.display='none'; Codehighlighter1_706_884_Closed_Image.style.display='inline'; Codehighlighter1_706_884_Closed_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" /><img style="display: none" id="Codehighlighter1_706_884_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_706_884_Closed_Text.style.display='none'; Codehighlighter1_706_884_Open_Image.style.display='inline'; Codehighlighter1_706_884_Open_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;i&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;props.length;&nbsp;i</span><span style="color: #000000">++</span><span style="color: #000000">)&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_706_884_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_706_884_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">17</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" /><br />
</span><span style="color: #008080">18</span><span style="color: #000000"><img id="Codehighlighter1_778_870_Open_Image" onclick="this.style.display='none'; Codehighlighter1_778_870_Open_Text.style.display='none'; Codehighlighter1_778_870_Closed_Image.style.display='inline'; Codehighlighter1_778_870_Closed_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" /><img style="display: none" id="Codehighlighter1_778_870_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_778_870_Closed_Text.style.display='none'; Codehighlighter1_778_870_Open_Image.style.display='inline'; Codehighlighter1_778_870_Open_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(columnName.equalsIgnoreCase(props[i].getName()))&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_778_870_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_778_870_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">19</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;columnToProperty[col]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;i;<br />
</span><span style="color: #008080">20</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">break</span><span style="color: #000000">;<br />
</span><span style="color: #008080">21</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">22</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">23</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">24</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;columnToProperty;<br />
</span><span style="color: #008080">25</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">26</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" /><br />
</span><span style="color: #008080">27</span><span style="color: #000000"><img id="Codehighlighter1_934_989_Open_Image" onclick="this.style.display='none'; Codehighlighter1_934_989_Open_Text.style.display='none'; Codehighlighter1_934_989_Closed_Image.style.display='inline'; Codehighlighter1_934_989_Closed_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" /><img style="display: none" id="Codehighlighter1_934_989_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_934_989_Closed_Text.style.display='none'; Codehighlighter1_934_989_Open_Image.style.display='inline'; Codehighlighter1_934_989_Open_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_934_989_Closed_Text">/**&nbsp;*/</span><span id="Codehighlighter1_934_989_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br />
</span><span style="color: #008080">28</span><span style="color: #008000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;数据库列名重新约定<br />
</span><span style="color: #008080">29</span><span style="color: #008000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@param</span><span style="color: #008000">&nbsp;columnName<br />
</span><span style="color: #008080">30</span><span style="color: #008000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@return</span><span style="color: #008000"><br />
</span><span style="color: #008080">31</span><span style="color: #008000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">32</span><span style="color: #000000"><img id="Codehighlighter1_1041_1272_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1041_1272_Open_Text.style.display='none'; Codehighlighter1_1041_1272_Closed_Image.style.display='inline'; Codehighlighter1_1041_1272_Closed_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" /><img style="display: none" id="Codehighlighter1_1041_1272_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_1041_1272_Closed_Text.style.display='none'; Codehighlighter1_1041_1272_Open_Image.style.display='inline'; Codehighlighter1_1041_1272_Open_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;colNameConvent(String&nbsp;columnName)&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_1041_1272_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_1041_1272_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">33</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String[]&nbsp;strs&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;columnName.split(</span><span style="color: #000000">"</span><span style="color: #000000">_</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008080">34</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;conventName&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">""</span><span style="color: #000000">;<br />
</span><span style="color: #008080">35</span><span style="color: #000000"><img id="Codehighlighter1_1151_1206_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1151_1206_Open_Text.style.display='none'; Codehighlighter1_1151_1206_Closed_Image.style.display='inline'; Codehighlighter1_1151_1206_Closed_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" /><img style="display: none" id="Codehighlighter1_1151_1206_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_1151_1206_Closed_Text.style.display='none'; Codehighlighter1_1151_1206_Open_Image.style.display='inline'; Codehighlighter1_1151_1206_Open_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;i&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;strs.length;&nbsp;i</span><span style="color: #000000">++</span><span style="color: #000000">)&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_1151_1206_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_1151_1206_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">36</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conventName&nbsp;</span><span style="color: #000000">+=</span><span style="color: #000000">&nbsp;StringUtils.capitalize(strs[i]);<br />
</span><span style="color: #008080">37</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">38</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringUtils.uncapitalize(conventName);<br />
</span><span style="color: #008080">39</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;conventName;<br />
</span><span style="color: #008080">40</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">41</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" />}</span></span></div>
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 注意mapColumnsToProperties方法的逻辑是从父类的方法中直接复制出来的，然后在第15行那里变了个戏法，这里的columnName就是从数据库中读出来的，自定义一个private方法用于转换命名，这里你就可以添加自己的命名约束。例如上面就是把 user_id 转化为Java的骆峰写法：userId<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;再深入一层思考，你可以在这里进行更多扩展，以便让自己可以选择不同的命名转换方式。定义了这个Processor之后，下面看看如何调用：<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><span style="color: #000000">Connection&nbsp;conn&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ConnectionManager.getInstance().getConnection();<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />QueryRunner&nbsp;qr&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;QueryRunner();<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />CustomBeanProcessor&nbsp;convert&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;CustomBeanProcessor();<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />RowProcessor&nbsp;rp&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;BasicRowProcessor(convert);<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />BeanHandler</span><span style="color: #000000">&lt;</span><span style="color: #000000">User</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;bh&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;BeanHandler</span><span style="color: #000000">&lt;</span><span style="color: #000000">User</span><span style="color: #000000">&gt;</span><span style="color: #000000">(User.</span><span style="color: #0000ff">class</span><span style="color: #000000">,&nbsp;rp);<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />User&nbsp;u&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;qr.query(conn,&nbsp;sql,&nbsp;bh,&nbsp;params);<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />DbUtils.close(conn);</span></div>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 是不是非常灵活？如果是想返回List结果的，就把BeanHandler替换成BeanListHander类，还可以再进一步封装这些操作，抽象到公共模块中去，让外部直接传入sql语句和Class就能直接返回想要的结果，当然你得增加泛型的定义。同样举一个封装的例子：<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #008080">&nbsp;1</span><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">T</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;List</span><span style="color: #000000">&lt;</span><span style="color: #000000">T</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;selectBeanList(Connection&nbsp;conn,&nbsp;String&nbsp;sql,&nbsp;Class</span><span style="color: #000000">&lt;</span><span style="color: #000000">T</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;type,<br />
</span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img id="Codehighlighter1_118_443_Open_Image" onclick="this.style.display='none'; Codehighlighter1_118_443_Open_Text.style.display='none'; Codehighlighter1_118_443_Closed_Image.style.display='inline'; Codehighlighter1_118_443_Closed_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" /><img style="display: none" id="Codehighlighter1_118_443_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_118_443_Closed_Text.style.display='none'; Codehighlighter1_118_443_Open_Image.style.display='inline'; Codehighlighter1_118_443_Open_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object[]&nbsp;params)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Exception&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_118_443_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_118_443_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.debug(</span><span style="color: #000000">"</span><span style="color: #000000">select&nbsp;sql:[</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;sql&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">]</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QueryRunner&nbsp;qr&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;QueryRunner();<br />
</span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CustomBeanProcessor&nbsp;convert&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;CustomBeanProcessor();<br />
</span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RowProcessor&nbsp;rp&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;BasicRowProcessor(convert);<br />
</span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ResultSetHandler</span><span style="color: #000000">&lt;</span><span style="color: #000000">List</span><span style="color: #000000">&lt;</span><span style="color: #000000">T</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000">&nbsp;bh&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;BeanListHandler</span><span style="color: #000000">&lt;</span><span style="color: #000000">T</span><span style="color: #000000">&gt;</span><span style="color: #000000">(type,&nbsp;rp);<br />
</span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List</span><span style="color: #000000">&lt;</span><span style="color: #000000">T</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;list&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;qr.query(conn,&nbsp;sql,&nbsp;bh,&nbsp;params);<br />
</span><span style="color: #008080">&nbsp;9</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;list;<br />
</span><span style="color: #008080">10</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 至于为什么扩展这个方法就可以实现这个逻辑就得去跟源代码看它的内部实现，用了一些JavaBean的处理和反映的技巧来做的。具体就不说。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 总结：commons组件都设计得非常好，可扩展性和实用性都非常高。虽然上面举例实现了转换逻辑的替换，但是仍然需要开发人员在设计数据库的时候和写JavaBean时都要严格做好规范，避免产生不必要的问题。这方面Ruby On Rails就直接内部实现，动态语言的优点特别能体现，同时强制你在设计时必须用这种方式，典型的约定优于配置原则。当然，在dbutils里你愿意二种字段名都一样也无可厚非。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 缺点：BeanProcessor是不支持关联查询的，所以上面的方式也只能局限于单表的转换，这点就不如myBatis和Hibernate，当然用这二个就引入了一些复杂性，如何权衡需要自己衡量，哪个用得好都一样。本人就不喜欢myBatis那种把SQL写到XML中的方式，见过太复杂的SQL最终在XML里面变得面目全非，如果是接手别人的代码，是很痛苦的，而且你无法避免只修改XML而不改Java，既然二者都要改，那直接写Java里又有什么区别？简单就是美。格式和注释写好一点同样很容易理解！ 
<img src ="http://www.blogjava.net/nighty/aggbug/349050.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nighty/" target="_blank">寒武纪</a> 2011-04-26 16:41 <a href="http://www.blogjava.net/nighty/archive/2011/04/26/349050.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于commons dbutils组件的一个小缺陷分析</title><link>http://www.blogjava.net/nighty/archive/2011/02/12/344155.html</link><dc:creator>寒武纪</dc:creator><author>寒武纪</author><pubDate>Sat, 12 Feb 2011 09:33:00 GMT</pubDate><guid>http://www.blogjava.net/nighty/archive/2011/02/12/344155.html</guid><wfw:comment>http://www.blogjava.net/nighty/comments/344155.html</wfw:comment><comments>http://www.blogjava.net/nighty/archive/2011/02/12/344155.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/nighty/comments/commentRss/344155.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nighty/services/trackbacks/344155.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 非常喜欢这种轻量级的JDBC封装，比起Hibernate和iBatis，可以非常自由和灵活地运用和自行二次封装，由于dbutils的BeanHandler转换方式采取了反射技术，在性能上肯定有所损失，所以项目中基本上都使用MapHandler方式来转换数据，当然就是自己写的代码多一点，也无所谓。一般的查询、子查询、联合查询、包括视图查询等等都很正常，但是发现一个比较小的问题，就是在使用聚合函数的场所，例如：select user_type, count(*) as count from `user` group by user_type这种类型查询的时候，MapHandler方式不起作用，as列都变成key为空串的K-V对，导致有许多地方使用map.get("")代码的情况出现，这种写法当然是不太好的，容易出问题。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 鉴于前面没有时间了解，就都粗略使用了上面那种粗暴的map.get("")来处理，最好的情况是让dbutils组件能自动识别到as类型的列名。于是有空了就专门看了看它的源代码，发现最主要的一段代码如下：<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #008080">&nbsp;1</span><img id="Codehighlighter1_67_374_Open_Image" onclick="this.style.display='none'; Codehighlighter1_67_374_Open_Text.style.display='none'; Codehighlighter1_67_374_Closed_Image.style.display='inline'; Codehighlighter1_67_374_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_67_374_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_67_374_Closed_Text.style.display='none'; Codehighlighter1_67_374_Open_Image.style.display='inline'; Codehighlighter1_67_374_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif"  alt="" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Map</span><span style="color: #000000">&lt;</span><span style="color: #000000">String,&nbsp;Object</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;toMap(ResultSet&nbsp;rs)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;SQLException&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_67_374_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_67_374_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Map</span><span style="color: #000000">&lt;</span><span style="color: #000000">String,&nbsp;Object</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;result&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;CaseInsensitiveHashMap();<br />
</span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ResultSetMetaData&nbsp;rsmd&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;rs.getMetaData();<br />
</span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;cols&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;rsmd.getColumnCount();<br />
</span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /><br />
</span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img id="Codehighlighter1_270_344_Open_Image" onclick="this.style.display='none'; Codehighlighter1_270_344_Open_Text.style.display='none'; Codehighlighter1_270_344_Closed_Image.style.display='inline'; Codehighlighter1_270_344_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_270_344_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_270_344_Closed_Text.style.display='none'; Codehighlighter1_270_344_Open_Image.style.display='inline'; Codehighlighter1_270_344_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;i&nbsp;</span><span style="color: #000000">&lt;=</span><span style="color: #000000">&nbsp;cols;&nbsp;i</span><span style="color: #000000">++</span><span style="color: #000000">)&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_270_344_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_270_344_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result.put(rsmd.getColumnName(i),&nbsp;rs.getObject(i));<br />
</span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;9</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /><br />
</span><span style="color: #008080">10</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;result;<br />
</span><span style="color: #008080">11</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CaseInsensitiveHashMap是dbutils自定义的一个Map，忽略键大小写的K-V字典，但是key使用的是ResultSetMetaData.getColumnName()，我想问题大概出在这里，于是认真翻了翻java的api文档（开发做久了容易遗忘基础），果然，原来<strong>getColumnName()</strong>是：<span style="color: #ff0000">获取指定列的名称；</span>而as关键字之后，使列名称变成用于显示的意义，这个时候应该使用<strong>getColumnLabel</strong>()：<span style="color: #339966">获取用于打印输出和显示的指定列的建议标题。建议标题通常由 SQL <code>AS</code> 子句来指定。如果未指定 SQL <code>AS</code>，则从 <code>getColumnLabel</code> 返回的值将和 <code>getColumnName</code> 方法返回的值相同</span>。自己手动试验了一下，果然如所料，问题就出在这里。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 所以呢，如果想要dbutils在自动转换Map及MapList时能识别聚合函数的列名，那么最好的做法就是重载这种方式，懒一点的，你就干脆修改上面那段代码，让它判断是否使用了as关键字。个人暂时搞不清楚官方为什么没有考虑这一步，有时间再思考一下！
<img src ="http://www.blogjava.net/nighty/aggbug/344155.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nighty/" target="_blank">寒武纪</a> 2011-02-12 17:33 <a href="http://www.blogjava.net/nighty/archive/2011/02/12/344155.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>