• JDBC入门(1)—— 入门案例


       JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序,同时,JDBC也是个商标名。

    一、Java连接数据库示例:

    1、步骤:

    • 导jar包:驱动。
    • 加载驱动类:Class.forName("类名");
    • 给出url、username、password,其中url背下来。
    • 使用DriverManager类来得到Connection对象。
     1 public class Demo1 {
     2     /**
     3      * ClassNotFoundException:
     4      * 没有导入驱动包
     5      *
     6      * SQLException:
     7      *  检查三个参数:url、username、password是否正确
     8      *  检查是否开启了mysql服务器。
     9      *
    10      */
    11     @Test
    12     public void fun1() throws ClassNotFoundException,SQLException{
    13         /**
    14          * jdbc四大配置参数
    15          *   driverClassName:com.mysql.jdbc.Driver
    16          *   url:jdbc:mysql://localhost:3306/数据库名
    17          *   username:root
    18          *   password:
    19          */
    20         Class.forName("com.mysql.jdbc.Driver");//加载驱动类(注册驱动)
    21 
    22         //使用url、username、password,得到连接对象
    23         Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb_1","root","");
    24         System.out.println(con);
    25     }
    26 }

    2、基本异常

    未导驱动包:java.lang.ClassNotFoundException: com.mysql.jdbc.Driver ;

    数据库不存在:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown database 'mydb';

    端口错误:com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure;

    密码错误:java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES);

    用户不存在:java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES);

    二、JDBC原理

    Class.forName("com.mysql.jdbc.Driver");//此据等同于以下面两句,与最后一句的逻辑关系
    com.mysql.jdbc.Driver driver = new com.mysql.jdbc.Driver;
    DriverManager.registerDriver(driver);
    Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb_1","root","");

      所有的java.sql.Driver实现类,都提供了static块,块内的代码就是把自己注册到DriverManage中,如com.mysql.jdbc.Driver中的部分源码:

    public class Driver extends NonRegisteringDriver implements java.sql.Driver {
        //
        // Register ourselves with the DriverManager
        //
        static {
            try {
                java.sql.DriverManager.registerDriver(new Driver());
            } catch (SQLException E) {
                throw new RuntimeException("Can't register driver!");
            }
        }
    
        /**
         * Construct a new driver and register it with DriverManager
         * 
         * @throws SQLException
         *             if a database error occurs.
         */
        public Driver() throws SQLException {
            // Required for Class.forName().newInstance()
        }
    }

      JDBC 4.0之后,每个驱动jar包中,在META-INF/services目录下提供了一个名为java.sql.Driver的文件,文件的内容就是该接口的实现类名称。连接数据库例子中,第20行“Class.forName("com.mysql.jdbc.Driver");”可省略不写。

    三、使用JDBC对数据库进行简单的增删改查操作示例

      1 package demo2;
      2 
      3 import org.junit.Test;
      4 import java.sql.*;
      5 
      6 public class Demo2 {
      7     /*
      8     * 对数据库进行增、删、改操作
      9     * */
     10     @Test
     11     public void fun1() throws ClassNotFoundException,SQLException {
     12         /*
     13         * 一、得到Connection
     14         * 1、准备四个参数
     15         * 2、加载驱动类
     16         * 3、得到Connection
     17         * */
     18 
     19         String driverClassName = "com.mysql.jdbc.Driver";
     20         //jdbc协议的格式,jdbc:工商的名称:子协议(由工商自己来规定)
     21         //对mysql而言,它的子协议结构://主机:端口号/数据库名称
     22         String url = "jdbc:mysql://localhost:3306/mydb1";
     23         String username = "root";
     24         String password = "";
     25         //加载驱动类
     26         Class.forName(driverClassName);
     27         //使用DriverManager,以及剩下的三个参数,得到Connection
     28         Connection con = DriverManager.getConnection(url, username, password);
     29         /*
     30         * 二、对数据库做增删改
     31         *1、通过Connection对象创建Statement
     32         *  Statement 语句的发送器,它的功能就是向数据库发送sql语句,
     33         *2、调用它的int executeUpdate(String sql),它可以发送DML、DDL
     34         * */
     35         Statement stmt = con.createStatement();
     36 //        String sql = "INSERT INTO stu VALUES('0003','wangwu',88,'male')";
     37 //        String sql = "UPDATE stu SET name='zhaoliu',age=22,gender='female' WHERE " +
     38 //                "number='0003'";
     39         String sql = "DELETE FROM stu";
     40         int r = stmt.executeUpdate(sql);
     41         System.out.println(r);
     42     }
     43     /*
     44      * 执行查询操作
     45      * */
     46      @Test
     47     public void fun2() throws ClassNotFoundException,SQLException {
     48 
     49          /*
     50          * 一、得到Connection
     51          * 二、得到Statement,发送select语句
     52          * 三、对查询返回的"表格"进行解析
     53          * */
     54          /*
     55          * 一、得到连接
     56          * */
     57          String driverClassName = "com.mysql.jdbc.Driver";
     58          String url = "jdbc:mysql://localhost:3306/mydb1";
     59          String username = "root";
     60          String password = "";
     61 
     62          Class.forName(driverClassName);
     63          Connection con = DriverManager.getConnection(url,username,password);
     64          /*
     65          * 二、得到Statement,执行select语句
     66          * */
     67          Statement stmt = con.createStatement();
     68          /*
     69          *调用Statement的ResultSet rs = executeQuery(String querySql);
     70          * */
     71          ResultSet rs = stmt.executeQuery("SELECT * FROM emp");
     72          /*
     73          * 三、解析ResultSet
     74          * 1、把行光标移动到第一行,可以调用next()方法完成。
     75          * */
     76          while (rs.next()) { //把光标向下移动一行,并判断下一行是否存在
     77              int empno = rs.getInt(1);//通过列编号来获取该列的值
     78              String ename = rs.getString("ename");//通过列名称来获取该列的值
     79              double sal = rs.getDouble("sal");
     80 
     81              System.out.println(empno+","+ename+","+sal);
     82          }
     83          /*
     84          * 四、关闭资源
     85          * 倒关
     86          * */
     87          rs.close();
     88          stmt.close();
     89          con.close();//必须关,不关就死。
     90     }
     91     //规范化
     92     @Test
     93     public void fun3() throws Exception {
     94         Connection con = null;//定义引用
     95         Statement stmt = null;
     96         ResultSet rs = null;
     97         try {
     98             //一、得到Connection
     99             String driverClassName  = "com.mysql.jdbc.Driver";
    100             String url = "jdbc:mysql://localhost:3306/mydb1";
    101             String username = "root";
    102             String password = "";
    103             Class.forName(driverClassName);
    104             con = DriverManager.getConnection(url,username,password);//实例化
    105             //二、创建Statement
    106             stmt = con.createStatement();
    107             String sql = "SELECT * FROM emp";
    108             rs = stmt.executeQuery(sql);//实例化
    109             //三、循环遍历rs,打印其中数据
    110             //getString()和getObject()是通用的
    111             int count = rs.getMetaData().getColumnCount();
    112             while (rs.next()) {
    113                 for (int i = 1; i <= count; i++) {
    114                     System.out.print(rs.getString(i));
    115                     if (i<count) {
    116                         System.out.print(",");
    117                     }
    118                 }
    119                 System.out.println();
    120             }
    121 
    122         } catch (Exception e) {
    123             throw new RuntimeException(e);
    124         } finally {
    125             //为了防止空指针异常发生,使用判断语句
    126             if(rs != null) rs.close();
    127             if(stmt != null) stmt.close();
    128             if(con != null) con.close();
    129         }
    130     }
    131 }

     四、注意:数据库的列号是从1开始计算的。

  • 相关阅读:
    HBASE列族不能太多的真相 (一个table有几个列族就有几个 Store)
    Linux虚拟机添加新硬盘的全程图解
    Servlet 单例多线程
    MapReduce类型与格式(输入与输出)
    hbase集群的启动,注意几个问题
    spring 的IoC的个人理解
    深入Java核心 Java中多态的实现机制(1)
    spring mvc 请求转发和重定向(转)
    XML中<beans>中属性概述
    hadoop+javaWeb的开发中遇到包冲突问题(java.lang.VerifyError)
  • 原文地址:https://www.cnblogs.com/gdwkong/p/7631994.html
Copyright © 2020-2023  润新知