学习jdbc第三天(最后一天)

day03

复习

1.使用JDBC的流程

  1. 下载jar包
  2. 注册驱动

    Class.forName(DriverClassName);

  3. 获得连接对象

    BasicDataSource ds=new BasicDataSource(); Connection conn=ds.getConnection();

  4. 获取能够执行sql语句的对象

    Statement sta=conn.createStatement(); PreparedStatement ps=conn.preparedStatement(DML);

  5. 运行sql语句/执行计划

    • sta.execute(DDL);
    • ps.setXXX(index,值);
    • ps.executeUpdate();
    • ResultSet rs=ps.executeQuery();
  6. 处理ResultSet中结果集

    while(rs.next()){ rs.getXXX("字段名");//注意别名 rs.getXXX(index); }

  7. 归还连接对象

    conn.close();

批量处理

什么是批量处理

为什么使用批量处理




使用批量处理

  1. 积攒DDL语句,使用Statement对象

    sta.addBatch(ddl);
    sta.executeBatch();
    sta.clearBatch();
    

public static void main(String[] args) {
    //准备一批sql语句
    String ddl1="create table log1(id int,msg varchar(20))";
    String ddl2="create table log3(id int,msg varchar(20))";
    String ddl3="create table log4(id int,msg varchar(20))";
    String ddl4="create table log5(id int,msg varchar(20))";
    String ddl5="create table log2(id int,msg varchar(20))";
    Connection conn=null;
    try {
        conn=DBUtils1.getConnection();
        Statement sta=conn.createStatement();
        //把一批sql语句添加到缓存中
        sta.addBatch(ddl1);
        sta.addBatch(ddl2);
        sta.addBatch(ddl3);
        sta.addBatch(ddl4);
        sta.addBatch(ddl5);
        //执行一批SQL语句
        int[] arr=sta.executeBatch();
        //返回值有3种
        //1.>=0 代表成功
        //2.代表成功-2
        //oracle对executeBatch()并不完全支持,返回-2
        //3.代表失败-3
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }finally{
        DBUtils1.closeConnection(conn);
    }

}
  1. 积攒参数,使用PreparedStatement,重用执行计划

    ps.addBatch(); ps.executeBatch(); ps.clearBatch();


public static void main(String[] args) {
    //准备dml语句
    String dml=
            "insert into log1 values(?,?)";
    Connection conn=null;
    try {
        conn=DBUtils1.getConnection();
        PreparedStatement ps=
                conn.prepareStatement(dml);
        //把一批参数添加到ps的缓存中
        ps.setInt(1, 1);
        ps.setString(2, "1111");
        ps.addBatch();
        ps.setInt(1, 2);
        ps.setString(2, "2222");
        ps.addBatch();
        ps.setInt(1, 3);
        ps.setString(2, "3333");
        ps.addBatch();
        //批量执行一批参数
        int[] arr=ps.executeBatch();
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }finally {
        DBUtils1.closeConnection(conn);
    }
}

结果集元数据

就是结果集的相关信息

为了获取结果集中其它的描述信息


如何使用

public static void main(String[] args) {
    Connection conn=null;
    try {
        conn=DBUtils1.getConnection();
        String sql="select * from emp";
        Statement sta=conn.createStatement();
        ResultSet rs=sta.executeQuery(sql);
        //获取元数据
        ResultSetMetaData meta=
                rs.getMetaData();
        //获取列的数量
        int n=meta.getColumnCount();
        System.out.println(n);
        //获取列的名称
        String name1=meta.getColumnName(1);
        String name2=meta.getColumnName(2);
        System.out.println(name1+"~"+name2);
        for(int i=1;i<=meta.getColumnCount();i++){
            System.out.println(meta.getColumnName(i));
        }


    } catch (Exception e) {
        e.printStackTrace();
    }finally {
        DBUtils1.closeConnection(conn);
    }
}

课堂练习

  1. 使用sta对象,批量执行DDL语句 5个

    log6 (id int,msg varchar(20)) sta.addBatch(sql) sta.executeBatch()

  2. 使用preparedStatement对象,批量更新20条数据

    • 控制不让内存溢出

事务

set autocommit=0; start transaction

.... commit/rollback

课堂练习

  • 借钱的业务

    create table account1( id int, name varchar(20), money double(7,2) ) insert into account1 values(1,'aaa',10000); insert into account1 values(2,'bbb',100);

课堂练习

  1. 完成转账事务逻辑
  2. 提高,把这个逻辑封装成方法 pay(int from,int to,double money) from--->减钱的账户ID to----->加钱的账户id money-->转了多少钱

返回自动主键

    create table post(
        id int  primary key auto_increment,
        content varchar(200),
        k_id int
    );
    create table keywords(
        id int primary key auto_increment,
        content varchar(20)
    );

jdbc操作分页

mysql大表查询必须使用分页

select id from keywords limit 1,5;

    public static void main(String[] args) {
        Connection conn=null;
        try {
            conn=DBUtils1.getConnection();
            String sql="select id "
                    + "from keywords limit ?,?";
            PreparedStatement ps=
                    conn.prepareStatement(sql);
            //从0开始,显示5条
            ps.setInt(1, 0);
            ps.setInt(2, 5);
            ResultSet rs=ps.executeQuery();
            while(rs.next()){
                System.out.println(rs.getInt(1));
            }
        } catch (Exception e) {
        }finally {
            DBUtils1.closeConnection(conn);
        }
    }


官方要求查询结果存在数据库的缓存中

直到rs.getXXX,数据才会传到服务器内存

但是mysql根标准官方建议不一样,对jdbc查询实现的不好

Mysql只要一执行查询,就把结果全部存到服务器内存中了

Mysql只要查询大表,必须使用分页

所以mysql的分页操作非常简单,算是一种补救

查询不许使用select *

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值