pgadmin3:http://www.pgadmin.org/ //postgresql的可视化管理软件,类似于mysql的sqlyog
一个小例子:
第一步:获得已有数据库的一个连接
1. load driver
2.getConnection
注册完Driver后,就可以使用DriverManager的方法了,这个可以具体参见jdk中的解释
Class.forName( "org.postgresql.Driver").newInstance();
String url= "jdbc:postgresql://localhost:5432/kddcup2012";
conn= DriverManager.getConnection(url, user , password );
url可以有三种形式:
jdbc:postgresql:databasejdbc:postgresql://host/databasejdbc:postgresql://host:port/database
而得到一个连接也有很多方法,最简单的就是像上面代码中的方法:
Connection db = DriverManager.getConnection(url, username, password);
例如,可以直接把username和password写到url中:
String ur= "jdbc:postgresql://localhost/test?user=fred&password=secret&ssl=true";
Connection conn= DriverManager.getConnection(url);
还可以设置Properties对象
String url = "jdbc:postgresql://localhost/test";
Properties props= newProperties();
props.setProperty("user","fred");
props.setProperty("password","secret");
props.setProperty("ssl","true");
Connection conn= DriverManager.getConnection(url, props);
以上两个方法都得到了一个ssh连接。
第二步,进行数据库操作
当获得数据库连接后就可以进行数据操作了,下面的部分会多一些简单的小例子,大多来自jdbc interface:
1.简单的查询语句1,使用statement
Statement st =conn.createStatement();
ResultSet rs= st.executeQuery("SELECT * FROM mytable WHERE columnfoo = 500");while(rs.next()) {
System.out.print("Column 1 returned ");
System.out.println(rs.getString(1));
}
rs.close();
st.close();
还可以使用prepareStatement,对sql语句进行变量的填充
int foovalue = 500;
PreparedStatement st= conn.prepareStatement("SELECT * FROM mytable WHERE columnfoo = ?");
st.setInt(1, foovalue);
ResultSet rs=st.executeQuery();while(rs.next()) {
System.out.print("Column 1 returned ");
System.out.println(rs.getString(1));
}
rs.close();
st.close()
注:?代表变量赋值的地方,变量索引从1开始
2.使用cursor,来分页读取ResultSet,也就是说不用一次把所有查询结果提入内存。
1 conn.setAutoCommit(false);2 Statement st =conn.createStatement();3
4 //Turn use of the cursor on.
5 st.setFetchSize(50);6 ResultSet rs = st.executeQuery("SELECT * FROM mytable");7 while(rs.next()) {8 System.out.print("a row was returned.");9 }10 rs.close();11
12 //Turn the cursor off.
13 st.setFetchSize(0);14 rs = st.executeQuery("SELECT * FROM mytable");15 while(rs.next()) {16 System.out.print("many rows were returned.");17 }18 rs.close();19 st.close();
这个操作是隐式的,也就是说并不需要在程序逻辑上有什么显著的改变,它只是改变了运行的机制,也就是说在7-9行中,rs先查询50个结果,然后在while中运行50次,再向下查询50个结果,在运行50次while里的操作。而不用cursor时,rs会一次将所有结果都读入内存,如果返回的结果集特别大时这是无法运行的。
使用cursor需要几个条件:
(1) 使用V3 protocol,在7.4版本以后是默认设置
(2) Connection必须不是AutoCommit的,代码中第1行的设置:conn.setAutoCommit(false);
(3) Statement创建ResultSet时,必须使用ResultSet.TYPE_FORWARD_ONLY选项,这个设置时默认的
(4) query必须是一个单独的Statement,不能是多个Statement的总和。
(5) 另外还要设置Fetch的大小,在代码中第5行中设置,当将fetch的大小设置为0时,则表示一次全部读入。
3. 简单的Insert,Update,Delete等
在postgresql中,这些操作都需要使用PreparedStatement,就算是不需要变量的sql串。
public intDelete(Connection conn)
{int rowsDeleted=0;
PreparedStatement st;try{
st= conn.prepareStatement("DELETE FROM mytable WHERE columnfoo = 500");
rowsDeleted=st.executeUpdate();
st.close();
}catch(SQLException e) {//TODO Auto-generated catch block
e.printStackTrace();
}returnrowsDeleted;
}public intInsert(Connection conn)
{int rowsInsert=0;
PreparedStatement st;try{
st= conn.prepareStatement("INSERT INTO mytable(columnfoo,value) values(?,?)");
st.setInt(1, 500);
st.setDouble(2, 0.5);
rowsInsert=st.executeUpdate();
st.close();
}catch(SQLException e) {//TODO Auto-generated catch block
e.printStackTrace();
}returnrowsInsert;
}
代码中写了两个简单的Insert和Delete例子,Update与其类似。
下面是一个最最简单的DBHelper
1 packagewzy.db;2
3 importjava.sql.Connection;4 importjava.sql.DriverManager;5 importjava.sql.PreparedStatement;6 importjava.sql.ResultSet;7 importjava.sql.SQLException;8 importjava.sql.Statement;9
10 public classDataHelper {11
12 public staticConnection NewConnection(String database,String user,String password)13 {14 Connection conn=null;15 try{16 Class.forName( "org.postgresql.Driver").newInstance();17
18 String url = "jdbc:postgresql://localhost:5432/"+database ;19
20 conn=DriverManager.getConnection(url, user , password );21
22 } catch(InstantiationException e) {23 e.printStackTrace();24 } catch(IllegalAccessException e) {25 e.printStackTrace();26 } catch(ClassNotFoundException e) {27 e.printStackTrace();28 } catch(SQLException e) {29 e.printStackTrace();30 }31 returnconn;32 }33 public staticResultSet Select(Connection conn,String sql)34 {35 Statement st;36 ResultSet rs=null;37 try{38 st =conn.createStatement();39 rs=st.executeQuery(sql);40 } catch(SQLException e) {41 e.printStackTrace();42 }43 returnrs;44 }45 public static booleanInsertOrDeleteOrUpdate(Connection conn,String sql)46 {47 int row=0;48 try{49 PreparedStatement pst=conn.prepareStatement(sql);50 row=pst.executeUpdate();51
52 } catch(SQLException e) {53 //TODO Auto-generated catch block
54 e.printStackTrace();55 }56 return row>0;57 }58 public static boolean InsertOrDeleteOrUpdate(PreparedStatement pst) throwsSQLException59 {60 return pst.executeUpdate()>0;61 }62 }