暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

JDBC基础

Hello 帅帅 2021-02-05
556

基础入门

  1. 注册驱动

  2. 获取Connection对象

  3. 获取执行sql的对象

  4. 执行sql

  5. 释放资源

     public class JDBCDemo1Insert {
    public static void main(String[] args) {
    Statement stmt = null;
    Connection conn = null;
    try {
    //1. 注册驱动
    Class.forName("com.mysql.cj.jdbc.Driver");
    //2. 定义sql
    String sql = "insert into student values (20185663,'杜Zn','男',20,'CS','2000-09-01')";
    //3.获取Connection对象
    conn = DriverManager.getConnection("jdbc:mysql:///jdbclearning?serverTimezone=Asia/Shanghai", "root", "12345");
    //4.获取执行sql的对象 Statement
    stmt = conn.createStatement();
    //5.执行sql
    int count = stmt.executeUpdate(sql);//影响的行数
    //6.处理结果
    System.out.println(count);
    if (count > 0) {
    System.out.println("添加成功!");
    } else {
    System.out.println("添加失败!");
    }
    } catch (ClassNotFoundException | SQLException e) {
    e.printStackTrace();
    } finally {
    //stmt.close();
    //7. 释放资源
    //避免空指针异常
    if (stmt != null) {
    try {
    stmt.close();
    } catch (SQLException e) {
    e.printStackTrace();
    }
    }
    if (conn != null) {
    try {
    conn.close();
    } catch (SQLException e) {
    e.printStackTrace();
    }
    }
    }
    }
    }

    注册驱动

       Class.forName("com.mysql.cj.jdbc.Driver");

      通过反射创建该类,该类中有静态代码块,会执行注册驱动代码

         public class Driver extends NonRegisteringDriver implements java.sql.Driver {
        public Driver() throws SQLException {
        }
        static {
        try {
        DriverManager.registerDriver(new Driver());
        } catch (SQLException var1) {
        throw new RuntimeException("Can't register driver!");
        }
        }
        }

        获取Connection对象

           Connection conn = DriverManager.getConnection("jdbc:mysql:///databasename?serverTimezone=Asia/Shanghai", "name", "password");

          参数:

          1. mysql数据库URL地址

          2. 数据库账号

          3. 数据库密码

          获取执行sql的对象

             Statement stmt = conn.createStatement();

            Connection对象常用方法

            方法描述
            createStatement()创建向数据库发送sql的statement对象。
            prepareStatement(sql)创建向数据库发送预编译sql的PrepareSatement对象。
            prepareCall(sql)创建执行存储过程的callableStatement对象。
            setAutoCommit(boolean autoCommit)设置事务是否自动提交。
            commit()在链接上提交事务。
            rollback()在此链接上回滚事务。

            执行sql

               stmt.executeUpdate(sql);

              Statement对象常用方法:

              方法含义
              executeQuery(String sql)用于向数据发送查询语句。
              executeUpdate(String sql)用于向数据库发送insert、update或delete语句
              execute(String sql)用于向数据库发送任意sql语句
              addBatch(String sql)把多条sql语句放到一个批处理中。
              executeBatch()向数据库发送一批sql语句执行。

              释放资源

                 stmt.close();
                执行DDL

                DDL:操作数据库、表

                核心代码:

                   //4.获取执行sql的对象 Statement
                  stmt = conn.createStatement();
                  //5.执行sql
                  boolean execute = stmt.execute("DDL语句");
                  执行DML

                  DML:增删改表中数据

                  SQL注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接。会造成安全性问题

                  1. 输入用户随便,输入密码:a' or 'a' = 'a

                  2. sql:select * from user where username = 'fhdsjkf' and password = 'a' or 'a' = 'a' 。会导致密码无论是什么都是正确

                  核心代码(无预处理):

                     //4.获取执行sql的对象 Statement
                    stmt = conn.createStatement();
                    //5.执行sql
                    int count = stmt.executeUpdate("DML语句");//影响的行数

                    核心代码(含预处理):

                       Statement stmt = conn.createStatement();
                      PreparedStatement pre = conn.prepareStatement("insert into student values (20185665,'杜Zn',?,20,?,'2000-09-01')");
                      pre.setString(1,"");
                      pre.setString(2,"CS");
                      int i = pre.executeUpdate();

                      执行DQL

                      DQL:查询表中的记录

                      Jdbc程序中的ResultSet用于代表Sql语句的执行结果。Resultset封装执行结果时,采用的类似于表格的方式,ResultSet 对象维护了一个指向表格数据行的游标,初始的时候,游标在第一行之前,调用ResultSet.next() 方法,可以使游标指向具体的数据行,进行调用方法获取该行的数据。

                      获取行

                      ResultSet提供了对结果集进行滚动的方法:

                      • next():移动到下一行

                      • Previous():移动到前一行

                      • absolute(int row):移动到指定行

                      • beforeFirst():移动resultSet的最前面。

                      • afterLast() :移动到resultSet的最后面。

                      获取值

                      ResultSet既然用于封装执行结果的,所以该对象提供的都是用于获取数据的get方法:

                      • 获取任意类型的数据

                      getObject(int index)

                      getObject(string columnName)

                      • 获取指定类型的数据,例如:

                      getString(int index)

                      getString(String columnName)

                      常用数据类型转换:

                      SQL类型Jdbc对应方法返回类型
                      bit(1),bit(n)getBoolean,getBytes()Boolean,byte[]
                      tinyintgetByte()Byte
                      smallintgetShort()Short
                      intgetIntInt
                      bigintgetLong()Long
                      char,varchar,longvarchargetStringString
                      text(clob) blobgetClob(),getblob()Clob,blob
                      dategetDate()java.sql.Date
                      timegetTime()java.sql.Time
                      timestampgetTimestampjava.sql.Timestamp

                      执行

                         Statement stmt = conn.createStatement();
                        resultSet = stmt.executeQuery("select * from student ");
                        List<Student> students = CreateClass.CreateStudent(resultSet);
                        System.out.println(students);

                        CreateClass.CreateStudent:

                           public static List<Student> CreateStudent(ResultSet resultSet) {
                          List<Student> list = new ArrayList<>();
                          Student s;
                          try {
                          while (resultSet.next()) {
                          String sno = resultSet.getString("Sno");
                          //String sno = resultSet.getString(1);
                          String sname = resultSet.getString("Sname");
                          String ssex = resultSet.getString("Ssex");
                          short ssage = resultSet.getShort("Sage");
                          String sdept = resultSet.getString("Sdept");
                          Date s_entrance = resultSet.getDate("S_entrance");
                          s = new Student(sno, sname, ssex, ssage, sdept, s_entrance);
                          list.add(s);
                          }
                          } catch (SQLException e) {
                          e.printStackTrace();
                          }
                          return list;
                          }

                          事务处理

                          • 开启事务:setAutoCommit(boolean autoCommit) :调用该方法设置参数为false,即开启事务

                          • 提交事务:commit()

                          • 回滚事务:rollback()

                             connection.setAutoCommit(false);
                            Statement statement = connection.createStatement();
                            int i = statement.executeUpdate("DML语句");
                            connection.commit();
                            // connection.rollback();



                            文章转载自Hello 帅帅,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                            评论