JDBC操作MySQL Lob字段记实
版权声明:原创作品,如需转载,请与作者联系。否则将追究法律责任。 |
JDBC操作MySQL Lob字段记实
虽然Java的持久化框架多如牛毛,但都离不开JDBC技术,JDBC在某些时候是其他框架难以取代的。也是java操作数据库最根本的技术。
上文写了JDBC操作DB2 Lob字段bug问题,为此,我还特意写了MySQL平台下的Lob字段操作,以便能得出更为准确的结论。
本文通过一个简单的Java类,就能增删改查MySQL的Lob字段。google一下,JDBC操作数据库Lob字段的完整代码一个也没找到。因此把这个测试代码也放在blog上,希望给正在用JDBC做MySQL开发的朋友们一点参考。
环境:
MySQL-5.0.45
mysql-connector-java-5.1.5.zip
测试的SQL脚本:
CREATE TABLE t_lob ( NAME varchar(24) DEFAULT NULL, TXT text, IMG blob ) ENGINE=InnoDB DEFAULT CHARSET=gbk; 测试代码:
package lob; import java.sql.*; import java.io.*; /** * JDBC 读取MySQL lob字段测试 * File: TestLob4MySQL.java * User: leizhimin * Date: 2008-3-3 14:44:30 */ public class TestLob4MySQL { public static final String url = "jdbc:mysql://localhost/testdb"; public static final String username = "root"; public static final String password = "leizhimin"; public static final String driverClassName = "com.mysql.jdbc.Driver"; /** * 数据库连接获取器 * * @return 数据库连接 */ public static Connection makeConnection() { Connection conn = null; try { Class.forName(driverClassName); } catch (ClassNotFoundException e) { e.printStackTrace(); } try { conn = DriverManager.getConnection(url, username, password); } catch (SQLException e) { e.printStackTrace(); } return conn; } /** * 测试数据库连接 */ public static void testConnection() { Connection conn = makeConnection(); try { Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM mysql.user"); while (rs.next()) { String s1 = rs.getString(1); System.out.println(s1); } rs.close(); stmt.close(); } catch (SQLException e) { e.printStackTrace(); } finally { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } /** * 插入Lob字段 */ public static void testInsertlob() { Connection conn = makeConnection(); try { conn.setAutoCommit(false); File txtFile = new File("C:\\txt.txt"); File imgFile = new File("C:\\img.png"); int txt_len = (int) txtFile.length(); int img_len = (int) imgFile.length(); try { InputStream fis1 = new FileInputStream(txtFile); InputStream fis2 = new FileInputStream(imgFile); PreparedStatement pstmt = conn.prepareStatement("INSERT INTO T_LOB(NAME,TXT,IMG) VALUES('G',?,?)"); pstmt.setAsciiStream(1, fis1, txt_len); pstmt.setBinaryStream(2, fis2, img_len); pstmt.executeUpdate(); conn.commit(); } catch (FileNotFoundException e) { e.printStackTrace(); } } catch (SQLException e) { e.printStackTrace(); } finally { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } /** * 读取lob字段 */ public static void testQueryLob() { Connection conn = makeConnection(); try { conn.setAutoCommit(false); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT TXT,IMG FROM T_LOB"); int i = 1; while (rs.next()) { Clob clob = rs.getClob("TXT"); Blob blob = rs.getBlob("IMG"); InputStream txtIs = rs.getAsciiStream("TXT"); InputStream imgIs = rs.getBinaryStream("IMG"); InputStreamReader txtIsr = new InputStreamReader(txtIs); InputStreamReader imgIsr = new InputStreamReader(imgIs); BufferedReader buff_txtIsr = new BufferedReader(txtIsr); BufferedReader buff_imgIsr = new BufferedReader(imgIsr); String line = null; while (null != (line = buff_txtIsr.readLine())) { System.out.println(line); //将其输出至屏幕,实际你可以按照需要处理 } File fileOutput = new File("c:\\img_x" + i + ".png"); FileOutputStream fo = new FileOutputStream(fileOutput); int c; while ((c = imgIs.read()) != -1) fo.write(c); fo.close(); System.out.println("img " + i + " retrieved!"); i++; } conn.commit(); } catch (SQLException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } finally { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } /** * 读取lob字段 */ public static void testQueryLob1() { Connection conn = makeConnection(); try { conn.setAutoCommit(false); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT TXT,IMG FROM T_LOB"); while (rs.next()) { Clob clob = rs.getClob("TXT"); Blob blob = rs.getBlob("IMG"); InputStream txtIs = clob.getAsciiStream(); InputStream imgIs = blob.getBinaryStream(); InputStreamReader txtIsr = new InputStreamReader(txtIs); InputStreamReader imgIsr = new InputStreamReader(imgIs); BufferedReader buff_txtIsr = new BufferedReader(txtIsr); BufferedReader buff_imgIsr = new BufferedReader(imgIsr); String line = null; while (null != (line = buff_txtIsr.readLine())) { System.out.println(line); //将其输出至屏幕,实际你可以按照需要处理 } } conn.commit(); } catch (SQLException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } finally { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } /** * 删除lob字段 */ public static void testDeleteLob() { Connection conn = makeConnection(); try { conn.setAutoCommit(false); Statement stmt = conn.createStatement(); int row = stmt.executeUpdate("DELETE FROM T_LOB"); conn.commit(); System.out.println("删除 " + row + " 行数据!"); } catch (SQLException e) { e.printStackTrace(); } finally { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } /** * 读取lob字段 */ public static void testUpdateLob() { Connection conn = makeConnection(); try { String in_str="HAHAHAHAHAHA!!!"; File in_file=new File("c:\\img_haha.png"); InputStream txt_is = string2InputStream(in_str); InputStream img_is =new FileInputStream(in_file); conn.setAutoCommit(false); PreparedStatement pstmt = conn.prepareStatement("UPDATE T_LOB SET TXT=?, IMG=? WHERE NAME='G'"); pstmt.setAsciiStream(1,txt_is,in_str.getBytes().length); pstmt.setBinaryStream(2,img_is,(int)in_file.length()); int row = pstmt.executeUpdate(); conn.commit(); txt_is.close(); img_is.close(); // System.out.println("更新 " + row + " 行数据!"); } catch (SQLException e) { e.printStackTrace(); } catch (FileNotFoundException e) { e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. } catch (IOException e) { e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. } finally { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } public static void main(String args[]) { // testInsertlob(); // testQueryLob(); // testQueryLob1(); // testDeleteLob(); testUpdateLob(); } public static InputStream string2InputStream(String str) { if (str == null) return null; return new ByteArrayInputStream(str.getBytes()); } public static String inputStream2String(InputStream is) { StringBuffer sb = new StringBuffer(); BufferedReader br = new BufferedReader(new InputStreamReader(is)); String inputLine; try { while ((inputLine = br.readLine()) != null) { sb.append(inputLine).append("\n"); } } catch (IOException e) { e.printStackTrace(); } return sb.toString(); } } 一一运行各个测试方法,都没有问题。
本文出自 “熔 岩” 博客,转载请与作者联系! 本文出自 51CTO.COM技术博客 |



leizhimin
博客统计信息
热门文章
最新评论
友情链接