1 16 package scriptella.jdbc; 17 18 import scriptella.util.IOUtils; 19 20 import java.io.Closeable ; 21 import java.io.InputStream ; 22 import java.io.Reader ; 23 import java.net.URL ; 24 import java.sql.Blob ; 25 import java.sql.Clob ; 26 import java.sql.PreparedStatement ; 27 import java.sql.ResultSet ; 28 import java.sql.SQLException ; 29 import java.sql.Time ; 30 import java.sql.Timestamp ; 31 import java.sql.Types ; 32 import java.util.ArrayList ; 33 import java.util.Calendar ; 34 import java.util.Date ; 35 import java.util.List ; 36 37 50 class JdbcTypesConverter implements Closeable { 51 private List <Closeable > resources; 52 53 64 public Object getObject(final ResultSet rs, final int index, final int jdbcType) throws SQLException { 65 switch(jdbcType) { 66 case Types.DATE: case Types.TIMESTAMP: 68 return rs.getTimestamp(index); 69 case Types.TIME: 70 return rs.getTime(index); 71 case Types.BLOB: 72 return rs.getBlob(index); 73 case Types.CLOB: 74 return rs.getClob(index); 75 case Types.LONGVARBINARY: 76 InputStream is = rs.getBinaryStream(index); 77 return is==null?null:toBlob(is); 78 case Types.LONGVARCHAR: 79 Reader reader = rs.getCharacterStream(index); 80 return reader==null?null:toClob(reader); 81 } 82 Object res = rs.getObject(index); 83 if (res==null) { 84 return null; 85 } 86 return res; 87 } 88 89 90 99 public void setObject(final PreparedStatement preparedStatement, final int index, final Object value) throws SQLException { 100 if (value instanceof InputStream ) { 102 setBlob(preparedStatement, index, toBlob((InputStream ) value)); 103 } else if (value instanceof Reader ) { 104 setClob(preparedStatement, index, toClob((Reader ) value)); 105 } else if (value instanceof Blob ) { 107 setBlob(preparedStatement, index, (Blob ) value); 108 } else if (value instanceof Clob ) { 109 setClob(preparedStatement, index, (Clob ) value); 110 } else if (value instanceof Date ) { 111 setDateObject(preparedStatement, index, (Date ) value); 112 } else if (value instanceof Calendar ) { 113 preparedStatement.setTimestamp(index, new Timestamp (((Calendar )value).getTimeInMillis()), (Calendar ) value); 114 } else { 115 preparedStatement.setObject(index, value); 116 } 117 } 118 119 protected Blob toBlob(InputStream is) { 120 Blob blob = Lobs.newBlob(is); 121 if (blob instanceof Closeable ) { 122 registerResource((Closeable ) blob); 123 } 124 return blob; 125 } 126 127 protected Clob toClob(Reader reader) { 128 Clob clob = Lobs.newClob(reader); 129 if (clob instanceof Closeable ) { 130 registerResource((Closeable ) clob); 131 } 132 return clob; 133 } 134 135 protected void setBlob(final PreparedStatement ps, final int index, final Blob blob) throws SQLException { 136 ps.setBinaryStream(index, blob.getBinaryStream(), (int) blob.length()); 137 } 138 139 protected void setClob(final PreparedStatement ps, final int index, final Clob clob) throws SQLException { 140 ps.setCharacterStream(index, clob.getCharacterStream(), (int) clob.length()); 141 } 142 143 146 protected void setDateObject(final PreparedStatement ps, final int index, final Date date) throws SQLException { 147 if (date instanceof Timestamp ) { 148 ps.setTimestamp(index, (Timestamp ) date); 149 } else if (date instanceof java.sql.Date ) { 150 ps.setDate(index, (java.sql.Date ) date); 151 } else if (date instanceof Time ) { 152 ps.setTime(index, (Time ) date); 153 } else { 154 ps.setTimestamp(index, new Timestamp (date.getTime())); 155 } 156 } 157 158 protected void registerResource(Closeable resource) { 159 if (resources==null) { 160 resources=new ArrayList <Closeable >(); 161 } 162 resources.add(resource); 163 } 164 165 168 public void close() { 169 if (resources != null) { 170 IOUtils.closeSilently(resources); 171 resources = null; 172 } 173 } 174 175 176 } 177 | Popular Tags |