首页 > 学院 > 开发设计 > 正文

JDBC day02

2019-11-11 07:05:19
字体:
来源:转载
供稿:网友

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连接池


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表