MySQL(四)

思维导图

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();
      
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);
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值