Jdbc笔记 —— 基本概念

JDBC的基本使用步骤

  1. 导入驱动jar包
  2. 加载驱动的Class类文件
  3. 获取数据库链接对象
  4. 定义sql语句
  5. 设置参数,执行sql
  6. 获取结果
  7. 释放资源

典型的代码示例如下:

Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db1","root","root");
String sql = "select * from accout where id = 1";
Statement stmt = conn.createStatement(sql);
ResultSet result = stmt.execute(sql);
stmt.close();
conn.close():

JDBC的各个对象

  1. DriverManager:驱动管理对象

    功能

    1. 注册驱动

      public static synchronized void registerDriver(java.sql.Driver driver)
      

      但 写代码时,注册驱动使用的是

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

      进入到com.mysql.jdbc.Driver中,发现在静态代码块中调用了DriverManager中的registerDrvier

      static {
              
              
              try {
              
              
                  DriverManager.registerDriver(new Driver());
              } catch (SQLException var1) {
              
              
                  throw new RuntimeException("Can't register driver!");
              }
          }
      

      其实在使用mysql 5 以后的驱动jar包时,可以省略注册驱动这一步,这是因为在mysql的驱动jar包中,通过META-INF/services中配置了Driver接口的实现类,这样通过Java的SPI机制会自动加载com.mysql.jdbc.Driver类。

    2. 获取数据库连接

      public static Connection getConnection(String url,String username,String password);
      

      url的语法格式:

      jdbc:mysql://ip地址(域名):端口/数据库名称

      比如jdbc:mysql://localhost:3306/user

      如果调用本地mysql,且端口是3306,则url可以简写为

      jdbc:mysql:///user

  2. Connection:数据库连接对象

    功能

    1. 获取执行sql的对象(Statement)

      Statement createStatement();
      PreparedStatement prepareStatement(String sql)
      
    2. 管理事务

      1. 开启事务

        传入false,表示要手动提交事务,就不会默认的执行一行Sql就提交一次事务,从而可以控制多个Sql在一个事务中

        void setAutoCommit(boolean autoCommit);

      2. 提交事务

        void commit()

      3. 回滚事务

        void rollback()

  3. Statement:执行SQL的对象

    静态SQL,有SQL注入的风险

    执行SQL

    1. boolean execute(String sql)

      可执行任意sql,若返回true,表示执行的结果是ResultSet对象;若返回false,说明是更新计数等操作,或者没有返回的ResultSet

    2. int executeUpdate(String sql)

      一般用来执行DML语句(insert/delete/update),也可以执行DDL(create/alter/drop)

      返回值是该sql影响的行数,如果user表中,一共有5条记录的address值为"四川",而这5条记录中的1条记录的name值为yogurt,其他4条记录的name都不为yogurt,则执行sql

      UPDATE user SET name = "yogurt" WHERE address="四川"
      

      影响的行数为4行

    3. Result executeQuery(String sql)

      执行DQL(select)语句

  4. ResultSet:结果集对象,封装了查询结果

    Statement刚执行完时,得到的ResultSet的游标指向的是第一行记录之前的位置,需要调用next()方法后,再进行数据读取,一般我们会这样来读取ResultSet中的数据(有点像Iterator迭代器的用法)

    ResultSet result = stmt.executeQuery(sql);
    while(result.next()){
          
          
        //读取数据
    }
    
    1. boolean next() 游标向下移动一行,若当前指向的行有数据,返回true,若没数据,若返回false,说明数据读取完了,游标到了最后一行之后的位置

    2. getXxx(参数) 获取数据,具体的是获取当前行的某一列

      参数可以是 int columnIndex,代表列编号,从1开始

      参数也可以是String columnLabel,代表列名

      Xxx代表类型,比如getInt(1),getString(1)

  5. PreparedStatement

    会进行预编译,然后再动态组装参数,可以防止SQL注入。

    参数使用?作为占位符

    PreparedStatement pstmt = connection.prepareStatement("SELECT * FROM product WHERE name = ?");
    pstmt.setString(1,"无尽之刃"); //注意占位符?的下标从1开始
    ResultSet result = pstmt.executeQuery();
    

猜你喜欢

转载自blog.csdn.net/vcj1009784814/article/details/106131646