欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-03-14 09:52:34
...

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();

批量处理

什么是批量处理

为什么使用批量处理

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

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

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

使用批量处理

  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);
    }
}

结果集元数据

就是结果集的相关信息

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

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

如何使用

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);
        }
    }

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

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

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

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

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

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

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

查询不许使用select *