Java

##JDBC

一、概念:

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

  2、JDBC本质:其实是官方定义的一套操作所有关系型数据库的规则(即接口),各个数据库厂家去实现这个接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。

  3、快速入门(步骤):

    • 导入驱动jar包;
    • 注册驱动;
    • 获取数据库连接对象 Connection;
    • 定义SQL;
    • 获取执行SQL语句的对象 Statement;
    • 执行SQL,接收返回结果;
    • 处理结果;
    • 释放资源(与IO一样 close)。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class JDBC {
    public void testJDBC(){
        Connection connection = null;
        Statement stmt = null;
        try {
            //1.注册驱动  mysql5 之后可以不写
            Class.forName("com.mysql.cj.jdbc.Driver");
            //2.获取Connection对象
            String url ="jdbc:mysql:///test?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8";
            String user = "root";
            String password="123456";
            connection = DriverManager.getConnection(url,user,password);
            //3.定义sql
            String sql = "update stu set math = 99 where id = 2";
            //4.获取执行sql对象
            stmt = connection.createStatement();
            //5.执行sql
            int count = stmt.executeUpdate(sql);
            //6.处理结果,
            System.out.println(count);
            if(count>0){
                System.out.println("修改成功");
            }else {
                System.out.println("修改失败");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            //7.释放
                try {
                    if(stmt!=null) {
                        stmt.close();
                    }
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            try {
                if(connection!=null) {
                    connection.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
            }
    }
}

二、各个对象详解:

  1、DriverManager:驱动管理对象

    功能:

    ①注册驱动:告诉程序该使用那一个数据库驱动jar

      • static void registerDriver(Driver driver)
      • Class.forName("com.mysql.jdbc.Driver")

       注意:mysql5之后的驱动jar包可以省略注册驱动的步骤

    ②获取数据库连接:

      • 方法:static Connection getConnection(String url,String user,String password)
      • 参数:
        • url:指定连接的路径
          • 语法:jdbc:mysql://ip地址(域名):端口号/数据库名称
          • 举例:jdbc:mysql://localhostL3306/test
          • 如果连接的是本机mysql服务器,并且mysql服务默认的端口是3306,则url可以简写为:jdbc:mysql:///数据库名称
        • user:用户名
        • password:密码

 

  2、Connection 数据库连接对象

    功能:

      ①获取执行sql的对象:

      • Statement createStatement()
      • PreparedStatement prepareStatement(String sql)
    • ②管理事务:
      • 开启事务:void setAutoCommit(boolean autoCommit),调用该方法设置参数为false,即开启事务。
      • 提交事务:void commit()
      • 回滚事务:void rollback()

  3、Statement执行SQL的对象

    执行sql

     ①boolean execute(String sql):可以执行任意的sql,了解一下即可。

     ②int executeUpdate(String sql):执行DML(insert、update、delete)语句、DDL(create、alter、drop)语句,返回值是影响的行数。

        ③ResultSet executeQuery(String sql):执行DQL(select)语句,常用。

  

  4、ResultSet 结果集对象,封装查询结果

     ①next():游标向下移动一行

     ②getXXX(参数):获取数据

      • XXX代表数据类型, 如int getInt()、String getString()
      • 参数:
        • int:代表列的编号(从1开始,与索引不同)。如String getString(1)
        • String:代表列的名称。如double getDouble(“balance”)
import java.sql.*;

public class TestResultSet {
    public void testJDBC(){
        Connection connection = null;
        Statement stmt = null;
        ResultSet resultSet = null;
        try {
            //1.注册驱动  mysql5 之后可以不写
            Class.forName("com.mysql.cj.jdbc.Driver");
            //2.获取Connection对象
            String url ="jdbc:mysql:///test?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8";
            String user = "root";
            String password="123456";
            connection = DriverManager.getConnection(url,user,password);
            //3.定义sql
            String sql = "select *from stu";
            //4.获取执行sql对象
            stmt = connection.createStatement();
            //5.执行sql
            resultSet = stmt.executeQuery(sql);
            //6.处理结果,
            resultSet.next();
                int id = resultSet.getInt(1);
                String username = resultSet.getString("username");
                int math = resultSet.getInt("math");
                int english = resultSet.getInt("english");
                int chinese = resultSet.getInt("chinese");
                System.out.println(id+"--"+username+"--"+math+"--"+english+"--"+chinese);
            
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            //7.释放
            try {
                if(resultSet!=null) {
                    resultSet.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
            try {
                if(stmt!=null) {
                    stmt.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
            try {
                if(connection!=null) {
                    connection.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}
import java.sql.*;

public class TestResultSet {
    public void testJDBC(){
        Connection connection = null;
        Statement stmt = null;
        ResultSet resultSet = null;
        try {
            //1.注册驱动  mysql5 之后可以不写
            Class.forName("com.mysql.cj.jdbc.Driver");
            //2.获取Connection对象
            String url ="jdbc:mysql:///test?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8";
            String user = "root";
            String password="123456";
            connection = DriverManager.getConnection(url,user,password);
            //3.定义sql
            String sql = "select *from stu";
            //4.获取执行sql对象
            stmt = connection.createStatement();
            //5.执行sql
            resultSet = stmt.executeQuery(sql);
            //6.处理结果
            while (resultSet.next()){//先移动 在判断
                int id = resultSet.getInt(1);
                String username = resultSet.getString("username");
                int math = resultSet.getInt("math");
                int english = resultSet.getInt("english");
                int chinese = resultSet.getInt("chinese");
                System.out.println(id+"--"+username+"--"+math+"--"+english+"--"+chinese);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            //7.释放
            try {
                if(resultSet!=null) {
                    resultSet.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
            try {
                if(stmt!=null) {
                    stmt.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
            try {
                if(connection!=null) {
                    connection.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

   5、PreparedStatement:执行sql的对象

    ①SQL注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接。

      sql:select  * from  user  where  username  =  'asdasd'  and  password  =  'a'  or  'a'  =  'a' 

    ②解决sql注入问题:使用PreparedStatement对象来解决

    ③预编译的SQL:参数使用?作为占位符

    ④步骤:

      1、导入驱动jar包

      2、注册驱动

      3、获取数据库连接对象 Connection

      4、定义sql          

         *注意:sql的参数使用?最为占位符,如:select  * from  user  where  username  = ?  and  password  = ? ;

      5、获取执行sql语句的对象PreparedStatement    Connection.prepareStatement(sql)

      6、给  ?赋值

         *方法:setXxx(参数1,参数2)

            参数1:?的位置编号,从1开始

            参数2:?的值

      7、执行sql,接受返回结果,不需要传递sql语句

      8、处理结果

      9、释放资源

     ⑤以后经常会使用PreparedStatement来完成增删改查的所有操作

      可以防止sql注入

      效率更高

package jdbc_day01;

import java.sql.*;

public class TestPreparedStatement {
    public boolean testJDBC(String name,String userpassword){
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        try {
            //1.注册驱动  mysql5 之后可以不写
            Class.forName("com.mysql.cj.jdbc.Driver");
            //2.获取Connection对象
            String url ="jdbc:mysql:///test?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8";
            String user = "root";
            String password="123456";
            connection = DriverManager.getConnection(url,user,password);
            //3.定义sql
            String sql = "select *from bank where name = ? and password = ?";
            //4.获取执行sql对象
            preparedStatement = connection.prepareStatement(sql);
            preparedStatement.setString(1,name);
            preparedStatement.setString(2,userpassword);
            //5.执行sql
            resultSet = preparedStatement.executeQuery();
            //6.处理结果
            return resultSet.next();
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            //7.释放
            try {
                if(resultSet!=null) {
                    resultSet.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
            try {
                if(preparedStatement!=null) {
                    preparedStatement.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
            try {
                if(connection!=null) {
                    connection.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return false;
    }
}

package jdbc_day01;

public class Main {
    public static void main(String[] args) {
        System.out.println(new TestPreparedStatement().testJDBC("zhangsan","123"));
    }
}
原文地址:https://www.cnblogs.com/yyanghang/p/11525493.html