package test; import com.mysql.jdbc.Driver; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.sql.*; import static org.hamcrest.core.Is.is; import static org.junit.Assert.*; /** * © 2015
* PONTON GmbH * * @author Jörg Eichhorn * @version $Revision: $ $Date: $ */ public class MySQLConnectorJTest { private static Logger log = LoggerFactory.getLogger(MySQLConnectorJTest.class); @Before public void before() throws Exception { DriverManager.registerDriver(new Driver()); try (Connection con = openConnection(false)) { log.info("Creating test table"); con.createStatement().executeUpdate( "create table test ( " + " id int not null primary key auto_increment," + " dt1 datetime null, " + " dt2 datetime null " + ")" ); } } @After public void after() throws Exception { try (Connection con = openConnection(false)) { log.info("Dropping test table"); con.createStatement().executeUpdate("drop table test"); } } private Connection openConnection(boolean useCursorFetch) throws Exception { String url = "jdbc:mysql://localhost/test" + "?useCursorFetch=" + (useCursorFetch ? "true" : "false") + "&useLegacyDatetimeCode=false"; return DriverManager.getConnection(url, "test", "test"); } @Test public void testWithoutCursorFetchAndWithoutBatch() throws Exception { executeTest(false, false); } @Test public void testWithoutCursorFetchAndWithBatch() throws Exception { executeTest(false, true); } @Test public void testWithCursorFetchAndWithoutBatch() throws Exception { executeTest(true, false); } @Test public void testWithCursorFetchAndWithBatch() throws Exception { executeTest(true, true); } private void executeTest(boolean enableCursorFetch, boolean useBatch) throws Exception { // Insert data try (Connection con = openConnection(enableCursorFetch)) { log.info("Inserting test entries using {} cursor fetching and {} jdbc batch insertion", enableCursorFetch ? "with" : "without", useBatch ? "with" : "without"); log.info("Using jdbc url: {}", con.getMetaData().getURL()); PreparedStatement stmt = con.prepareStatement("insert into test (dt1, dt2) values (?, ?)"); stmt.setTimestamp(1, new Timestamp(System.currentTimeMillis())); stmt.setTimestamp(2, new Timestamp(System.currentTimeMillis())); if (useBatch) { stmt.addBatch(); } else { stmt.executeUpdate(); stmt.clearParameters(); } stmt.setTimestamp(1, new Timestamp(System.currentTimeMillis())); stmt.setTimestamp(2, null); if (useBatch) { stmt.addBatch(); } else { stmt.executeUpdate(); stmt.clearParameters(); } stmt.setTimestamp(1, new Timestamp(System.currentTimeMillis())); stmt.setTimestamp(2, new Timestamp(System.currentTimeMillis())); if (useBatch) { stmt.addBatch(); stmt.executeBatch(); } else { stmt.executeUpdate(); stmt.clearParameters(); } stmt.close(); } // Verify data log.info("Verifying data"); try (Connection con = openConnection(enableCursorFetch)) { ResultSet rs = con.createStatement().executeQuery("select count(id) from test"); rs.next(); assertThat("Expected 3 entries", rs.getInt(1), is(3)); log.info("Found all expected entries"); rs.close(); rs = con.createStatement().executeQuery("select id, dt1, dt2 from test order by id asc"); while (rs.next()) { int id = rs.getInt(1); Timestamp dt1 = rs.getTimestamp(2); Timestamp dt2 = rs.getTimestamp(3); log.info("Found entry with id = {} and dt1 = {}, dt2 = {}", id, dt1, dt2); assertNotNull("Expected timestamp 1 of id " + id + " is not null", dt1); switch (id) { case 1: assertNotNull("Expected timestamp 2 of id " + id + " is not null", dt2); break; case 2: assertNull("Expected timestamp 2 of id " + id + " is null", dt2); break; case 3: assertNotNull("Expected timestamp 2 of id " + id + " is not null", dt2); break; default: fail("Unexpected id " + id); } } } } }