1、批量操作 batch
- 批量操作: 可以把多次sql合并成一次执行,避免了频繁和数据库服务器进行交互,从而提高执行效率。
- 使用方式:
- Statement
// 执行sql String sql1 = "insert into user values(null,'悟空',18)"; String sql2 = "insert into user values(null,'悟净',20)"; String sql3 = "insert into user values(null,'悟能',16)"; // 批量执行 stat.addBatch(sql1); stat.addBatch(sql2); stat.addBatch(sql3); // 执行arr是每条sql的生效行数 int arr[] = stat.executeBatch();
- PreparedStatement
// 创建sql执行对象 String sql = "insert into user values(null,?,?)"; stat = conn.prepareStatement(sql); stat.setString(1, "刘备"); stat.setInt(2, 20); // 添加到批量操作 stat.addBatch(); stat.setString(1, "关羽"); stat.setInt(2, 18); // 添加到批量操作 stat.addBatch(); stat.setString(1, "张飞"); stat.setInt(2, 28); // 添加到批量操作 stat.addBatch(); // 执行sql int arr[] = stat.executeBatch();
- Statement
2、分页查询
在控制台输入页数和每页的数量 得到对应的内容 (如: 输入页数3 每页数量输入5 则得到第11-15条数据)。
public void select(){
Scanner scan = new Scanner(System.in);
System.out.println("请输入页数:");
int page = scan.nextInt();
System.out.println("请输入每页条数:");
int count = scan.nextInt();
Connection conn = null;
PreparedStatement stat = null;
ResultSet rs = null;
try {
// 获取连接对象
conn = DBUnits.getConn();
// 创建sql执行对象
String sql = "select * from user limit ?,?";
stat = conn.prepareStatement(sql);
// 设置跳过条数
stat.setInt(1, (page-1)*count);
// 设置每页条数
stat.setInt(2, count);
// 执行sql
rs = stat.executeQuery();
while(rs.next()){
String id = rs.getString(1);
String name = rs.getString(2);
String age = rs.getString(3);
System.out.println(id+":"+name+":"+age);
}
System.out.println("查询完毕!");
} catch (Exception e) {
e.printStackTrace();
} finally {
// 关闭资源
DBUnits.close(rs, stat, conn);
}
}
3、事务
关闭自动提交 conn.setAutoCommit(false)
提交 conn.commit()
回滚 conn.rollback()
练习: 实现蝙蝠侠给超人转账。
超人有500,蝙蝠侠有5000。代码运行: 蝙蝠侠给超人转账2000,前两次转账成功 提交,第三次转账失败 回滚。
public class TransactionTest {
public static void main(String[] args) {
Connection conn = null;
Statement stat = null;
ResultSet rs = null;
try {
// 获取连接对象
conn = DBUnits.getConn();
// 创建sql执行对象
stat = conn.createStatement();
// 关闭自动提交
conn.setAutoCommit(false);
String sql1 = "Update person set money=money+2000 where id=1";
String sql2 = "Update person set money=money-2000 where id=2";
// 执行sql
stat.executeUpdate(sql1);
stat.executeUpdate(sql2);
// 查询蝙蝠侠剩余的钱
String sql3 = "select *from person where id=2";
rs = stat.executeQuery(sql3);
while(rs.next()){
int money = rs.getInt("money");
// 判断转完后是否还有钱 剩余的钱不能是负数
if(money>=0){
conn.commit();
System.out.println("转账成功!");
}else{
conn.rollback();
System.out.println("转账失败!");
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// 关闭资源
DBUnits.close(rs, stat, conn);
}
}
}
4、获取自增主键值
步骤:
step1. stat.execute(sql, Statement.RETURN_GENERATED_KEYS); 执行sql 并且返回自增主键
step2. rs = stat.getGeneratedKeys(); 得到返回的主键值
step3. while(rs.next()) { int id = rs.getInt(1); } 取出值
5、获取元数据
获取数据库元数据:
step1. DatabaseMetaData md = conn.getMetaData(); 得到数据库元数据
step2. md.getDriverVersion() 驱动版本
md.getUserName() 用户名
md.getURL() 链接地址
md.getDatabaseProductName() 数据库厂商
获取表元数据
step1. rs = stat.executeQuery(“select *from user”); 执行sql
step2. ResultSetMetaData md = rs.getMetaData(); 从结果集中得到表的元数据
step3. int columnCount = md.getColumnCount(); 得到表的字段数量
step4. String name = md.getColumnName(i+1); 获取每一个字段的名称
public class MetaDataTest {
@Test
public void database(){
Connection conn = null;
Statement stat = null;
ResultSet rs = null;
try {
// 获取连接对象
conn = DBUnits.getConn();
// 得到数据库元数据
DatabaseMetaData md = conn.getMetaData();
System.out.println("驱动版本:"+md.getDriverVersion());
System.out.println("用户名:"+md.getUserName());
System.out.println("连接地址:"+md.getURL());
System.out.println("数据库厂商:"+md.getDatabaseProductName());
} catch (Exception e) {
e.printStackTrace();
} finally {
// 关闭资源
DBUnits.close(rs, stat, conn);
}
}
@Test
public void table(){
Connection conn = null;
Statement stat = null;
ResultSet rs = null;
try {
// 获取连接对象
conn = DBUnits.getConn();
// 创建sql执行对象
stat = conn.createStatement();
// 执行sql
rs = stat.executeQuery("select *from user");
// 从结果集中得到表的元数据
ResultSetMetaData md = rs.getMetaData();
// 得到表的字段数量
int columnCount = md.getColumnCount();
// 获取每一个字段的名称
for(int i=0; i<columnCount; i++){
String name = md.getColumnName(i+1);
System.out.println("字段:"+name);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// 关闭资源
DBUnits.close(rs, stat, conn);
}
}
}