示例:常用操作

示例1

此示例将演示如何基于openGauss提供的JDBC接口开发应用程序。

  1. //DBtest.java
  2. //演示基于JDBC开发的主要步骤,会涉及创建数据库、创建表、插入数据等。
  3. import java.sql.Connection;
  4. import java.sql.DriverManager;
  5. import java.sql.PreparedStatement;
  6. import java.sql.SQLException;
  7. import java.sql.Statement;
  8. import java.sql.CallableStatement;
  9. import java.sql.Types;
  10. public class DBTest {
  11. //创建数据库连接。
  12. public static Connection GetConnection(String username, String passwd) {
  13. String driver = "org.postgresql.Driver";
  14. String sourceURL = "jdbc:postgresql://localhost:8000/postgres";
  15. Connection conn = null;
  16. try {
  17. //加载数据库驱动。
  18. Class.forName(driver).newInstance();
  19. } catch (Exception e) {
  20. e.printStackTrace();
  21. return null;
  22. }
  23. try {
  24. //创建数据库连接。
  25. conn = DriverManager.getConnection(sourceURL, username, passwd);
  26. System.out.println("Connection succeed!");
  27. } catch (Exception e) {
  28. e.printStackTrace();
  29. return null;
  30. }
  31. return conn;
  32. };
  33. //执行普通SQL语句,创建customer_t1表。
  34. public static void CreateTable(Connection conn) {
  35. Statement stmt = null;
  36. try {
  37. stmt = conn.createStatement();
  38. //执行普通SQL语句。
  39. int rc = stmt
  40. .executeUpdate("CREATE TABLE customer_t1(c_customer_sk INTEGER, c_customer_name VARCHAR(32));");
  41. stmt.close();
  42. } catch (SQLException e) {
  43. if (stmt != null) {
  44. try {
  45. stmt.close();
  46. } catch (SQLException e1) {
  47. e1.printStackTrace();
  48. }
  49. }
  50. e.printStackTrace();
  51. }
  52. }
  53. //执行预处理语句,批量插入数据。
  54. public static void BatchInsertData(Connection conn) {
  55. PreparedStatement pst = null;
  56. try {
  57. //生成预处理语句。
  58. pst = conn.prepareStatement("INSERT INTO customer_t1 VALUES (?,?)");
  59. for (int i = 0; i < 3; i++) {
  60. //添加参数。
  61. pst.setInt(1, i);
  62. pst.setString(2, "data " + i);
  63. pst.addBatch();
  64. }
  65. //执行批处理。
  66. pst.executeBatch();
  67. pst.close();
  68. } catch (SQLException e) {
  69. if (pst != null) {
  70. try {
  71. pst.close();
  72. } catch (SQLException e1) {
  73. e1.printStackTrace();
  74. }
  75. }
  76. e.printStackTrace();
  77. }
  78. }
  79. //执行预编译语句,更新数据。
  80. public static void ExecPreparedSQL(Connection conn) {
  81. PreparedStatement pstmt = null;
  82. try {
  83. pstmt = conn
  84. .prepareStatement("UPDATE customer_t1 SET c_customer_name = ? WHERE c_customer_sk = 1");
  85. pstmt.setString(1, "new Data");
  86. int rowcount = pstmt.executeUpdate();
  87. pstmt.close();
  88. } catch (SQLException e) {
  89. if (pstmt != null) {
  90. try {
  91. pstmt.close();
  92. } catch (SQLException e1) {
  93. e1.printStackTrace();
  94. }
  95. }
  96. e.printStackTrace();
  97. }
  98. }
  99. //执行存储过程。
  100. public static void ExecCallableSQL(Connection conn) {
  101. CallableStatement cstmt = null;
  102. try {
  103. // 存储过程TESTPROC需提前创建。
  104. cstmt=conn.prepareCall("{? = CALL TESTPROC(?,?,?)}");
  105. cstmt.setInt(2, 50);
  106. cstmt.setInt(1, 20);
  107. cstmt.setInt(3, 90);
  108. cstmt.registerOutParameter(4, Types.INTEGER); //注册out类型的参数,类型为整型。
  109. cstmt.execute();
  110. int out = cstmt.getInt(4); //获取out参数
  111. System.out.println("The CallableStatment TESTPROC returns:"+out);
  112. cstmt.close();
  113. } catch (SQLException e) {
  114. if (cstmt != null) {
  115. try {
  116. cstmt.close();
  117. } catch (SQLException e1) {
  118. e1.printStackTrace();
  119. }
  120. }
  121. e.printStackTrace();
  122. }
  123. }
  124. /**
  125. * 主程序,逐步调用各静态方法。
  126. * @param args
  127. */
  128. public static void main(String[] args) {
  129. //创建数据库连接。
  130. Connection conn = GetConnection("tester", "Password1234");
  131. //创建表。
  132. CreateTable(conn);
  133. //批插数据。
  134. BatchInsertData(conn);
  135. //执行预编译语句,更新数据。
  136. ExecPreparedSQL(conn);
  137. //执行存储过程。
  138. ExecCallableSQL(conn);
  139. //关闭数据库连接。
  140. try {
  141. conn.close();
  142. } catch (SQLException e) {
  143. e.printStackTrace();
  144. }
  145. }
  146. }

