JDBC学习(二)之JDBC对象介绍

JDBC对象介绍

JDBC中的主要类

  • DriverManager;
  • Connection;
  • Statement;
  • ResultSet;

DriverManager:

  1. Class.forName(“com.mysql.jdbc.Driver”);//注册驱动
  2. String url = “jdbc:mysql://localhost:3306/mydb1”;
  3. String username = “root”;
  4. String password = “123”;
  5. Connection con = DriverManager.getConnection(url, username, password);

上面5句代码容易出现的异常

ClassNotFountException:第一句容易出现,一般两个原因

  • 没有导入对应的数据库驱动jar包
  • 类名打错了

SQLException:这个异常出现在第5句,三个参数出错

 

Connection:

最为重要的方式 createStatement()

Statement st=Connection.createStatement();//无参方法获得statement对象

还有一个有参重载函数,来确定生成对应的结果集

Statement st=Connection.createStatement(int,int);//无参方法获得statement对象

两个参数具体含义,在后面ResultSet中说明

 

Statement:

语句发送器拥有两个最为重要的方法

  • int executeUpdate(String sql):用来执行更新操作,包括DML(insert、update、delete)和DDL(create、drop、alter),返回影响的行数;
  • ResultSet executeQuery(String sql):用来执行select查询,返回包含查询的结果集

除了上面两个常用的方法还有一个 boolean execute(String sql),可以执行executeUpdate(String sql)和executeQuery(String sql)两个方法的语句。但是返回是Boolean,表示是否有结果集。可以通过getUpateCount来获取增删改影响的行数;通过getResultSet()来获取查询结果集。

public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //加载驱动类
        Class.forName("com.mysql.jdbc.Driver");
        //jdbc:mysql://ip:端口号/数据库名
        String url="jdbc:mysql://localhost:3306/sql_test";
        String username="root";
        String password="123456";

        //在try外引用定义,可以在finally中操作
        Connection cn=null;
        Statement statement=null;
        ResultSet res=null;
        boolean isRes=false;
        try{

            cn= DriverManager.getConnection(url,username,password);
            statement=cn.createStatement();
            //查询
            String sql_select="select * from jsdbtest";
            //查询返回的是结果集
            isRes=statement.execute(sql_select);
            if(isRes){
                res=statement.getResultSet();
            }


            while(res.next()){
                //可以通过属性名来获取值
                String name=res.getString("name");
                //也可以通过列标来获取
                String sex=res.getString(3);
                int age=res.getInt("age");
                System.out.println(name+","+sex+","+age);
            }
        }catch(Exception e){
            throw new RuntimeException(e);
        }finally {
            //先判断是否实例化,防止空指针异常
            if(res!=null) res.close();
            if(statement!=null)statement.close();
            if(cn!=null) cn.close();
        }


    }

ResultSet

结果集特性:

  • 是否可滚动
  • 是否敏感
  • 是否可更新

当使用Connection的createStatement时,可以确定结果集的特性

Connection.createStatement():生成的结果集:不滚动、不敏感、不可更新

Connection.createStatement(int resultSetType, int resultSetConcurrency):

第一个参数:

  1. ResultSet.TYPE_FORWARD_ONLY:不滚动结果集;
  2. ResultSet.TYPE_SCROLL_INSENSITIVE:滚动结果集,但结果集数据不会再跟随数据库而变化;
  3. ResultSet.TYPE_SCROLL_SENSITIVE:滚动结果集,但结果集数据会跟随数据库而变化;

对于敏感这个感念可以参考 TYPE_SCROLL_SENSITIVE问题

第二个参数:

  1. CONCUR_READ_ONLY:结果集是只读的,不能通过修改结果集而反向影响数据库;
  2. CONCUR_UPDATABLE:结果集是可更新的,对结果集的更新可以反向影响数据库。

ResultSet是一个二维表,内部维护一个行光标,拥有以下方法

  1. void beforeFirst():把光标放到第一行的前面,这也是光标默认的位置;
  2. void afterLast():把光标放到最后一行的后面;
  3. boolean first():把光标放到第一行的位置上,返回值表示调控光标是否成功;
  4. boolean last():把光标放到最后一行的位置上;
  5. boolean isBeforeFirst():当前光标位置是否在第一行前面;
  6. boolean isAfterLast():当前光标位置是否在最后一行的后面;
  7. boolean isFirst():当前光标位置是否在第一行上;
  8. boolean isLast():当前光标位置是否在最后一行上;
  9. boolean previous():把光标向上挪一行;
  10. boolean next():把光标向下挪一行;
  11. boolean relative(int row):相对位移,当row为正数时,表示向下移动row行,为负数时表示向上移动row行;
  12. boolean absolute(int row):绝对位移,把光标移动到指定的行上;
  13. int getRow():返回当前光标所有行。

其中1-9是通用的,无参函数createStatement(),在10-13中可以使用next();其他的是滚动模式可以使用。

获取结果集元数据

  1. 得到元数据:rs.getMetaData(),返回值为ResultSetMetaData;
  2. 获取结果集列数:int getColumnCount()
  3. 获取指定列的列名:String getColumnName(int colIndex)

结果集元素据使用方法

public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //加载驱动类
        Class.forName("com.mysql.jdbc.Driver");
        //jdbc:mysql://ip:端口号/数据库名
        String url="jdbc:mysql://111.230.144.70:3306/sql_test";
        String username="root";
        String password="123456";

        //在try外引用定义,可以在finally中操作
        Connection cn=null;
        Statement statement=null;
        ResultSet res=null;
        boolean isRes=false;
        try{

            cn= DriverManager.getConnection(url,username,password);
            statement=cn.createStatement();
            //查询
            String sql_select="select * from jsdbtest";
            //查询返回的是结果集
            isRes=statement.execute(sql_select);
            if(isRes){
                res=statement.getResultSet();
            }


            while(res.next()){
                //得到结果集元数据对象
                ResultSetMetaData rm=res.getMetaData();
                //得到结果集行数
                int countNum=rm.getColumnCount();
                //这里需要注意行标从1开始
                for(int i=1;i<=countNum;i++){
                    //getString()和getObject()方法是通用的
                    System.out.print(res.getString(i)+" ");
                }
                System.out.println(",");

            }
        }catch(Exception e){
            throw new RuntimeException(e);
        }finally {
            //先判断是否实例化,防止空指针异常
            if(res!=null) res.close();
            if(statement!=null)statement.close();
            if(cn!=null) cn.close();
        }
    }

通过结果集元数据可以轻松遍历结果集所有数据

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值