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连接池
新闻热点
疑难解答