批量提交使用的方法:ps.addBatch(),ps.executeBatch(),ps.clearBatch(),
try {
PreparedStatement ps = conn.prepareStatement(sql);
final int batchSize = 1000;
int count = 0;
for (Employee employee : employees) {
ps.setString(1, employee.getName());
ps.setString(2, employee.getPosition());
ps.setString(3, employee.getSex());
ps.setDouble(4, employee.getSalary());
ps.addBatch();//批量提交
if(++count % batchSize == 0) {
ps.executeBatch();
ps.clearBatch();
}
}
int[] r = ps.executeBatch(); //最后一次提交,可能不足1000个
ps.clearBatch();
ps.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
数据库事务
public class TransactionUtil {
/*
* 处理数据库事务
* */
public static Connection conn = DBUtil.getConnection();
/**
* 设置自动提交状态
* @param state
*/
public static void setAutoCommit(boolean state){
try {
conn.setAutoCommit(state);
} catch (SQLException e) {
System.out.println("设置自动提交状态失败");
e.printStackTrace();
}
}
/**
* 提交
*/
public static void commit(){
try {
conn.commit();
} catch (SQLException e) {
System.out.println("提交失败");
e.printStackTrace();
}
}
public static void rollback() {
try {
conn.rollback();
} catch (SQLException e) {
System.out.println("回滚失败");
e.printStackTrace();
}
}
}
获取自动主键
ps = conn.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS); //现在需要第二个参数,激活自动获取key,否则会报错Generated keys not request
addflag = ps.executeUpdate();
rsGeneratedkeys = ps.getGeneratedKeys();
ResultSetMetaData
String sql = "select * from user,student";
ResultSet rs = stmt.executeQuery(sql);
ResultSetMetaData rsmd = rs.getMetaData();
System.out.println("..........ResultSetMetaData............");
System.out.println("表名::::::"+rsmd.getTableName(1));//第一列的表名
System.out.println("表名::::::"+rsmd.getTableName(4));//第四列的表名
//列数
int columnCount = rsmd.getColumnCount();
//列名
String columnName = null;
for (int i = 1; i <= columnCount; i++) {
columnName=rsmd.getColumnName(i);
System.out.println(columnName);
}
使用 getMetaData() 方法从 ResultSet 中获取 ResultSetMetaData 对象。您可以使用此对象获得列的数目和类型以及每一列的名称。
getColumnCount(); 返回 ResultSet 中的列数。
getColumnName(int); 返回列序号为 int 的列名。
getColumnLabel(int); 返回此列暗含的标签。
isCurrency(int); 如果此列包含带有货币单位的一个数字,则返回 true。
isReadOnly(int); 如果此列为只读,则返回 true。
isAutoIncrement(int); 如果此列自动递增,则返回 true。这类列通常为键,而且始终是只读的。
getColumnType(int); 返回此列的 SQL 数据类型。
可滚动结果集
PreparedStatement stmt2 = conn.prepareStatement(sql, ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
ResultSet rs2 = stmt2.executeQuery();
//判断一下mysql数据库是否支持TYPE_FORWARD_ONLY
DatabaseMetaData dbmd=conn.getMetaData();
if(dbmd.supportsResultSetType(ResultSet.TYPE_FORWARD_ONLY)){
System.out.println("*******MySQL支持TYPE_FORWARD_ONLY结果集**********");
}else{
System.out.println("*******MySQL不支持TYPE_FORWARD_ONLY结果集**********");
}
System.out.println("这是"+dbmd.getDatabaseProductName()+"数据库"
+ ",版本是:"+dbmd.getDatabaseProductVersion());
//以下只有在设置为“可滚动”时才可以用
rs2.first();//使第一行成为当前行
System.out.println(rs2.getString(1)); //得到第一个雇员号
rs2.last(); //使最后一行成为当前行
System.out.println(rs2.isLast());
System.out.println(rs2.getString(1));
// rs2.next();
System.out.println("0000000000000");
System.out.println(rs2.isAfterLast());//是否位于最后一行之后
System .out.println(rs2.getRow());
rs2.previous(); //向前移动移动一行,此处为倒数第二行
System.out.println(rs2.getString(1));
rs2.absolute(6); //定位到第6行
System.out.println(rs2.getString(1));