JDBC 在执行execute() 方法的使用, 可以使用 stmt.getMetaData获取数据集的元数据。根据元数据的 getColumn方法,可以获取表的列数。 除了blob类型的数据,基本上都可以使用getString() 方法来获取。应为什么类型的数据都可以自动转换为 string类型。 delphi中也类似。
使用 PreparedStatement的好处:1,防止SQL注入,1个是运行比直接运行SQL语句快,1个是拼接SQL语句比较复杂,预编译可以降低编程的复杂程度。
还需要注意一点,不要用预编译语句中的占位符替代SQL中的关键字。如inset ,update 表名,列名等等。
如果要处理可更新的结果集,则使用查询语句查出来的数据通常只能来字一个数据表,而且查询结果集中的数据列必须包含主键,否则将引起更新失败。
package JDBC;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;
import java.util.Properties;
public class ConnToMySql {
private String driver;
private String url;
private String user;
private String password;
public void initParam(String paramFile) throws Exception{
Properties props = new Properties();
props.load(new FileInputStream(paramFile));
driver = props.getProperty("driver");
url = props.getProperty("url");
user = props.getProperty("user");
password = props.getProperty("password");
}
public int insertData(String sql) throws Exception{
Class.forName(driver);
try(
Connection conn = DriverManager.getConnection(url, user, password);
Statement stmt = conn.createStatement()
){
return stmt.executeUpdate(sql);
}
}
// 测试 execute方法
public void testExecute(String sql) throws Exception{
Class.forName(driver);
int i = 9043;
try(
Connection conn = DriverManager.getConnection(url, user, password);
Statement stmt = conn.createStatement();
PreparedStatement pstmt = conn.prepareStatement("insert into teacher values(?,?)")
){
long start = System.currentTimeMillis();
for(int j = 0 ; j< 200; j++){
pstmt.setInt(1, i++);
pstmt.setString(2, "pxb"+i);
pstmt.executeUpdate();
}
System.out.println("total cost time " +( System.currentTimeMillis()-start));
boolean isQuery = stmt.execute(sql);
if( isQuery)
{
ResultSet rs = stmt.getResultSet();
ResultSetMetaData rsmd = rs.getMetaData();
int columnCount = rsmd.getColumnCount();
while (rs.next()){
for( i = 0 ; i<columnCount; i++){
System.out.print(rs.getString(i+1)+"\t");
}
System.out.println();
}
}else
{
System.out.println("该语句影响了"+ stmt.getUpdateCount());
}
}
}
public static void main(String[] args) throws Exception{
ConnToMySql ctms = new ConnToMySql();
// DDL使用 executeUpdate时返回0. DML返回执行的个数。
ctms.initParam("E:/java/ConnMySql/configue/mysql.ini");
int result = ctms.insertData("insert into teacher values(10008,'pddp');");
System.out.print("total effect " + result + "记录");
ctms.testExecute("create table executeTable(col_a varchar(20) primary key,col_b text )");
ctms.testExecute("insert into executeTable values('pxb','I am a dangerous')");
ctms.testExecute("select * from executeTable");
}
}