示例2客户端内存占用过多解决

此示例主要使用setFetchSize来调整客户端内存使用,它的原理是通过数据库游标来分批获取服务器端数据,但它会加大网络交互,可能会损失部分性能。

由于游标事务内有效,故需要先关闭自动提交,最后需要执行手动提交。

  1. // 关闭掉自动提交
  2. conn.setAutoCommit(false);
  3. Statement st = conn.createStatement();
  4. // 打开游标,每次获取50行数据
  5. st.setFetchSize(50);
  6. ResultSet rs = st.executeQuery("SELECT * FROM mytable");
  7. while (rs.next())
  8. {
  9. System.out.print("a row was returned.");
  10. }
  11. conn.commit();
  12. rs.close();
  13. // 关闭服务器游标。
  14. st.setFetchSize(0);
  15. rs = st.executeQuery("SELECT * FROM mytable");
  16. while (rs.next())
  17. {
  18. System.out.print("many rows were returned.");
  19. }
  20. conn.commit();
  21. rs.close();
  22. // Close the statement.
  23. st.close();
  24. conn.close();

执行完毕后可使用如下命令恢复自动提交:

  1. conn.setAutoCommit(true);

示例3 常用数据类型使用示例

  1. //bit类型使用示例,注意此处bit类型取值范围[0,1]
  2. Statement st = conn.createStatement();
  3. String sqlstr = "create or replace function fun_1()\n" +
  4. "returns bit AS $$\n" +
  5. "select col_bit from t_bit limit 1;\n" +
  6. "$$\n" +
  7. "LANGUAGE SQL;";
  8. st.execute(sqlstr);
  9. CallableStatement c = conn.prepareCall("{ ? = call fun_1() }");
  10. //注册输出类型,位串类型
  11. c.registerOutParameter(1, Types.BIT);
  12. c.execute();
  13. //使用Boolean类型获取结果
  14. System.out.println(c.getBoolean(1));
  15. // money类型使用示例
  16. // 表结构中包含money类型列的使用示例。
  17. st.execute("create table t_money(col1 money)");
  18. PreparedStatement pstm = conn.prepareStatement("insert into t_money values(?)");
  19. // 使用PGobject赋值,取值范围[-92233720368547758.08,92233720368547758.07]
  20. PGobject minMoney = new PGobject();
  21. minMoney.setType("money");
  22. minMoney.setValue("-92233720368547758.08");
  23. pstm.setObject(1, minMoney);
  24. pstm.execute();
  25. // 使用PGMoney赋值,取值范围[-9999999.99,9999999.99]
  26. pstm.setObject(1,new PGmoney(9999999.99));
  27. pstm.execute();
  28. // 函数返回值为money的使用示例。
  29. st.execute("create or replace function func_money() " +
  30. "return money " +
  31. "as declare " +
  32. "var1 money; " +
  33. "begin " +
  34. " select col1 into var1 from t_money limit 1; " +
  35. " return var1; " +
  36. "end;");
  37. CallableStatement cs = conn.prepareCall("{? = call func_money()}");
  38. cs.registerOutParameter(1,Types.DOUBLE);
  39. cs.execute();
  40. cs.getObject(1);

示例4 获取驱动版本示例

  1. Driver.getGSVersion();