<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>戈壁滩上的狗尾巴花 &#187; JDBC</title>
	<atom:link href="http://liguoliang.com/tag/jdbc/feed/" rel="self" type="application/rss+xml" />
	<link>http://liguoliang.com</link>
	<description>戈壁滩上盛开的一坨狗尾巴花</description>
	<lastBuildDate>Wed, 08 Sep 2010 13:03:58 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>[旧]Java: JDBC 取得ResultSet的长度</title>
		<link>http://liguoliang.com/2010/%e6%97%a7java-jdbc-%e5%8f%96%e5%be%97resultset%e7%9a%84%e9%95%bf%e5%ba%a6/</link>
		<comments>http://liguoliang.com/2010/%e6%97%a7java-jdbc-%e5%8f%96%e5%be%97resultset%e7%9a%84%e9%95%bf%e5%ba%a6/#comments</comments>
		<pubDate>Sun, 29 Aug 2010 10:19:17 +0000</pubDate>
		<dc:creator>老李</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[JDBC]]></category>

		<guid isPermaLink="false">http://liguoliang.com/2010/08/1476/</guid>
		<description><![CDATA[<p>JDBC 取得ResultSet的长度:
<pre name="code" class="java">
	resultSet.last(); // 游标移到最后, 获得rs长度
			int length = resultSet.getRow();
			resultSet.first(); // 还原游标到rs开头
</pre>]]></description>
			<content:encoded><![CDATA[<p>JDBC 取得ResultSet的长度:
<pre name="code" class="java">
	resultSet.last(); // 游标移到最后, 获得rs长度
			int length = resultSet.getRow();
			resultSet.first(); // 还原游标到rs开头
</pre>
]]></content:encoded>
			<wfw:commentRss>http://liguoliang.com/2010/%e6%97%a7java-jdbc-%e5%8f%96%e5%be%97resultset%e7%9a%84%e9%95%bf%e5%ba%a6/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>[旧文存档]JDBC: java.sql.SQLException: 结果集已耗尽 &amp; 对只转发结果集的无效操作</title>
		<link>http://liguoliang.com/2010/%e6%97%a7%e6%96%87%e5%ad%98%e6%a1%a3jdbc-java-sql-sqlexception-%e7%bb%93%e6%9e%9c%e9%9b%86%e5%b7%b2%e8%80%97%e5%b0%bd-%e5%af%b9%e5%8f%aa%e8%bd%ac%e5%8f%91%e7%bb%93%e6%9e%9c%e9%9b%86%e7%9a%84/</link>
		<comments>http://liguoliang.com/2010/%e6%97%a7%e6%96%87%e5%ad%98%e6%a1%a3jdbc-java-sql-sqlexception-%e7%bb%93%e6%9e%9c%e9%9b%86%e5%b7%b2%e8%80%97%e5%b0%bd-%e5%af%b9%e5%8f%aa%e8%bd%ac%e5%8f%91%e7%bb%93%e6%9e%9c%e9%9b%86%e7%9a%84/#comments</comments>
		<pubDate>Sun, 29 Aug 2010 10:01:47 +0000</pubDate>
		<dc:creator>老李</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[java.sql.SQLException]]></category>
		<category><![CDATA[JDBC]]></category>

		<guid isPermaLink="false">http://liguoliang.com/2010/08/1472/</guid>
		<description><![CDATA[1. java.sql.SQLException: 结果集已耗尽 
<p>原因: 执行的数据库查询没有查询到任何结果，却调用了resultSet.next(). </p>
2. java.sql.SQLException: 对只转发结果集的无效操作:
<p> 如果conn在创建时, 若不给定参数，预设是ResultSe</p>]]></description>
			<content:encoded><![CDATA[<h3>1. java.sql.SQLException: 结果集已耗尽 </h3>
<p>原因: 执行的数据库查询没有查询到任何结果，却调用了resultSet.next(). </p>
<h3>2. java.sql.SQLException: 对只转发结果集的无效操作:</h3>
<p> 如果conn在创建时, 若不给定参数，预设是ResultSet.TYPE_FORWARD_ONLY、 ResultSet.CONCUR_READ_ONL, 此时不可进行游标操作, 会报错: java.sql.SQLException: 对只转发结果集的无效操作.    <br />欲操作游标, 则应使用stmt=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);</p>
]]></content:encoded>
			<wfw:commentRss>http://liguoliang.com/2010/%e6%97%a7%e6%96%87%e5%ad%98%e6%a1%a3jdbc-java-sql-sqlexception-%e7%bb%93%e6%9e%9c%e9%9b%86%e5%b7%b2%e8%80%97%e5%b0%bd-%e5%af%b9%e5%8f%aa%e8%bd%ac%e5%8f%91%e7%bb%93%e6%9e%9c%e9%9b%86%e7%9a%84/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Flex BlazeDS Java JDBC MySql 快速配置</title>
		<link>http://liguoliang.com/2009/flex-blazeds-java-jdbc-mysql-%e9%80%9f%e9%85%8d%e5%bf%ab%e9%80%9f%e9%85%8d%e7%bd%ae/</link>
		<comments>http://liguoliang.com/2009/flex-blazeds-java-jdbc-mysql-%e9%80%9f%e9%85%8d%e5%bf%ab%e9%80%9f%e9%85%8d%e7%bd%ae/#comments</comments>
		<pubDate>Fri, 20 Feb 2009 08:48:27 +0000</pubDate>
		<dc:creator>老李</dc:creator>
				<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[BlazeDS]]></category>
		<category><![CDATA[JDBC]]></category>
		<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://liguoliang.com/2009/02/793/</guid>
		<description><![CDATA[<p>从下往上:<a href="http://liguoliang.com/wp-content/uploads/2009/02/image9.png"><img style="display: inline; margin-left: 0px; margin-right: 0px; border-width: 0px;" title="image" src="http://liguoliang.com/wp-content/uploads/2009/02/image-thumb9.png" border="0" alt="image" width="330" height="540" align="right" /></a></p>
<p><strong>1. Java – JDBC – MySql</strong></p>
<p>1. 装好MySql, 启动服务.</p>
<p>2. 将mysql-connector-java-5.1.7-bin.jar 拖入WEB-INF/lib下.</p>
<p>搞定.</p>
<p><a href="http://liguoliang.com/wp-content/uploads/2009/02/image10.png"></a></p>
<p><strong>2. Java端BlazeDS配置</strong></p>
<p>1. Java端:</p>
<p>将BlazeDS压缩包内的WE</p>]]></description>
			<content:encoded><![CDATA[<p>从下往上:<a href="http://liguoliang.com/wp-content/uploads/2009/02/image9.png"><img style="display: inline; margin-left: 0px; margin-right: 0px; border-width: 0px;" title="image" src="http://liguoliang.com/wp-content/uploads/2009/02/image-thumb9.png" border="0" alt="image" width="330" height="540" align="right" /></a></p>
<p><strong>1. Java – JDBC – MySql</strong></p>
<p>1. 装好MySql, 启动服务.</p>
<p>2. 将mysql-connector-java-5.1.7-bin.jar 拖入WEB-INF/lib下.</p>
<p>搞定.</p>
<p><a href="http://liguoliang.com/wp-content/uploads/2009/02/image10.png"></a></p>
<p><strong>2. Java端BlazeDS配置</strong></p>
<p>1. Java端:</p>
<p>将BlazeDS压缩包内的WEB-INF里面的东西拷贝工程内的WEB-INF下的相应位置中.[ Flex目录下有四个xml配置文件, lib下是需要使用的jar] 包括web.xm</p>
<p>2. 配置services-config.xml中channels标签中的内容:</p>
<pre class="xml">

                false

true
4
</pre>
<p>其中, http://localhost:8080/DepartmentManagement/ 是该Web工程的地址 [可在web-content下建立一空index.html, 运行后查看地址便可]</p>
<p>3. 编写Java类, 并配置remoting-config.xml文件的&lt;service&gt;标签下, 增加服务, 如下:</p>
<pre class="xml">

         com.insprise.guoliang.DepartmentManagement
</pre>
<p><strong>3. Flex端建立工程</strong></p>
<p>1. 建立 Flex与Java通信载体RemoteObject</p>
<p>为方便在整个工程中使用, 可建立一个Singleton &#8211; 关于AS中的Singleton可见: <a title="http://liguoliang.com/2008/10/128/" href="http://liguoliang.com/2008/10/128/">http://liguoliang.com/2008/10/128/</a></p>
<p>在该类中建立RemoteObject.</p>
<p>首先需要确定RemoteObject的destination, 在本例中 为&#8221;DepartmentManagement&#8221;; &#8211; 在<strong>remoting-config.xml中已配置.</strong></p>
<p>其次需要确定ro的channel &#8211; 本例中为:&#8221;http://localhost:8080/DepartmentManagement/messagebroker/amf＂； － 在<strong>services-config.xml中已配置</strong></p>
<p>代码:</p>
<pre class="java">	public static const DEFAULT_DEST:String = "DepartmentManagement";
	public static const DEFAULT_CHANNEL_URL:String = "http://localhost:8080/DepartmentManagement/messagebroker/amf";
	private static var _ro:RemoteObject;

	/**
	 * Constractor - Singleton
	 */
	 public function AppContext():void {
	 	throw new Error("AppContext is Singleton!");
	 }

	/**
	 * Get RemoteObject
	 */
	public static function getRemoteObject():RemoteObject {
		if(_ro == null) {
			_ro = createRemoteObject(DEFAULT_DEST, DEFAULT_CHANNEL_URL);
		}
		return _ro;
	}

	/**
	 * Constructs a new remote object with new channel.
	 * @param roDestination Destination of the RemoteObject; should match a destination name in the services-config.xml file.
	 * @param channelURI the URI used to create the whole endpoint URI for this channel; this uri can be relative uri (to the folder containing the SWF).
	 * @param channelId the id of the channel, if set to null, a random Id will be assigned.
	 */
	protected static function createRemoteObject(roDestination:String, channelURI:String, channelId:String = null):RemoteObject {
		var channelSet:ChannelSet = new ChannelSet();
		var channel:AMFChannel = new AMFChannel(channelId == null ? "channel-" : channelId, channelURI);	//Create new Channel
		channelSet.addChannel(channel);	

		var ro:RemoteObject = new RemoteObject(roDestination);
		ro.channelSet = channelSet;

		return ro;
	}</pre>
<p><strong>4 配置完成,.</strong></p>
<p>在Java端建立相关的Class,</p>
<p>启动服务器.</p>
<p>在Flex端通过 Appcontext.getRemoteObject.getOperation(“方法名称”)来调用服务器端方法.</p>
<p>具体实例:</p>
<p><strong>Java端的Class &#8211; 通过JDBC 读取 MySql中数据:</strong></p>
<pre class="java">	/**
	 * Load all Department and return an ArrayList
	 * @return
	 */
	public ArrayList loadDepartments() {
		ArrayList departmentsAL = new ArrayList();
		log.info("Loading Departments...");
		try {
			//Get Connection
			Connection conn = JdbcUtilities.getConnection();
			//Create statement
			String sql = " SELECT * FROM Department d ORDER BY d.Department_ID";
			PreparedStatement ps = conn.prepareStatement(sql);

			ResultSet res = ps.executeQuery();
			log.debug("Exectuing: " + sql);
			while (res.next()) {
				int id = res.getInt("Department_ID");
				String name = res.getString("name");

				Department dp = new Department();
				dp.setId(id);
				dp.setName(name);
				departmentsAL.add(dp);
				log.debug("从数据库获得部门:  " + dp);
			}
			JdbcUtilities.closeConn(res, ps, conn);
			log.info("加载部门信息结束, 共加载部门: " + departmentsAL.size());
		} catch (Exception e) {
			log.error("SQL Error", e);
			throw new Error(e);
		}
		return departmentsAL;

	}</pre>
<p>Flex端的代码:</p>
<pre class="java">		/**
	 * Load the Department's Employee
	 */

	private var op:AbstractOperation;
	public function loadEmployees():void {
		op = AppContext.getRemoteObject().getOperation("loadEmployees");	//获得Operation
		 op.arguments = [id];	//设定参数
		 var at:AsyncToken = op.send();	//Send
		 at.addResponder(this);	//为本实例增加responder

      }</pre>
<p>Flex端responder剩余代码见:http://liguoliang.com/2009/02/777/</p>
<p>运行Flex工程, Flex取得RemoteObject, 然后通过channel建立到destination的连接,由Java读取数据库中信息, 并返回给Flex.</p>
]]></content:encoded>
			<wfw:commentRss>http://liguoliang.com/2009/flex-blazeds-java-jdbc-mysql-%e9%80%9f%e9%85%8d%e5%bf%ab%e9%80%9f%e9%85%8d%e7%bd%ae/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>JDBC中Preparedstatement使用小结 及JDBC插入数据后获得Last insert ID</title>
		<link>http://liguoliang.com/2009/jdbc%e4%b8%adpreparedstatement%e4%bd%bf%e7%94%a8%e5%b0%8f%e7%bb%93-%e5%8f%8ajdbc%e6%8f%92%e5%85%a5%e6%95%b0%e6%8d%ae%e5%90%8e%e8%8e%b7%e5%be%97last-insert-id/</link>
		<comments>http://liguoliang.com/2009/jdbc%e4%b8%adpreparedstatement%e4%bd%bf%e7%94%a8%e5%b0%8f%e7%bb%93-%e5%8f%8ajdbc%e6%8f%92%e5%85%a5%e6%95%b0%e6%8d%ae%e5%90%8e%e8%8e%b7%e5%be%97last-insert-id/#comments</comments>
		<pubDate>Thu, 19 Feb 2009 02:20:46 +0000</pubDate>
		<dc:creator>老李</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[JDBC]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PreparedStatement]]></category>

		<guid isPermaLink="false">http://liguoliang.com/2009/02/773/</guid>
		<description><![CDATA[<p>编写SQL语句, 尤其是要插入多个Filed时, 是一件非常BT的事情, 至少让我很不爽, 使用preparedstatement可以使代码变得更优雅一些, 虽然会有些长, 但会更条理, 而且preparedstatement更高于SQL语句 &#8211; 相对来说不太容易随着数据库版本改变而变动</p>]]></description>
			<content:encoded><![CDATA[<p>编写SQL语句, 尤其是要插入多个Filed时, 是一件非常BT的事情, 至少让我很不爽, 使用preparedstatement可以使代码变得更优雅一些, 虽然会有些长, 但会更条理, 而且preparedstatement更高于SQL语句 &#8211; 相对来说不太容易随着数据库版本改变而变动. 另外preparedstatement效率更高, 安全性更好</p>
<p>下面是恐怖的SQL:</p>
<pre class="java">			Statement statement = (Statement) conn.createStatement();
			String sql = "INSERT INTO `DEP`.`employee` " +
					"( `name` , `age` , `address` , `isMale` , `level` , `Department_ID` ) " +
					"VALUES (" +
					"'" + emp.getName() + "', " +
					emp.getAge()  + ", " +
					 JdbcUtilities.getSqlForString(emp.getAddress()) + ", " +
					emp.getIsMale() + ", "  +
					emp.getLevel() + ", " +
					emp.getDepartment_ID() + ");"
					;

			log.debug("Executing sql :" + sql);
			statement.executeUpdate(sql);

			ResultSet rs = statement.executeQuery("SELECT last_insert_id();");// .execute("SELECT last_insert_id();");
			if(rs.next()) {
				System.out.println(rs.getInt("1"));
			}</pre>
<p>这里是使用PreparedStatement后的语句:</p>
<pre class="java">			String psql = "INSERT INTO Employee (name, age, address, isMale, level, Department_ID) VALUES (?, ?, ?, ?, ?, ?)";
			PreparedStatement ps  = conn.prepareStatement(psql,Statement.RETURN_GENERATED_KEYS);

			ps.setString(1, emp.getName());
			ps.setInt(2, emp.getAge());
			ps.setString(3, emp.getAddress());
			ps.setInt(4, emp.getIsMale());
			ps.setInt(5, emp.getLevel());
			ps.setInt(6, emp.getDepartment_ID());

			ps.executeUpdate();

			ResultSet keys = ps.getGeneratedKeys(); // equivalent to "SELECT last_insert_id();"

			if(keys.next()) {
				System.out.println(keys.getInt(1));
			}</pre>
<p>PreparedStatement的使用步骤:</p>
<ol>
<li>
<p class="list">声明 PreparedStatement。</p>
<pre>PreparedStatement prepStmt;</pre>
</li>
<li>
<p class="list">将一条 SQL 语句指派给 PreparedStatement 对象。</p>
<pre>prepStmt = conn.prepareStatement(
   "INSERT INTO MyTable(MyColumn) values (?)");</pre>
</li>
<li>
<p class="list">为该语句指派输入参数值。</p>
<p class="list">以下代码显示一个字符串参数。</p>
<pre>String newValue;
// assign value
prepStmt.setStringParameter(1, newValue);</pre>
</li>
<li>
<p class="list">执行该语句。</p>
<p class="list">返回值表示受该语句影响的行数。</p>
<pre>long rowsInserted = prepStmt.executeStatement();</pre>
</li>
<li>
<p class="list">如果禁用了 [自动提交]，请提交更改。</p>
<pre>conn.commit();</pre>
</li>
</ol>
<p><a href="http://www.ianywhere.com/developer/product_manuals/sqlanywhere/0902/zh/html/uljvzh9/00000034.htm" target="_blank">参考地址</a></p>
<p>获得组后插入的ID, 在上面代码中已经包括.</p>
]]></content:encoded>
			<wfw:commentRss>http://liguoliang.com/2009/jdbc%e4%b8%adpreparedstatement%e4%bd%bf%e7%94%a8%e5%b0%8f%e7%bb%93-%e5%8f%8ajdbc%e6%8f%92%e5%85%a5%e6%95%b0%e6%8d%ae%e5%90%8e%e8%8e%b7%e5%be%97last-insert-id/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JDBC Transaction</title>
		<link>http://liguoliang.com/2009/jdbc-transaction/</link>
		<comments>http://liguoliang.com/2009/jdbc-transaction/#comments</comments>
		<pubDate>Thu, 19 Feb 2009 02:12:56 +0000</pubDate>
		<dc:creator>老李</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[JDBC]]></category>
		<category><![CDATA[Transaction]]></category>

		<guid isPermaLink="false">http://liguoliang.com/2009/02/772/</guid>
		<description><![CDATA[<p>默认下JDBC是Auto-commit的. 但在必要情况下, 我们需要手动控制事务, 此时:</p>
con.setAutoCommit(false); //关闭自动Commit
PreparedStatement updateSales = con.prepareStatement(
    &#34;]]></description>
			<content:encoded><![CDATA[<p>默认下JDBC是Auto-commit的. 但在必要情况下, 我们需要手动控制事务, 此时:</p>
<pre class="java" name="code">con.setAutoCommit(false); //关闭自动Commit
PreparedStatement updateSales = con.prepareStatement(
    &quot;UPDATE COFFEES SET SALES = ? WHERE COF_NAME LIKE ?&quot;);
updateSales.setInt(1, 50);
updateSales.setString(2, &quot;Colombian&quot;);
updateSales.executeUpdate();//执行Update Sales操作
PreparedStatement updateTotal = con.prepareStatement(
    &quot;UPDATE COFFEES SET TOTAL = TOTAL + ? WHERE COF_NAME LIKE ?&quot;);
updateTotal.setInt(1, 50);
updateTotal.setString(2, &quot;Colombian&quot;);
updateTotal.executeUpdate();//执行Update Total操作, 注意, 此二者必须同时执行成功 或同时失败.
con.commit(); //commit以上两个操作, 同时成功或失败
con.setAutoCommit(true); //将AutoCommit恢复为true</pre>
]]></content:encoded>
			<wfw:commentRss>http://liguoliang.com/2009/jdbc-transaction/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>近日Java/Flex 编程小结,Log, Trace, toString, EventListener, weakreference, JDBC,ListCollectionView</title>
		<link>http://liguoliang.com/2009/%e8%bf%91%e6%97%a5javaflex-%e7%bc%96%e7%a8%8b%e5%b0%8f%e7%bb%93log-trace-tostring-eventlistener-weakreference-jdbclistcollectionview/</link>
		<comments>http://liguoliang.com/2009/%e8%bf%91%e6%97%a5javaflex-%e7%bc%96%e7%a8%8b%e5%b0%8f%e7%bb%93log-trace-tostring-eventlistener-weakreference-jdbclistcollectionview/#comments</comments>
		<pubDate>Thu, 19 Feb 2009 01:57:57 +0000</pubDate>
		<dc:creator>老李</dc:creator>
				<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[JDBC]]></category>
		<category><![CDATA[ListCollectionView]]></category>
		<category><![CDATA[Log]]></category>
		<category><![CDATA[toString]]></category>
		<category><![CDATA[weakReference]]></category>

		<guid isPermaLink="false">http://liguoliang.com/2009/02/770/</guid>
		<description><![CDATA[<p>1. Flex中的Trace, Java/Flex中的log, 并不能代表其真实行为.</p>
<p>2. 务必牢记重写toString方法</p>
<p>3. Flex: 在跨越幅度较大, 设计Obj较多时, 使用weakreference的 Event Listener</p>
<p>4. 关于weakreference, 相对普通re</p>]]></description>
			<content:encoded><![CDATA[<p>1. Flex中的Trace, Java/Flex中的log, 并不能代表其真实行为.</p>
<p>2. 务必牢记重写toString方法</p>
<p>3. Flex: 在跨越幅度较大, 设计Obj较多时, 使用weakreference的 Event Listener</p>
<p>4. 关于weakreference, 相对普通reference来说, weakreference像一个棉线, 牵着Obj &#8211; 但不妨碍garage Collection, 而普通reference则像铁链一样牢牢绑着obj, 会阻止进行garage Collection. 如果一个Object只有weak reference指向他, 则基本可以视为已经被garage Collection,</p>
<p>5. 可以在每个Class中加入一个Object_ID Filed, 在构造函数中使用randomNumber填充 &#8211; 便于分辨对象</p>
<p>6. JDBC 的 traction不是线程安全的</p>
<p>7. 谨慎使用ArrayCollection, Array的sort, filter功能 &#8211; 因为这会打乱其自身. 在使用其作为DataProvider时, 应使用ListCollectionView, 这样在进行操作时则其本身不会有任何改变</p>
]]></content:encoded>
			<wfw:commentRss>http://liguoliang.com/2009/%e8%bf%91%e6%97%a5javaflex-%e7%bc%96%e7%a8%8b%e5%b0%8f%e7%bb%93log-trace-tostring-eventlistener-weakreference-jdbclistcollectionview/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
