package day02;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import org.junit.Test;
import smis.unit.JdbcUnit;
public class SwTest {
@Test
public void testNoSW() throws Exception {
// 查询是否有钱
String sql = "SELECT * FROM account WHERE name = ? and balance >= ?";
Connection conn = JdbcUnit.getConn();
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, "张无忌");
ps.setInt(2, 1000);
ResultSet rs = ps.executeQuery();
if (!rs.next()) {
throw new RuntimeException("亲,你的余额不足!");
}
// 扣除张无忌的1000
sql = "UPDATE account SET balance = balance - ? WHERE name = ?";
ps = conn.prepareStatement(sql);
ps.setInt(1, 1000);
ps.setString(2, "张无忌");
ps.executeUpdate();
// 赵敏增加1000
sql = "UPDATE account SET balance = balance + ? WHERE name = ?";
ps = conn.prepareStatement(sql);
ps.setInt(1, 1000);
ps.setString(2, "赵敏");
ps.executeUpdate();
JdbcUnit.close(conn, ps, rs);
}
@Test
public void testSW() {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
// 查询是否有钱
String sql = "SELECT * FROM account WHERE name = ? and balance >= ?";
conn = JdbcUnit.getConn();
//取消事务的自动提交
conn.setAutoCommit(false);
ps = conn.prepareStatement(sql);
ps.setString(1, "张无忌");
ps.setInt(2, 1000);
rs = ps.executeQuery();
if (!rs.next()) {
throw new RuntimeException("亲,你的余额不足!");
}
// 扣除张无忌的1000
sql = "UPDATE account SET balance = balance - ? WHERE name = ?";
ps = conn.prepareStatement(sql);
ps.setInt(1, 1000);
ps.setString(2, "张无忌");
ps.executeUpdate();
// 赵敏增加1000
sql = "UPDATE account SET balance = balance + ? WHERE name = ?";
ps = conn.prepareStatement(sql);
ps.setInt(1, 1000);
ps.setString(2, "赵敏");
ps.executeUpdate();
//提交事务
conn.commit();
} catch (Exception e) {
e.printStackTrace();
try {
//回滚事务
conn.rollback();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
} finally {
JdbcUnit.close(conn, ps, rs);
}
}
}
批处理操作
package day02._02_batch;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.Statement;
import org.junit.Test;
import smis.unit.JdbcUnit;
public class BatchTest {
/**
* @param args
*/
@Test
//InnoDB 4443
//MyISAM 1220
public void testInsertByStatementBatch() throws Exception{
Connection conn = JdbcUnit.getConn();
Statement st = conn.createStatement();
long begin = System.currentTimeMillis();
for(int i=1;i<=1000;i++){
String sql = "INSERT INTO t_student (age) VALUES ("+i+")";
st.addBatch(sql);
if(i%200==0){
st.executeBatch();//执行批量语句
st.clearBatch();//清理批处理中的缓存
}
}
System.out.println(System.currentTimeMillis() - begin);
JdbcUnit.close(conn, st, null);
}
//InnoDB 5308
//MyISAM 2570
public static void main(String[] args) throws Exception {
String sql = "INSERT INTO t_student (age) VALUES (?)";
Connection conn = JdbcUnit.getConn();
PreparedStatement ps = conn.prepareStatement(sql);
long begin = System.currentTimeMillis();
for(int i =0;i<=1000;i++){
ps.setInt(1, i);
ps.addBatch();
if(i%200 == 0){
ps.executeBatch();
ps.clearBatch();
ps.clearParameters(); // 这里和上面的Statement不一样,需要清理参数
}
}
System.out.println(System.currentTimeMillis() - begin);
JdbcUnit.close(conn, ps, null);
}
}
不知道为什么使用PreparedStatement Junit不行,于是乎直接main吧!
获取自动生成的主键
在注册页面的时候,一开始只需要账户和密码,点击注册后会让你更新资料,这个时候就需要获取自动生成的主键了
连接池思想
为什么必须使用数据库连接池:
普通的JDBC数据库连接(Connectiond对象)使用 DriverManager来获取,每次向数据库建立连接的时候都要将 Connection 加载到内存中,再验证用户名和密码(得花费0.05s~1s的时间),数据库的连接是比较昂贵的(创建的成本比较大)。
需要数据库连接的时候,就向数据库要求一个,执行完成后再断开连接。这样的方式将会消耗大量的资源和时间。
数据库的连接资源并没有得到很好的重复利用.若同时有几百人甚至几千人在线,频繁的进行数据库连接操作将占用很多的系统资源,严重的甚至会造成服务器的崩溃
dbcp连接池