serverpreparedstmttest.java

来自「PostgreSQL7.4.6 for Linux」· Java 代码 · 共 266 行

JAVA
266
字号
package org.postgresql.test.jdbc2;import org.postgresql.PGStatement;import org.postgresql.test.TestUtil;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.Statement;import junit.framework.TestCase;/* *  Tests for using server side prepared statements */public class ServerPreparedStmtTest extends TestCase{	private Connection con;	public ServerPreparedStmtTest(String name)	{		super(name);	}	protected void setUp() throws Exception	{		con = TestUtil.openDB();		Statement stmt = con.createStatement();		TestUtil.createTable(con, "testsps", "id integer, value boolean");		stmt.executeUpdate("INSERT INTO testsps VALUES (1,'t')");		stmt.executeUpdate("INSERT INTO testsps VALUES (2,'t')");		stmt.executeUpdate("INSERT INTO testsps VALUES (3,'t')");		stmt.executeUpdate("INSERT INTO testsps VALUES (4,'t')");		stmt.executeUpdate("INSERT INTO testsps VALUES (6,'t')");		stmt.executeUpdate("INSERT INTO testsps VALUES (9,'f')");		stmt.close();	}	protected void tearDown() throws Exception	{		TestUtil.dropTable(con, "testsps");		TestUtil.closeDB(con);	}	public void testPreparedStatementsNoBinds() throws Exception	{		PreparedStatement pstmt = con.prepareStatement("SELECT * FROM testsps WHERE id = 2");        ((PGStatement)pstmt).setUseServerPrepare(true);        if (TestUtil.haveMinimumServerVersion(con,"7.3")) {			assertTrue(((PGStatement)pstmt).isUseServerPrepare());		} else {			assertTrue(!((PGStatement)pstmt).isUseServerPrepare());		}        //Test that basic functionality works		ResultSet rs = pstmt.executeQuery();		assertTrue(rs.next());        assertEquals(2, rs.getInt(1));        rs.close();        //Verify that subsequent calls still work		rs = pstmt.executeQuery();		assertTrue(rs.next());        assertEquals(2, rs.getInt(1));        rs.close();        //Verify that using the statement to execute a different query works		rs = pstmt.executeQuery("SELECT * FROM testsps WHERE id = 9");		assertTrue(rs.next());        assertEquals(9, rs.getInt(1));        rs.close();        ((PGStatement)pstmt).setUseServerPrepare(false);        assertTrue(!((PGStatement)pstmt).isUseServerPrepare());        //Verify that using the statement still works after turning off prepares		rs = pstmt.executeQuery("SELECT * FROM testsps WHERE id = 9");		assertTrue(rs.next());        assertEquals(9, rs.getInt(1));        rs.close();		pstmt.close();	}	public void testPreparedStatementsWithOneBind() throws Exception	{		PreparedStatement pstmt = con.prepareStatement("SELECT * FROM testsps WHERE id = ?");        ((PGStatement)pstmt).setUseServerPrepare(true);        if (TestUtil.haveMinimumServerVersion(con,"7.3")) {			assertTrue(((PGStatement)pstmt).isUseServerPrepare());		} else {			assertTrue(!((PGStatement)pstmt).isUseServerPrepare());		}        //Test that basic functionality works        pstmt.setInt(1,2);		ResultSet rs = pstmt.executeQuery();		assertTrue(rs.next());        assertEquals(2, rs.getInt(1));        rs.close();        //Verify that subsequent calls still work		rs = pstmt.executeQuery();		assertTrue(rs.next());        assertEquals(2, rs.getInt(1));        rs.close();        //Verify that using the statement to execute a different query works		rs = pstmt.executeQuery("SELECT * FROM testsps WHERE id = 9");		assertTrue(rs.next());        assertEquals(9, rs.getInt(1));        rs.close();        ((PGStatement)pstmt).setUseServerPrepare(false);        assertTrue(!((PGStatement)pstmt).isUseServerPrepare());        //Verify that using the statement still works after turning off prepares		rs = pstmt.executeQuery("SELECT * FROM testsps WHERE id = 9");		assertTrue(rs.next());        assertEquals(9, rs.getInt(1));        rs.close();		pstmt.close();	}	// Verify we can bind booleans-as-objects ok.	public void testBooleanObjectBind() throws Exception	{		PreparedStatement pstmt = con.prepareStatement("SELECT * FROM testsps WHERE value = ?");        ((PGStatement)pstmt).setUseServerPrepare(true);        if (TestUtil.haveMinimumServerVersion(con,"7.3")) {			assertTrue(((PGStatement)pstmt).isUseServerPrepare());		} else {			assertTrue(!((PGStatement)pstmt).isUseServerPrepare());		}        pstmt.setObject(1, new Boolean(false), java.sql.Types.BIT);		ResultSet rs = pstmt.executeQuery();		assertTrue(rs.next());        assertEquals(9, rs.getInt(1));        rs.close();	}	// Verify we can bind booleans-as-integers ok.	public void testBooleanIntegerBind() throws Exception	{		PreparedStatement pstmt = con.prepareStatement("SELECT * FROM testsps WHERE id = ?");        ((PGStatement)pstmt).setUseServerPrepare(true);        if (TestUtil.haveMinimumServerVersion(con,"7.3")) {			assertTrue(((PGStatement)pstmt).isUseServerPrepare());		} else {			assertTrue(!((PGStatement)pstmt).isUseServerPrepare());		}        pstmt.setObject(1, new Boolean(true), java.sql.Types.INTEGER);		ResultSet rs = pstmt.executeQuery();		assertTrue(rs.next());        assertEquals(1, rs.getInt(1));        rs.close();	}	// Verify we can bind booleans-as-native-types ok.	public void testBooleanBind() throws Exception	{		PreparedStatement pstmt = con.prepareStatement("SELECT * FROM testsps WHERE value = ?");        ((PGStatement)pstmt).setUseServerPrepare(true);        if (TestUtil.haveMinimumServerVersion(con,"7.3")) {			assertTrue(((PGStatement)pstmt).isUseServerPrepare());		} else {			assertTrue(!((PGStatement)pstmt).isUseServerPrepare());		}        pstmt.setBoolean(1, false);		ResultSet rs = pstmt.executeQuery();		assertTrue(rs.next());        assertEquals(9, rs.getInt(1));        rs.close();	}	public void testPreparedStatementsWithBinds() throws Exception	{		PreparedStatement pstmt = con.prepareStatement("SELECT * FROM testsps WHERE id = ? or id = ?");        ((PGStatement)pstmt).setUseServerPrepare(true);        if (TestUtil.haveMinimumServerVersion(con,"7.3")) {			assertTrue(((PGStatement)pstmt).isUseServerPrepare());		} else {			assertTrue(!((PGStatement)pstmt).isUseServerPrepare());		}        //Test that basic functionality works        //bind different datatypes        pstmt.setInt(1,2);        pstmt.setString(2,"2");		ResultSet rs = pstmt.executeQuery();		assertTrue(rs.next());        assertEquals(2, rs.getInt(1));        rs.close();        //Verify that subsequent calls still work		rs = pstmt.executeQuery();		assertTrue(rs.next());        assertEquals(2, rs.getInt(1));        rs.close();		pstmt.close();	}	public void testSPSToggle() throws Exception	{		// Verify we can toggle UseServerPrepare safely before a query is executed.		PreparedStatement pstmt = con.prepareStatement("SELECT * FROM testsps WHERE id = 2");        ((PGStatement)pstmt).setUseServerPrepare(true);        ((PGStatement)pstmt).setUseServerPrepare(false);	}	public void testBytea() throws Exception	{		// Verify we can use setBytes() with a server-prepared update.		try {			TestUtil.createTable(con, "testsps_bytea", "data bytea");						PreparedStatement pstmt = con.prepareStatement("INSERT INTO testsps_bytea(data) VALUES (?)");			((PGStatement)pstmt).setUseServerPrepare(true);			pstmt.setBytes(1, new byte[100]);			pstmt.executeUpdate();		} finally {			TestUtil.dropTable(con, "testsps_bytea");		}	}	// Check statements are not transformed when they shouldn't be.	public void TODO_FAILS_testCreateTable() throws Exception {		// CREATE TABLE isn't supported by PREPARE; the driver should realize this and		// still complete without error.		PreparedStatement pstmt = con.prepareStatement("CREATE TABLE testsps_bad(data int)");		((PGStatement)pstmt).setUseServerPrepare(true);		pstmt.executeUpdate();		TestUtil.dropTable(con, "testsps_bad");	}	public void TODO_FAILS_testMultistatement() throws Exception {		// Shouldn't try to PREPARE this one, if we do we get:		//   PREPARE x(int,int) AS INSERT .... $1 ; INSERT ... $2    -- syntax error		try {			TestUtil.createTable(con, "testsps_multiple", "data int");			PreparedStatement pstmt = con.prepareStatement("INSERT INTO testsps_multiple(data) VALUES (?); INSERT INTO testsps_multiple(data) VALUES (?)");			((PGStatement)pstmt).setUseServerPrepare(true);						pstmt.setInt(1, 1);			pstmt.setInt(2, 2);			pstmt.executeUpdate(); // Two inserts.			pstmt.setInt(1, 3);			pstmt.setInt(2, 4);			pstmt.executeUpdate(); // Two more inserts.						ResultSet check = con.createStatement().executeQuery("SELECT COUNT(*) FROM testsps_multiple");			assertTrue(check.next());			assertEquals(4, check.getInt(1));		} finally {			TestUtil.dropTable(con, "testsps_multiple");		}	}}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?