Java JDBC的基础知识(五)
<p><strong>一、事务</strong></p>
<p>事务是一组组合成逻辑工作单元的操作,虽然系统中可能会出错,但事务将控制和维护事务中每个操作的一致性和完整性。</p>
<p>事务具有:</p>
<p>1.原子性(atomicity):组成事务处理的语句形成了一个逻辑单元,不能只执行其中的一部分。</p>
<p>2.一致性(consistency):在事务处理执行前后,数据库是一致的(数据库数据完整性约束)。</p>
<p>3.隔离性(isolcation):一个事务处理对另一个事务处理的影响。</p>
<p>4.持续性(durability):事务处理的效果能够被永久保存下来 。</p>
<p>用一副图来说明一下:</p>
<p><img src="http://images2017.cnblogs.com/blog/1155461/201708/1155461-20170802115612724-1757570525.png" alt=""></p>
<div class="cnblogs_code">
<pre>Connection.setAutoCommit(<span style="color: #0000ff">false</span>); <span style="color: #008000">//</span><span style="color: #008000">打开事务</span>
Connection.commit(); <span style="color: #008000">//</span><span style="color: #008000">揭交事务</span>
Connection.rollback(); <span style="color: #008000">//</span><span style="color: #008000">回滚事务</span></pre>
</div>
<p>当只想撤销部分操作的时候,可以使用 SavePoint</p>
<div class="cnblogs_code">
<pre>SavePoint sp=<span style="color: #000000">conn.getSavePoint();
conn.rollback(sp);
conn.commit();</span></pre>
</div>
<p>代码应用示例:</p>
<div class="cnblogs_code"><div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div>
<pre><span style="color: #0000ff">import</span><span style="color: #000000"> java.sql.Connection;
</span><span style="color: #0000ff">import</span><span style="color: #000000"> java.sql.SQLException;
</span><span style="color: #0000ff">import</span><span style="color: #000000"> java.sql.Statement;
</span><span style="color: #0000ff">import</span><span style="color: #000000"> java.util.ArrayList;
</span><span style="color: #0000ff">import</span><span style="color: #000000"> java.util.List;
</span><span style="color: #0000ff">class</span><span style="color: #000000"> AdminInfo {
</span><span style="color: #0000ff">public</span> <span style="color: #0000ff">static</span> <span style="color: #0000ff">void</span><span style="color: #000000"> main(String[] args) {
AdminInfo admin </span>= <span style="color: #0000ff">new</span><span style="color: #000000"> AdminInfo();
admin.setId(</span>122<span style="color: #000000">);
admin.setAddress(</span>"杭州文一西路"<span style="color: #000000">);
admin.setPassword(</span>"123"<span style="color: #000000">);
admin.setUserName(</span>"周周"<span style="color: #000000">);
List</span><Integer> roleList = <span style="color: #0000ff">new</span> ArrayList<Integer><span style="color: #000000">();
roleList.add(</span>3<span style="color: #000000">);
roleList.add(</span>4<span style="color: #000000">);
roleList.add(</span>5<span style="color: #000000">);
addAdmin(admin, roleList);
}
</span><span style="color: #0000ff">private</span> <span style="color: #0000ff">void</span> setId(<span style="color: #0000ff">int</span><span style="color: #000000"> i) {
</span><span style="color: #008000">//</span><span style="color: #008000"> TODO Auto-generated method stub</span>
<span style="color: #000000">
}
</span><span style="color: #0000ff">private</span> <span style="color: #0000ff">void</span><span style="color: #000000"> setAddress(String string) {
</span><span style="color: #008000">//</span><span style="color: #008000"> TODO Auto-generated method stub</span>
<span style="color: #000000">
}
</span><span style="color: #0000ff">private</span> <span style="color: #0000ff">void</span><span style="color: #000000"> setPassword(String string) {
</span><span style="color: #008000">//</span><span style="color: #008000"> TODO Auto-generated method stub</span>
<span style="color: #000000">
}
</span><span style="color: #0000ff">private</span> <span style="color: #0000ff">void</span><span style="color: #000000"> setUserName(String string) {
</span><span style="color: #008000">//</span><span style="color: #008000"> TODO Auto-generated method stub</span>
<span style="color: #000000">
}
</span><span style="color: #0000ff">private</span><span style="color: #000000"> String getPassword() {
</span><span style="color: #008000">//</span><span style="color: #008000"> TODO Auto-generated method stub</span>
<span style="color: #0000ff">return</span> <span style="color: #0000ff">null</span><span style="color: #000000">;
}
</span><span style="color: #0000ff">private</span><span style="color: #000000"> String getUserName() {
</span><span style="color: #008000">//</span><span style="color: #008000"> TODO Auto-generated method stub</span>
<span style="color: #0000ff">return</span> <span style="color: #0000ff">null</span><span style="color: #000000">;
}
</span><span style="color: #0000ff">private</span><span style="color: #000000"> String getId() {
</span><span style="color: #008000">//</span><span style="color: #008000"> TODO Auto-generated method stub</span>
<span style="color: #0000ff">return</span> <span style="color: #0000ff">null</span><span style="color: #000000">;
}
</span><span style="color: #0000ff">public</span> <span style="color: #0000ff">static</span> <span style="color: #0000ff">void</span> addAdmin(AdminInfo admin, List<Integer><span style="color: #000000"> roleList) {
Connection conn </span>= <span style="color: #0000ff">null</span><span style="color: #000000">;
Statement stm </span>= <span style="color: #0000ff">null</span><span style="color: #000000">;
</span><span style="color: #0000ff">try</span><span style="color: #000000"> {
conn </span>=<span style="color: #000000"> DBUtil.getConn();
stm </span>=<span style="color: #000000"> conn.createStatement();
String sql </span>= "insert into adminInfo (id,userName,password) values ( "
+<span style="color: #000000"> admin.getId()
</span>+ ",'"
+<span style="color: #000000"> admin.getUserName()
</span>+ "','"
+ admin.getPassword() + "') "<span style="color: #000000">;
conn.setAutoCommit(</span><span style="color: #0000ff">false</span>); <span style="color: #008000">//</span><span style="color: #008000"> 开启事务</span>
<span style="color: #000000"> stm.execute(sql);
</span><span style="color: #0000ff">for</span><span style="color: #000000"> (Integer i : roleList) {
String sql2 </span>= "insert into adminRole(adminid,roleId) values ( "
+ admin.getId() + "," + i + ")"<span style="color: #000000">;
@SuppressWarnings(</span>"unused"<span style="color: #000000">)
</span><span style="color: #0000ff">int</span> a = 9 / 0<span style="color: #000000">;
stm.execute(sql2);
}
conn.commit();
} </span><span style="color: #0000ff">catch</span><span style="color: #000000"> (Exception ex) {
</span><span style="color: #0000ff">try</span><span style="color: #000000"> {
conn.rollback(); </span><span style="color: #008000">//</span><span style="color: #008000"> 回滚</span>
} <span style="color: #0000ff">catch</span><span style="color: #000000"> (SQLException e) {
e.printStackTrace();
}
ex.printStackTrace();
} </span><span style="color: #0000ff">finally</span><span style="color: #000000"> {
DBUtil.close(</span><span style="color: #0000ff">null</span><span style="color: #000000">, stm, conn);
}
}
}</span></pre>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div></div>
<p><strong>二、带回滚点的事务</strong></p>
<p> 从上面的图中,已经可以了解到,带滚点的事务的特点。只要设置了它,程序因为意外原因而中断,也可以当作数据都回到原来的起始点,就当什么事情都没发生过。</p>
<p>代码操作演示:</p>
<div class="cnblogs_code"><div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div>
<pre><span style="color: #0000ff">import</span><span style="color: #000000"> java.sql.Connection;
</span><span style="color: #0000ff">import</span><span style="color: #000000"> java.sql.PreparedStatement;
</span><span style="color: #0000ff">import</span><span style="color: #000000"> java.sql.SQLException;
</span><span style="color: #0000ff">import</span><span style="color: #000000"> java.sql.Savepoint;
</span><span style="color: #0000ff">import</span><span style="color: #000000"> java.util.List;
</span><span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span><span style="color: #000000"> Test4 {
</span><span style="color: #0000ff">static</span> <span style="color: #0000ff">void</span><span style="color: #000000"> addUserPointDemo(String userName, String userId,
List</span><Integer><span style="color: #000000"> roleList) {
Connection conn </span>= <span style="color: #0000ff">null</span><span style="color: #000000">;
PreparedStatement stm </span>= <span style="color: #0000ff">null</span><span style="color: #000000">;
Savepoint point </span>= <span style="color: #0000ff">null</span><span style="color: #000000">;
</span><span style="color: #0000ff">try</span><span style="color: #000000"> {
conn </span>=<span style="color: #000000"> DBUtil.getConn();
String sql </span>= "insert into SysUser (userName,userId) values(?,?)"<span style="color: #000000">;
stm </span>=<span style="color: #000000"> conn.prepareStatement(sql);
stm.setString(</span>1<span style="color: #000000">, userName);
stm.setString(</span>2<span style="color: #000000">, userId);
conn.setAutoCommit(</span><span style="color: #0000ff">false</span><span style="color: #000000">);
stm.executeUpdate();
</span><span style="color: #008000">//</span><span style="color: #008000"> 下面是添加权限列表</span>
<span style="color: #0000ff">for</span> (<span style="color: #0000ff">int</span> i = 0; i < roleList.size(); i++<span style="color: #000000">) {
</span><span style="color: #0000ff">if</span> (i == 3) { <span style="color: #008000">//</span><span style="color: #008000"> 在等于3的时候设置保存点</span>
point =<span style="color: #000000"> conn.setSavepoint();
}
</span><span style="color: #0000ff">if</span> (i == 5<span style="color: #000000">) {
</span><span style="color: #0000ff">int</span> a = 2 / 0<span style="color: #000000">;
}
String sql2 </span>= "insert into UserRole(userId,roleId) values(?,?)"<span style="color: #000000">;
stm </span>=<span style="color: #000000"> conn.prepareStatement(sql2);
stm.setString(</span>1<span style="color: #000000">, userId);
stm.setInt(</span>2<span style="color: #000000">, roleList.get(i));
stm.executeUpdate();
}
conn.commit();
} </span><span style="color: #0000ff">catch</span> (Exception e) { <span style="color: #008000">//</span><span style="color: #008000"> 注意这里的异常类型</span>
<span style="color: #0000ff">try</span><span style="color: #000000"> {
conn.rollback(point);
conn.commit(); </span><span style="color: #008000">//</span><span style="color: #008000"> 注意 一定要再commit 一次</span>
<span style="color: #0000ff">throw</span> <span style="color: #0000ff">new</span><span style="color: #000000"> RuntimeException(e);
} </span><span style="color: #0000ff">catch</span><span style="color: #000000"> (SQLException e1) {
</span><span style="color: #0000ff">throw</span> <span style="color: #0000ff">new</span><span style="color: #000000"> RuntimeException(e1.getMessage());
}
}
}
}</span></pre>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div></div>
<p><strong>三、4 元信息</strong></p>
<p>DatabaseMetaData</p>
<p>ParameterMetaData</p>
<p>ResultSetMetaData</p>
<p>1) DatabaseMetaData</p>
<div class="cnblogs_code"><div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div>
<pre>getURL():返回一个String类对象,代表数据库的URL。 <span style="color: #008000">//</span><span style="color: #008000">jdbc:mysql:</span><span style="color: #008000">//</span><span style="color: #008000">localhost:3306/shop</span>
<span style="color: #000000">
getUserName():返回连接当前数据库管理系统的用户名。 </span><span style="color: #008000">//</span><span style="color: #008000">root@localhost</span>
<span style="color: #000000">
getDatabaseProductName():返回数据库的产品名称。 </span><span style="color: #008000">//</span><span style="color: #008000">MySQL</span>
<span style="color: #000000">
getDatabaseProductVersion():返回数据库的版本号。
getDriverName():返回驱动驱动程序的名称。 </span><span style="color: #008000">//</span><span style="color: #008000">MySQL-AB JDBC Driver</span>
<span style="color: #000000">
getDriverVersion():返回驱动程序的版本号。 </span><span style="color: #008000">//</span><span style="color: #008000">mysql-connector-java-5.0.4 ( $Date: 2006-10-19 17:47:48 +0200 (Thu, 19 Oct 2006) $, $Revision: 5908 $ )</span>
<span style="color: #000000">
isReadOnly():返回一个boolean值,指示数据库是否只允许读操作。</span><span style="color: #008000">//</span><span style="color: #008000">false</span>
<span style="color: #000000">
supportsTransactions() </span><span style="color: #008000">//</span><span style="color: #008000">true</span>
<span style="color: #000000">
getSQLKeywords() </span><span style="color: #008000">//</span><span style="color: #008000">AUTO_INCREMENT,BINARY,BLOB,ENUM,INFILE,LOAD,MEDIUMINT,OPTION,OUTFILE,REPLACE,SET,TEXT,UNSIGNED,ZEROFILL</span></pre>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div></div>
<p>2) ParameterMetaData(stm.getParameterMetaData();)</p>
<div class="cnblogs_code">
<pre><span style="color: #000000">getParameterCount(): 获得指定参数的个数
getParameterType(</span><span style="color: #0000ff">int</span> param):获得指定参数的sql类型 <span style="color: #008000">//</span><span style="color: #008000">mysql不支持</span></pre>
</div>
<p>代码演示:</p>
<div class="cnblogs_code"><div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div>
<pre><span style="color: #0000ff">import</span><span style="color: #000000"> java.sql.Connection;
</span><span style="color: #0000ff">import</span><span style="color: #000000"> java.sql.PreparedStatement;
</span><span style="color: #0000ff">import</span><span style="color: #000000"> java.sql.ResultSet;
</span><span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span><span style="color: #000000"> Test5 {
</span><span style="color: #0000ff">public</span> <span style="color: #0000ff">static</span><span style="color: #000000"> AdminInfo login(String sql, Object[] paramList) {
Connection conn </span>= <span style="color: #0000ff">null</span><span style="color: #000000">;
PreparedStatement stm </span>= <span style="color: #0000ff">null</span><span style="color: #000000">;
ResultSet rs </span>= <span style="color: #0000ff">null</span><span style="color: #000000">;
AdminInfo admin </span>= <span style="color: #0000ff">null</span><span style="color: #000000">;
</span><span style="color: #0000ff">try</span><span style="color: #000000"> {
conn </span>=<span style="color: #000000"> DBUtil.getConn();
stm </span>=<span style="color: #000000"> conn.prepareStatement(sql);
</span><span style="color: #008000">/*</span><span style="color: #008000">
* ParameterMetaData pm=stm.getParameterMetaData(); int
* paramCount=pm.getParameterCount();
* System.out.println("该sql一共要"+paramCount+"个参数");
</span><span style="color: #008000">*/</span>
<span style="color: #0000ff">for</span> (<span style="color: #0000ff">int</span> i = 1; i <= paramList.length; i++<span style="color: #000000">) {
stm.setObject(i, paramList[i </span>- 1<span style="color: #000000">]);
}
rs </span>=<span style="color: #000000"> stm.executeQuery();
</span><span style="color: #0000ff">if</span><span style="color: #000000"> (rs.next()) {
admin </span>= <span style="color: #0000ff">new</span><span style="color: #000000"> AdminInfo();
admin.setId(rs.getInt(</span>"id"<span style="color: #000000">));
admin.setUserName(rs.getString(</span>"userName"<span style="color: #000000">));
admin.setPassword(rs.getString(</span>"password"<span style="color: #000000">));
</span><span style="color: #008000">//</span><span style="color: #008000"> ...</span>
<span style="color: #000000"> }
} </span><span style="color: #0000ff">catch</span><span style="color: #000000"> (Exception ex) {
ex.printStackTrace();
} </span><span style="color: #0000ff">finally</span><span style="color: #000000"> {
DBUtil.close(</span><span style="color: #0000ff">null</span><span style="color: #000000">, stm, conn);
}
</span><span style="color: #0000ff">return</span><span style="color: #000000"> admin;
}
}</span></pre>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div></div>
<p>3) ResultSetMeta (resultSet 的元信息)</p>
<div class="cnblogs_code"><div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div>
<pre>getColumnCount() <span style="color: #008000">//</span><span style="color: #008000">得到列数</span>
<span style="color: #000000">
getColumnName(</span><span style="color: #0000ff">int</span> colum) <span style="color: #008000">//</span><span style="color: #008000">得到指定列的列名 真名</span>
<span style="color: #000000">
getColumnLabel(</span><span style="color: #0000ff">int</span> colum) <span style="color: #008000">//</span><span style="color: #008000">得到指定列的列名 as 后的</span>
<span style="color: #000000">
getColumnTypeName (</span><span style="color: #0000ff">int</span> column) <span style="color: #008000">//</span><span style="color: #008000">得到指定列的类型</span></pre>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div></div>
<p>代码演示:</p>
<div class="cnblogs_code"><div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div>
<pre><span style="color: #0000ff">import</span><span style="color: #000000"> java.sql.Connection;
</span><span style="color: #0000ff">import</span><span style="color: #000000"> java.sql.PreparedStatement;
</span><span style="color: #0000ff">import</span><span style="color: #000000"> java.sql.ResultSet;
</span><span style="color: #0000ff">import</span><span style="color: #000000"> java.sql.ResultSetMetaData;
</span><span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span><span style="color: #000000"> Test6 {
</span><span style="color: #0000ff">public</span> <span style="color: #0000ff">static</span><span style="color: #000000"> AdminInfo test() {
Connection conn </span>= <span style="color: #0000ff">null</span><span style="color: #000000">;
PreparedStatement stm </span>= <span style="color: #0000ff">null</span><span style="color: #000000">;
ResultSet rs </span>= <span style="color: #0000ff">null</span><span style="color: #000000">;
AdminInfo admin </span>= <span style="color: #0000ff">null</span><span style="color: #000000">;
</span><span style="color: #0000ff">try</span><span style="color: #000000"> {
conn </span>=<span style="color: #000000"> DBUtil.getConn();
stm </span>=<span style="color: #000000"> conn
.prepareStatement(</span>"SELECT * FROM ADMININFO where username ='赵明明' and password='123'"<span style="color: #000000">);
rs </span>=<span style="color: #000000"> stm.executeQuery();
</span><span style="color: #0000ff">if</span><span style="color: #000000"> (rs.next()) {
ResultSetMetaData rm </span>=<span style="color: #000000"> rs.getMetaData();
</span><span style="color: #0000ff">int</span> columnCount = rm.getColumnCount(); <span style="color: #008000">//</span><span style="color: #008000"> 取列数</span>
<span style="color: #0000ff">for</span> (<span style="color: #0000ff">int</span> i = 1; i <= columnCount; i++<span style="color: #000000">) {
System.out.println(rm.getColumnLabel(i)); </span><span style="color: #008000">//</span><span style="color: #008000"> 取出所有的列名</span>
<span style="color: #000000"> }
admin </span>= <span style="color: #0000ff">new</span><span style="color: #000000"> AdminInfo();
admin.setId(rs.getInt(</span>"id"<span style="color: #000000">));
admin.setUserName(rs.getString(</span>"userName"<span style="color: #000000">));
admin.setPassword(rs.getString(</span>"password"<span style="color: #000000">));
}
} </span><span style="color: #0000ff">catch</span><span style="color: #000000"> (Exception ex) {
ex.printStackTrace();
} </span><span style="color: #0000ff">finally</span><span style="color: #000000"> {
DBUtil.close(</span><span style="color: #0000ff">null</span><span style="color: #000000">, stm, conn);
}
</span><span style="color: #0000ff">return</span><span style="color: #000000"> admin;
}
}</span></pre>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div></div>
<p><strong>四、数据源和连接池</strong></p>
<p>DataSource 用来取代 DriverManager 来取得Connection 。通过 DataSource 取得连接的速度很快。通过 DataSource 方式取得的连接(Connection ) 是经过代理的,它的close方法,不会导致原来的连接的关闭。一般的 DataSource 内部都有一个连接池来缓存 Connection,可以大大提高效率。这个连接池一般就是 一个 Collection 集合。</p>
<p>例子:简单的数据源模拟</p>
<div class="cnblogs_code"><div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div>
<pre><span style="color: #008000">//</span><span style="color: #008000">数据源</span>
<span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span><span style="color: #000000"> MyDataSource {
</span><span style="color: #0000ff">private</span> String url="jdbc:mysql://localhost:3306/shop"<span style="color: #000000">;
</span><span style="color: #0000ff">private</span> String user="root"<span style="color: #000000">;
</span><span style="color: #0000ff">private</span> String password="admin"<span style="color: #000000">;
</span><span style="color: #0000ff">private</span> LinkedList<Connection> connPool=<span style="color: #0000ff">new</span> LinkedList<Connection><span style="color: #000000">();
</span><span style="color: #0000ff">public</span><span style="color: #000000"> MyDataSource(){
</span><span style="color: #0000ff">for</span>(<span style="color: #0000ff">int</span> i=0;i<10;i++<span style="color: #000000">){
</span><span style="color: #0000ff">this</span>.connPool.addLast(<span style="color: #0000ff">this</span><span style="color: #000000">.createConn());
}
}
</span><span style="color: #008000">//</span><span style="color: #008000">对外提供取得连接的方法</span>
<span style="color: #0000ff">public</span><span style="color: #000000"> Connection getConn(){
</span><span style="color: #0000ff">return</span> <span style="color: #0000ff">this</span><span style="color: #000000">.connPool.removeFirst();
}
</span><span style="color: #008000">//</span><span style="color: #008000">对外提供收回连接的方法</span>
<span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span><span style="color: #000000"> closeConn(Connection conn){
</span><span style="color: #0000ff">this</span><span style="color: #000000">.connPool.addLast(conn);
}
</span><span style="color: #008000">//</span><span style="color: #008000">创建连接</span>
<span style="color: #0000ff">private</span><span style="color: #000000"> Connection createConn() {
Connection conn</span>=<span style="color: #0000ff">null</span><span style="color: #000000">;
</span><span style="color: #0000ff">try</span><span style="color: #000000"> {
conn</span>=<span style="color: #000000"> DriverManager.getConnection(url,user,password);
} </span><span style="color: #0000ff">catch</span><span style="color: #000000"> (SQLException e) {
e.printStackTrace();
}
</span><span style="color: #0000ff">return</span><span style="color: #000000"> conn;
}
}</span></pre>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div></div>
<div class="cnblogs_code"><div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div>
<pre> <span style="color: #008000">//</span><span style="color: #008000">在DBUtil中使用自定义的数据源</span>
<span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span><span style="color: #000000"> DBUtil {
</span><span style="color: #0000ff">private</span><span style="color: #000000"> DBUtil() {}
</span><span style="color: #0000ff">private</span> <span style="color: #0000ff">static</span> MyDataSource myDataSorce=<span style="color: #0000ff">null</span>; <span style="color: #008000">//</span><span style="color: #008000">数据源对象</span>
<span style="color: #0000ff">private</span> <span style="color: #0000ff">static</span> String className="com.mysql.jdbc.Driver"<span style="color: #000000">;
</span><span style="color: #0000ff">static</span><span style="color: #000000"> {
</span><span style="color: #0000ff">try</span><span style="color: #000000"> {
Class.forName(className);
myDataSorce</span>=<span style="color: #0000ff">new</span><span style="color: #000000"> MyDataSource();
} </span><span style="color: #0000ff">catch</span><span style="color: #000000"> (ClassNotFoundException e) {
</span><span style="color: #0000ff">throw</span> <span style="color: #0000ff">new</span><span style="color: #000000"> RuntimeException(e);
}
}
</span><span style="color: #008000">//</span><span style="color: #008000"> 得到连接</span>
<span style="color: #0000ff">public</span> <span style="color: #0000ff">static</span><span style="color: #000000"> Connection getConn() {
</span><span style="color: #0000ff">return</span><span style="color: #000000"> myDataSorce.getConn();
}
</span><span style="color: #008000">//</span><span style="color: #008000"> 关闭连接</span>
<span style="color: #0000ff">public</span> <span style="color: #0000ff">static</span> <span style="color: #0000ff">void</span><span style="color: #000000"> close(ResultSet rs, Statement stm, Connection conn) {
</span><span style="color: #0000ff">if</span> (rs != <span style="color: #0000ff">null</span><span style="color: #000000">) {
</span><span style="color: #0000ff">try</span><span style="color: #000000"> {
rs.close();
} </span><span style="color: #0000ff">catch</span><span style="color: #000000"> (SQLException e) {
e.printStackTrace();
}
}
</span><span style="color: #0000ff">if</span> (stm != <span style="color: #0000ff">null</span><span style="color: #000000">) {
</span><span style="color: #0000ff">try</span><span style="color: #000000"> {
stm.close();
} </span><span style="color: #0000ff">catch</span><span style="color: #000000"> (SQLException e) {
e.printStackTrace();
}
}
</span><span style="color: #0000ff">if</span> (conn != <span style="color: #0000ff">null</span><span style="color: #000000">) {
myDataSorce.closeConn(conn); </span><span style="color: #008000">//</span><span style="color: #008000">关连接的方式也换掉了</span>
<span style="color: #000000"> }
}
}</span></pre>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div></div>
<p>数据源产品的使用</p>
<p>dbcp DataSource</p>
<p>1) 导入jar 包</p>
<p>commons-collections-3.1.jar</p>
<p>commons-dbcp-1.2.2.jar</p>
<p>commons-pool.jar</p>
<p>配置文件</p>
<p>dbcpconfig.properties</p>
<p>2) 修改配置文件</p>
<p>#连接设置</p>
<p>driverClassName=com.mysql.jdbc.Driver</p>
<p>url=jdbc:mysql://localhost:3306/shop</p>
<p>username=root</p>
<p>password=admin</p>
<p>#<!-- 初始化连接 --></p>
<p>initialSize=10</p>
<p>#最大连接数量</p>
<p>maxActive=50</p>
<p>#<!-- 最大空闲连接 --></p>
<p>maxIdle=20</p>
<p>#<!-- 最小空闲连接 --></p>
<p>minIdle=5</p>
<p>#<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 --></p>
<p>maxWait=60000</p>
<p>#JDBC驱动建立连接时附带的连接属性属性的格式必须为这样:[属性名=property;]</p>
<p>#注意:"user" 与 "password" 两个属性会被明确地传递,因此这里不需要包含他们。</p>
<p>#connectionProperties=useUnicode=true;characterEncoding=gbk</p>
<p>#指定由连接池所创建的连接的自动提交(auto-commit)状态。</p>
<p>#defaultAutoCommit=true</p>
<p>#driver default 指定由连接池所创建的连接的只读(read-only)状态。</p>
<p>#如果没有设置该值,则“setReadOnly”方法将不被调用。(某些驱动并不支持只读模式,如:Informix)</p>
<p>defaultReadOnly=</p>
<p>#driver default 指定由连接池所创建的连接的事务级别(TransactionIsolation)。</p>
<p>#可用值为下列之一:(详情可见javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE</p>
<p>defaultTransactionIsolation=READ_UNCOMMITTED</p>
<div class="cnblogs_code"><div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div>
<pre><span style="color: #0000ff">import</span><span style="color: #000000"> java.io.InputStream;
</span><span style="color: #0000ff">import</span><span style="color: #000000"> java.sql.Connection;
</span><span style="color: #0000ff">import</span><span style="color: #000000"> java.sql.ResultSet;
</span><span style="color: #0000ff">import</span><span style="color: #000000"> java.sql.SQLException;
</span><span style="color: #0000ff">import</span><span style="color: #000000"> java.sql.Statement;
</span><span style="color: #0000ff">import</span><span style="color: #000000"> java.util.Properties;
</span><span style="color: #0000ff">import</span><span style="color: #000000"> javax.sql.DataSource;
</span><span style="color: #0000ff">import</span><span style="color: #000000"> org.apache.commons.dbcp.BasicDataSourceFactory;
</span><span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span><span style="color: #000000"> DBUtil {
</span><span style="color: #0000ff">private</span><span style="color: #000000"> DBUtil() {}
</span><span style="color: #0000ff">private</span> <span style="color: #0000ff">static</span> DataSource dataSource = <span style="color: #0000ff">null</span>; <span style="color: #008000">//</span><span style="color: #008000"> 数据源对象</span>
<span style="color: #0000ff">static</span><span style="color: #000000"> {
</span><span style="color: #0000ff">try</span><span style="color: #000000"> {
</span><span style="color: #008000">//</span><span style="color: #008000"> 读dbcp的配置文件</span>
Properties settings = <span style="color: #0000ff">new</span><span style="color: #000000"> Properties();
InputStream in </span>= DBUtil.<span style="color: #0000ff">class</span>.getClassLoader().getResourceAsStream( "dbcpconfig.properties"<span style="color: #000000">);
settings.load(in);
dataSource</span>=<span style="color: #000000">BasicDataSourceFactory.createDataSource(settings);
} </span><span style="color: #0000ff">catch</span><span style="color: #000000"> (Exception ex) {
ex.printStackTrace();
}
}
</span><span style="color: #008000">//</span><span style="color: #008000"> 得到连接</span>
<span style="color: #0000ff">public</span> <span style="color: #0000ff">static</span><span style="color: #000000"> Connection getConn() {
Connection conn</span>= <span style="color: #0000ff">null</span><span style="color: #000000">;
</span><span style="color: #0000ff">try</span><span style="color: #000000"> {
conn</span>= dataSource.getConnection(); <span style="color: #008000">//</span><span style="color: #008000">返回的是一个代理对象</span>
} <span style="color: #0000ff">catch</span><span style="color: #000000"> (SQLException e) {
e.printStackTrace();
}
</span><span style="color: #0000ff">return</span><span style="color: #000000"> conn;
}
</span><span style="color: #008000">//</span><span style="color: #008000"> 关闭连接</span>
<span style="color: #0000ff">public</span> <span style="color: #0000ff">static</span> <span style="color: #0000ff">void</span><span style="color: #000000"> close(ResultSet rs, Statement stm, Connection conn) {
</span><span style="color: #0000ff">if</span> (rs != <span style="color: #0000ff">null</span><span style="color: #000000">) {
</span><span style="color: #0000ff">try</span><span style="color: #000000"> {
rs.close();
} </span><span style="color: #0000ff">catch</span><span style="color: #000000"> (SQLException e) {
e.printStackTrace();
}
}
</span><span style="color: #0000ff">if</span> (stm != <span style="color: #0000ff">null</span><span style="color: #000000">) {
</span><span style="color: #0000ff">try</span><span style="color: #000000"> {
stm.close();
} </span><span style="color: #0000ff">catch</span><span style="color: #000000"> (SQLException e) {
e.printStackTrace();
}
}
</span><span style="color: #0000ff">if</span> (conn != <span style="color: #0000ff">null</span><span style="color: #000000">) {
</span><span style="color: #0000ff">try</span><span style="color: #000000"> {
conn.close(); </span><span style="color: #008000">//</span><span style="color: #008000">由于 conn 现在是个代理对象,所以它的close方法并不会真正的关掉连接,而是把它放回边接池中</span>
} <span style="color: #0000ff">catch</span><span style="color: #000000"> (SQLException e) {
e.printStackTrace();
}
}
}
}</span></pre>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div></div></div><div id="MySignature"></div>
<div class="clear"></div>
<div id="blog_post_info_block">
<div id="BlogPostCategory"></div>
<div id="EntryTag"></div>
<div id="blog_post_info"><div id="green_channel">
<a href="javascript:void(0);" id="green_channel_digg" onclick="DiggIt(7273251,cb_blogId,1);green_channel_success(this,'谢谢推荐!');">好文要顶</a>
<a id="green_channel_follow" onclick="follow('5fc07fdb-222b-e711-9fc1-ac853d9f53cc');" href="javascript:void(0);">关注我</a>
<a id="green_channel_favorite" onclick="AddToWz(cb_entryId);return false;" href="javascript:void(0);">收藏该文</a>
<a id="green_channel_weibo" href="javascript:void(0);" title="分享至新浪微博" onclick="ShareToTsina()"><img src="//common.cnblogs.com/images/icon_weibo_24.png" alt=""></a>
<a id="green_channel_wechat" href="javascript:void(0);" title="分享至微信" onclick="shareOnWechat()"><img src="//common.cnblogs.com/images/wechat.png" alt=""></a>
</div>
<div id="author_profile">
<div id="author_profile_info" class="author_profile_info">
<a href="http://home.cnblogs.com/u/1693977889zz/" target="_blank"><img src="//pic.cnblogs.com/face/1155461/20170527114145.png" class="author_avatar" alt=""></a>
<div id="author_profile_detail" class="author_profile_info">
<a href="http://home.cnblogs.com/u/1693977889zz/">zzbd4444</a><br>
<a href="http://home.cnblogs.com/u/1693977889zz/followees">关注 - 0</a><br>
<a href="http://home.cnblogs.com/u/1693977889zz/followers">粉丝 - 20</a>
</div>
</div>
<div class="clear"></div>
<div id="author_profile_honor"></div>
<div id="author_profile_follow">
<a href="javascript:void(0);" onclick="follow('5fc07fdb-222b-e711-9fc1-ac853d9f53cc');return false;">+加关注</a>
</div>
</div>
<div id="div_digg">
<div class="diggit" onclick="votePost(7273251,'Digg')">
<span class="diggnum" id="digg_count">0</span>
</div>
<div class="buryit" onclick="votePost(7273251,'Bury')">
<span class="burynum" id="bury_count">0</span>
</div>
<div class="clear"></div>
<div class="diggword" id="digg_tips">
</div>
</div>
</div>
<div class="clear"></div>
<div id="post_next_prev"><a href="http://www.cnblogs.com/1693977889zz/p/7267420.html" class="p_n_p_prefix">« </a> 上一篇:<a href="http://www.cnblogs.com/1693977889zz/p/7267420.html" title="发布于2017-08-01 11:09">Java JDBC的基础知识(四)</a><br></div>
</div>
</div>
<div class="postDesc">posted @ <span id="post-date">2017-08-02 12:18</span> <a href="http://www.cnblogs.com/1693977889zz/">zzbd4444</a> 阅读(<span id="post_view_count">30</span>) 评论(<span id="post_comment_count">0</span>) <a href="https://i.cnblogs.com/EditPosts.aspx?postid=7273251" rel="nofollow">编辑</a> <a href="#" onclick="AddToWz(7273251);return false;">收藏</a></div>
</div>
<script type="text/javascript">var allowComments=true,cb_blogId=351825,cb_entryId=7273251,cb_blogApp=currentBlogApp,cb_blogUserGuid='5fc07fdb-222b-e711-9fc1-ac853d9f53cc',cb_entryCreatedDate='2017/8/2 12:18:00';loadViewCount(cb_entryId);</script>
</div><!--end: topics 文章、评论容器-->
</div><a name="!comments"></a><div id="blog-comments-placeholder"></div><script type="text/javascript">var commentManager = new blogCommentManager();commentManager.renderComments(0);</script>
<div id="comment_form" class="commentform">
<a name="commentform"></a>
<div id="divCommentShow"></div>
<div id="comment_nav"><span id="span_refresh_tips"></span><a href="javascript:void(0);" onclick="return RefreshCommentList();" id="lnk_RefreshComments" runat="server" clientidmode="Static">刷新评论</a><a href="#" onclick="return RefreshPage();">刷新页面</a><a href="#top">返回顶部</a></div>
<div id="comment_form_container">
<div id="commentform_title">发表评论</div>
<span id="tip_comment" style="color:Red"></span>
<p>
昵称:<input id="tbCommentAuthor" class="author" disabled="disabled" size="50" value="百度程序员" type="text">
</p>
<div class="commentbox_main">
<div class="commentbox_title">
<div class="commentbox_title_left">评论内容:</div>
<div class="commentbox_title_right">
<img id="ubb_quote" class="comment_icon" src="http://static.cnblogs.com/images/ubb/quote.gif" alt="引用" title="添加引用" onclick="insertUBB('tbCommentBody','quote')">
<img id="ubb_bold" class="comment_icon" src="http://static.cnblogs.com/images/ubb/b.png" alt="粗体" title="添加粗体" onclick="insertUBB('tbCommentBody','b')">
<img id="ubb_url" class="comment_icon" src="http://static.cnblogs.com/images/ubb/lk.png" alt="链接" title="添加链接" onclick="insertUbbUrl('tbCommentBody')">
<img id="ubb_indent" class="comment_icon" src="http://static.cnblogs.com/images/ubb/indent.png" alt="缩进" title="添加首行缩进" onclick="insertIndent('tbCommentBody')">
<img id="ubb_code" class="comment_icon" src="http://static.cnblogs.com/images/ubb/InsertCode.gif" alt="代码" title="添加代码" onclick="insertUbbCode()">
<img id="ubb_img" class="comment_icon" src="http://static.cnblogs.com/images/ubb/img.gif" alt="图片" title="上传图片" onclick="OpenImageUploadWindow();">
</div>
</div>
<div class="clear"></div>
<textarea id="tbCommentBody" class="comment_textarea"></textarea>
</div>
<p id="commentbox_opt">
<input id="btn_comment_submit" class="comment_btn" value="提交评论" type="button">
<span id="span_comment_canceledit" style="display:none"><a href="javascript:void(0);" onclick="return CancelCommentEdit()">不改了</a></span>
<a href="javascript:void(0);" onclick="return logout();">退出</a>
<a id="commentbox_opt_sub" href="javascript:void(0);" title="订阅后有新评论时会邮件通知您" onclick="commentManager.Subscribe()">订阅评论</a>
</p>
<div id="tip_comment2" style="color:Red"></div>
<p>
[Ctrl+Enter快捷键提交]
</p>
<div style="display:none">
<span id="comment_edit_id"></span><span id="span_parentcomment_id"></span>
<span id="span_parent_id"></span>
<span id="span_comment_replyto"></span>
<span id="span_comment_posted"></span>
</div>
</div>
<div class="ad_text_commentbox" id="ad_text_under_commentbox"></div>
<div id="ad_t2"><a href="http://www.ucancode.com/index.htm" target="_blank">【推荐】50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库</a><br><a href="http://fineui.com/demo_pro/" target="_blank">【推荐】9 年 ASP.NET 控件库,750 多个在线示例</a><br><a href="http://click.aliyun.com/m/18488/" target="_blank">【推荐】阿里云“全民云计算”优惠升级</a><br></div>
<div id="opt_under_post"></div>
<div id="cnblogs_c1" class="c_ad_block"><a href="http://cn.udacity.com/fend/?utm_source=cnblogs&utm_medium=banner&utm_campaign=FEND06" target="_blank"><img src="https://images2017.cnblogs.com/news/24442/201707/24442-20170727142034227-75985706.png" alt="Udacity 07.27-08.03" width="300" height="250"></a></div>
<div id="under_post_news"><div class="itnews c_ad_block"><b>最新IT新闻</b>:<br> · <a href="http://news.cnblogs.com/n/575146/" target="_blank">扎克伯格:有目标感的人,天生具有影响力,哪怕你是一个新人</a><br> · <a href="http://news.cnblogs.com/n/575145/" target="_blank">为什么说阿里和腾讯,有可能赶超亚马逊和facebook?</a><br> · <a href="http://news.cnblogs.com/n/575144/" target="_blank">天猫上线奢侈品频道Luxury Pavilion,但你不一定看得到</a><br> · <a href="http://news.cnblogs.com/n/575142/" target="_blank">苹果现金储备增至2615亿美元 足够买下波音和特斯拉</a><br> · <a href="http://news.cnblogs.com/n/575141/" target="_blank">.NET Core引入性能分析引导优化</a><br>» <a href="http://news.cnblogs.com/" title="IT新闻" target="_blank">更多新闻...</a></div></div>
<div id="cnblogs_c2" class="c_ad_block"><a href="https://www.jiguang.cn/devservice?source=bky&hmsr=%E5%8D%9A%E5%AE%A2%E5%9B%AD&hmpl=&hmcu=&hmkw=&hmci=" target="_blank"><img src="https://images2015.cnblogs.com/news/24442/201706/24442-20170629165247758-2056260207.png" alt="极光推广_0701" width="468" height="60"></a></div>
<div id="under_post_kb"><div class="itnews c_ad_block" id="kb_block"><b>最新知识库文章</b>:<br><div id="kb_recent"> · <a href="http://kb.cnblogs.com/page/571915/" target="_blank">为什么你该开始学习编程了?</a><br> · <a href="http://kb.cnblogs.com/page/570194/" target="_blank">小printf的故事:什么是真正的程序员?</a><br> · <a href="http://kb.cnblogs.com/page/569992/" target="_blank">程序员的工作、学习与绩效</a><br> · <a href="http://kb.cnblogs.com/page/569056/" target="_blank">软件开发为什么很难</a><br> · <a href="http://kb.cnblogs.com/page/565901/" target="_blank">唱吧DevOps的落地,微服务CI/CD的范本技术解读</a><br></div>» <a href="http://kb.cnblogs.com/" target="_blank">更多知识库文章...</a></div></div>
<div id="HistoryToday" class="c_ad_block"></div>
<script type="text/javascript">
fixPostBody();
setTimeout(function () { incrementViewCount(cb_entryId); }, 50);
deliverAdT2();
deliverAdC1();
deliverAdC2();
loadNewsAndKb();
loadBlogSignature();
LoadPostInfoBlock(cb_blogId, cb_entryId, cb_blogApp, cb_blogUserGuid);
GetPrevNextPost(cb_entryId, cb_blogId, cb_entryCreatedDate);
loadOptUnderPost();
GetHistoryToday(cb_blogId, cb_blogApp, cb_entryCreatedDate);
</script>
</div>
</div><!--end: forFlow -->
</div><!--end: mainContent 主体内容容器-->
<div id="sideBar">
<div id="sideBarMain">
<!--done-->
<div class="newsItem">
<h3 class="catListTitle">公告</h3>
<div id="blog-news"><div id="profile_block">昵称:<a href="http://home.cnblogs.com/u/1693977889zz/">zzbd4444</a><br>园龄:<a href="http://home.cnblogs.com/u/1693977889zz/" title="入园时间:2017-04-27">3个月</a><br>粉丝:<a href="http://home.cnblogs.com/u/1693977889zz/followers/">20</a><br>关注:<a href="http://home.cnblogs.com/u/1693977889zz/followees/">0</a><div id="p_b_follow"><a href="javascript:void(0);" onclick="follow('5fc07fdb-222b-e711-9fc1-ac853d9f53cc')">+加关注</a></div></div></div><script type="text/javascript">loadBlogNews();</script>
</div>
<div id="blog-calendar" style=""><table id="blogCalendar" class="Cal" title="Calendar" cellspacing="0" cellpadding="0">
<tbody><tr><td colspan="7"><table class="CalTitle" cellspacing="0">
<tbody><tr><td class="CalNextPrev"><a href="javascript:void(0);" onclick="loadBlogCalendar('2017/07/01');return false;"><</a></td><td align="center">2017年8月</td><td class="CalNextPrev" align="right"><a href="javascript:void(0);" onclick="loadBlogCalendar('2017/09/01');return false;">></a></td></tr>
</tbody></table></td></tr><tr><th class="CalDayHeader" abbr="日" scope="col" align="center">日</th><th class="CalDayHeader" abbr="一" scope="col" align="center">一</th><th class="CalDayHeader" abbr="二" scope="col" align="center">二</th><th class="CalDayHeader" abbr="三" scope="col" align="center">三</th><th class="CalDayHeader" abbr="四" scope="col" align="center">四</th><th class="CalDayHeader" abbr="五" scope="col" align="center">五</th><th class="CalDayHeader" abbr="六" scope="col" align="center">六</th></tr><tr><td class="CalOtherMonthDay" align="center">30</td><td class="CalOtherMonthDay" align="center">31</td><td align="center"><a href="http://www.cnblogs.com/1693977889zz/archive/2017/08/01.html"><u>1</u></a></td><td class="CalTodayDay" align="center"><a href="http://www.cnblogs.com/1693977889zz/archive/2017/08/02.html"><u>2</u></a></td><td align="center">3</td><td align="center">4</td><td class="CalWeekendDay" align="center">5</td></tr><tr><td class="CalWeekendDay" align="center">6</td><td align="center">7</td><td align="center">8</td><td align="center">9</td><td align="center">10</td><td align="center">11</td><td class="CalWeekendDay" align="center">12</td></tr><tr><td class="CalWeekendDay" align="center">13</td><td align="center">14</td><td align="center">15</td><td align="center">16</td><td align="center">17</td><td align="center">18</td><td class="CalWeekendDay" align="center">19</td></tr><tr><td class="CalWeekendDay" align="center">20</td><td align="center">21</td><td align="center">22</td><td align="center">23</td><td align="center">24</td><td align="center">25</td><td class="CalWeekendDay" align="center">26</td></tr><tr><td class="CalWeekendDay" align="center">27</td><td align="center">28</td><td align="center">29</td><td align="center">30</td><td align="center">31</td><td class="CalOtherMonthDay" align="center">1</td><td class="CalOtherMonthDay" align="center">2</td></tr><tr><td class="CalOtherMonthDay" align="center">3</td><td class="CalOtherMonthDay" align="center">4</td><td class="CalOtherMonthDay" align="center">5</td><td class="CalOtherMonthDay" align="center">6</td><td class="CalOtherMonthDay" align="center">7</td><td class="CalOtherMonthDay" align="center">8</td><td class="CalOtherMonthDay" align="center">9</td></tr>
</tbody></table></div><script type="text/javascript">loadBlogDefaultCalendar();</script>
<div id="leftcontentcontainer">
<div id="blog-sidecolumn"><div id="sidebar_search" class="sidebar-block">
<div id="sidebar_search" class="mySearch">
<h3 class="catListTitle">搜索</h3>
<div id="sidebar_search_box">
<div id="widget_my_zzk" class="div_my_zzk"><input id="q" onkeydown="return zzk_go_enter(event);" class="input_my_zzk" type="text"> <input onclick="zzk_go()" value="找找看" id="btnZzk" class="btn_my_zzk" type="button"></div>
<div id="widget_my_google" class="div_my_zzk"><input name="google_q" id="google_q" onkeydown="return google_go_enter(event)" class="input_my_zzk" type="text"> <input onclick="google_go()" value="谷歌搜索" class="btn_my_zzk" type="button"></div>
</div>
</div>
</div><div id="sidebar_shortcut" class="sidebar-block">
<div class="catListLink">
<h3 class="catListTitle">常用链接</h3>
<ul>
<li><a href="http://www.cnblogs.com/1693977889zz/p/" title="我的博客的随笔列表">我的随笔</a></li><li><a href="http://www.cnblogs.com/1693977889zz/MyComments.html" title="我发表过的评论列表">我的评论</a></li><li><a href="http://www.cnblogs.com/1693977889zz/OtherPosts.html" title="我评论过的随笔列表">我的参与</a></li><li><a href="http://www.cnblogs.com/1693977889zz/RecentComments.html" title="我的博客的评论列表">最新评论</a></li><li><a href="http://www.cnblogs.com/1693977889zz/tag/" title="我的博客的标签列表">我的标签</a></li>
</ul>
<div id="itemListLin_con" style="display:none;">
<ul>
</ul>
</div>
</div></div><div id="sidebar_toptags" class="sidebar-block"></div><div id="sidebar_categories">
<div id="sidebar_postarchive" class="catListPostArchive sidebar-block">
<h3 class="catListTitle">随笔档案</h3>
<ul>
<li><a id="CatList_LinkList_0_Link_0" href="http://www.cnblogs.com/1693977889zz/archive/2017/08.html">2017年8月 (2)</a> </li>
<li><a id="CatList_LinkList_0_Link_1" href="http://www.cnblogs.com/1693977889zz/archive/2017/07.html">2017年7月 (28)</a> </li>
<li><a id="CatList_LinkList_0_Link_2" href="http://www.cnblogs.com/1693977889zz/archive/2017/06.html">2017年6月 (28)</a> </li>
<li><a id="CatList_LinkList_0_Link_3" href="http://www.cnblogs.com/1693977889zz/archive/2017/05.html">2017年5月 (4)</a> </li>
</ul>
</div>
</div><div id="sidebar_recentcomments" class="sidebar-block"><div id="recent_comments_wrap">
<div class="catListComment">
<h3 class="catListTitle">最新评论</h3>
<div id="RecentCommentsBlock"><ul>
<li class="recent_comment_title"><a href="http://www.cnblogs.com/1693977889zz/p/7230082.html#3744599">1. Re:MySQL的相关应用</a></li>
<li class="recent_comment_body">@sugar2017不会啊,我测试可以啊,要不你加我QQ1693977889 我们沟通一下?...</li>
<li class="recent_comment_author">--zzbd4444</li>
<li class="recent_comment_title"><a href="http://www.cnblogs.com/1693977889zz/p/7230082.html#3744595">2. Re:MySQL的相关应用</a></li>
<li class="recent_comment_body">@zzbd4444话说你第一条的那个方法跟我想的是一样的啊,但是我这边还是求不出来……...</li>
<li class="recent_comment_author">--sugar2017</li>
<li class="recent_comment_title"><a href="http://www.cnblogs.com/1693977889zz/p/7230082.html#3744509">3. Re:MySQL的相关应用</a></li>
<li class="recent_comment_body">@zzbd4444一定,等下我问到答案贴上来...</li>
<li class="recent_comment_author">--sugar2017</li>
<li class="recent_comment_title"><a href="http://www.cnblogs.com/1693977889zz/p/7230082.html#3744483">4. Re:MySQL的相关应用</a></li>
<li class="recent_comment_body">@sugar2017嗯嗯,如果你有答案了,方便粘贴给我一份么。感激...</li>
<li class="recent_comment_author">--zzbd4444</li>
<li class="recent_comment_title"><a href="http://www.cnblogs.com/1693977889zz/p/7230082.html#3744459">5. Re:MySQL的相关应用</a></li>
<li class="recent_comment_body">@zzbd4444嗯谢谢楼主,我最近学的这数据库,感觉不会用啊,好焦心……等会问下我们培训班的老师,啊啊啊逻辑不行啊...</li>
<li class="recent_comment_author">--sugar2017</li>
</ul>
</div>
</div>
</div></div><div id="sidebar_topviewedposts" class="sidebar-block"><div id="topview_posts_wrap">
<div class="catListView">
<h3 class="catListTitle">阅读排行榜</h3>
<div id="TopViewPostsBlock"><ul><li><a href="http://www.cnblogs.com/1693977889zz/p/7089320.html">1. Java重写equals方法(重点讲解)(147)</a></li><li><a href="http://www.cnblogs.com/1693977889zz/p/7124567.html">2. Java基础——死锁(138)</a></li><li><a href="http://www.cnblogs.com/1693977889zz/p/7110035.html">3. Java基础——6种常用类讲解(138)</a></li><li><a href="http://www.cnblogs.com/1693977889zz/p/7121141.html">4. Java基础——线程(125)</a></li><li><a href="http://www.cnblogs.com/1693977889zz/p/7045833.html">5. Java基础——关于接口和抽象类的几道练习题(114)</a></li></ul></div>
</div>
</div></div><div id="sidebar_topcommentedposts" class="sidebar-block"><div id="topfeedback_posts_wrap">
<div class="catListFeedback">
<h3 class="catListTitle">评论排行榜</h3>
<div id="TopFeedbackPostsBlock"><ul><li><a href="http://www.cnblogs.com/1693977889zz/p/7230082.html">1. MySQL的相关应用(8)</a></li><li><a href="http://www.cnblogs.com/1693977889zz/p/6916228.html">2. 我的第一个Java程序(4)</a></li><li><a href="http://www.cnblogs.com/1693977889zz/p/6972906.html">3. Java对象与类中的一个小练习(3)</a></li><li><a href="http://www.cnblogs.com/1693977889zz/p/6965563.html">4. Java基础——数组(2)</a></li><li><a href="http://www.cnblogs.com/1693977889zz/p/7028469.html">5. Java基础——抽象类和接口(1)</a></li></ul></div>
</div>
</div></div><div id="sidebar_topdiggedposts" class="sidebar-block"><div id="topdigg_posts_wrap">
<div class="catListView">
<h3 class="catListTitle">推荐排行榜</h3>
<div id="TopDiggPostsBlock"><ul><li><a href="http://www.cnblogs.com/1693977889zz/p/6964014.html">1. Java基本——数据类型(1)</a></li><li><a href="http://www.cnblogs.com/1693977889zz/p/7262739.html">2. Java JDBC的基础知识(一)(1)</a></li><li><a href="http://www.cnblogs.com/1693977889zz/p/7199876.html">3. 前端基础——HTML(1)</a></li></ul></div>
</div></div></div></div><script type="text/javascript">loadBlogSideColumn();</script>
</div>
</div><!--end: sideBarMain -->
</div><!--end: sideBar 侧边栏容器 -->
<div class="clear"></div>