JDBC day02



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






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值