diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/support/lob/DefaultLobHandler.java b/spring-jdbc/src/main/java/org/springframework/jdbc/support/lob/DefaultLobHandler.java index c1ae28cba2..4e25be09eb 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/support/lob/DefaultLobHandler.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/support/lob/DefaultLobHandler.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2013 the original author or authors. + * Copyright 2002-2014 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -36,6 +36,13 @@ import org.apache.commons.logging.LogFactory; * Invokes the direct accessor methods that {@code java.sql.ResultSet} * and {@code java.sql.PreparedStatement} offer. * + *
By default, incoming streams are going to be passed to the appropriate + * {@code setBinary/Ascii/CharacterStream} method on the JDBC driver's + * {@link PreparedStatement}. If the specified content length is negative, + * this handler will use the JDBC 4.0 variants of the set-stream methods + * without a length parameter; otherwise, it will pass the specified length + * on to the driver. + * *
This LobHandler should work for any JDBC driver that is JDBC compliant * in terms of the spec's suggestions regarding simple BLOB and CLOB handling. * This does not apply to Oracle 9i's drivers at all; as of Oracle 10g, @@ -262,9 +269,12 @@ public class DefaultLobHandler extends AbstractLobHandler { ps.setBlob(paramIndex, (Blob) null); } } - else { + else if (contentLength >= 0) { ps.setBinaryStream(paramIndex, binaryStream, contentLength); } + else { + ps.setBinaryStream(paramIndex, binaryStream); + } if (logger.isDebugEnabled()) { logger.debug(binaryStream != null ? "Set binary stream for BLOB with length " + contentLength : "Set BLOB to null"); @@ -326,9 +336,12 @@ public class DefaultLobHandler extends AbstractLobHandler { ps.setClob(paramIndex, (Clob) null); } } - else { + else if (contentLength >= 0) { ps.setAsciiStream(paramIndex, asciiStream, contentLength); } + else { + ps.setAsciiStream(paramIndex, asciiStream); + } if (logger.isDebugEnabled()) { logger.debug(asciiStream != null ? "Set ASCII stream for CLOB with length " + contentLength : "Set CLOB to null"); @@ -356,9 +369,12 @@ public class DefaultLobHandler extends AbstractLobHandler { ps.setClob(paramIndex, (Clob) null); } } - else { + else if (contentLength >= 0) { ps.setCharacterStream(paramIndex, characterStream, contentLength); } + else { + ps.setCharacterStream(paramIndex, characterStream); + } if (logger.isDebugEnabled()) { logger.debug(characterStream != null ? "Set character stream for CLOB with length " + contentLength : "Set CLOB to null"); diff --git a/spring-jdbc/src/test/java/org/springframework/jdbc/support/DefaultLobHandlerTests.java b/spring-jdbc/src/test/java/org/springframework/jdbc/support/DefaultLobHandlerTests.java index 1426ade104..43f3dc185a 100644 --- a/spring-jdbc/src/test/java/org/springframework/jdbc/support/DefaultLobHandlerTests.java +++ b/spring-jdbc/src/test/java/org/springframework/jdbc/support/DefaultLobHandlerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2013 the original author or authors. + * Copyright 2002-2014 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,6 +26,7 @@ import java.sql.ResultSet; import java.sql.SQLException; import org.junit.Test; + import org.springframework.jdbc.support.lob.DefaultLobHandler; import org.springframework.jdbc.support.lob.LobCreator; import org.springframework.jdbc.support.lob.LobHandler; @@ -39,10 +40,14 @@ import static org.mockito.BDDMockito.*; public class DefaultLobHandlerTests { private ResultSet rs = mock(ResultSet.class); + private PreparedStatement ps = mock(PreparedStatement.class); + private LobHandler lobHandler = new DefaultLobHandler(); + private LobCreator lobCreator = lobHandler.getLobCreator(); + @Test public void testGetBlobAsBytes() throws SQLException { lobHandler.getBlobAsBytes(rs, 1); @@ -82,12 +87,18 @@ public class DefaultLobHandlerTests { @Test public void testSetBlobAsBinaryStream() throws SQLException, IOException { - InputStream bis = new ByteArrayInputStream("testContent".getBytes()); lobCreator.setBlobAsBinaryStream(ps, 1, bis, 11); verify(ps).setBinaryStream(1, bis, 11); } + @Test + public void testSetBlobAsBinaryStreamWithoutLength() throws SQLException, IOException { + InputStream bis = new ByteArrayInputStream("testContent".getBytes()); + lobCreator.setBlobAsBinaryStream(ps, 1, bis, -1); + verify(ps).setBinaryStream(1, bis); + } + @Test public void testSetClobAsString() throws SQLException, IOException { String content = "testContent"; @@ -102,6 +113,13 @@ public class DefaultLobHandlerTests { verify(ps).setAsciiStream(1, bis, 11); } + @Test + public void testSetClobAsAsciiStreamWithoutLength() throws SQLException, IOException { + InputStream bis = new ByteArrayInputStream("testContent".getBytes()); + lobCreator.setClobAsAsciiStream(ps, 1, bis, -1); + verify(ps).setAsciiStream(1, bis); + } + @Test public void testSetClobAsCharacterStream() throws SQLException, IOException { Reader str = new StringReader("testContent"); @@ -109,4 +127,11 @@ public class DefaultLobHandlerTests { verify(ps).setCharacterStream(1, str, 11); } + @Test + public void testSetClobAsCharacterStreamWithoutLength() throws SQLException, IOException { + Reader str = new StringReader("testContent"); + lobCreator.setClobAsCharacterStream(ps, 1, str, -1); + verify(ps).setCharacterStream(1, str); + } + }