JDBC(updating)

  • 概述
    • Java提供统一操作数据库的接口和驱动管理器,数据库厂商编写驱动程序来实现接口
    • 程序员面向接口编程,不会显式使用第三方代码
  • 图示
    JDBC图示

  • 基本操作
    • 获取数据库连接
    • PreparedStatement处理SQL语句
    • 处理结果
    • 关闭资源
  • 获取数据库连接
    • 注册驱动
      • 概念:简单理解为将Java API的DriverManager类显式绑定一个Driver接口的实现类对象;后续使用DriverManager类来隐式调用第三方代码
      • 代码
        //方式一
        DriverManager.registerDriver(new com.mysql.jdbc.Driver());
        
        //方式二 优选方案 (后续会使用配置文件)
        Class.forName("com.mysql.jdbc.Driver");
        
        //方式二可行是因为在MySQL驱动的Driver实现类中有如下静态代码块
        static {
            try {
                java.sql.DriverManager.registerDriver(new Driver());
            } catch (SQLException E) {
                throw new RuntimeException("Can't register driver!");
            }
        }

         

    • 准备连接所需信息
      • 数据库URL
        • 格式   jdbc:子协议:子名称(子名称依据子协议的不同而不同)
        • jdbc:mysql://localhost:3306/数据库名
        • jdbc:sqlserver://localhost:1433:DatabaseName=数据库名
      • 用户名
      • 密码
    • 通过DriverManager获取连接
      Connection conn = DriverManager.getConnection(url, username, password);

       

    • 最终版–使用Properties配置文件
      public Connection getConnection() throws Exception {
              InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc.properties");
              Properties prop = new Properties();
              prop.load(is);
              
              //加载驱动
              Class.forName(prop.getProperty("driverclass"));
              
              //获取连接所需信息
              String username = prop.getProperty("username");
              String password = prop.getProperty("password");
              String url = prop.getProperty("url");
              
              //获取连接
              return DriverManager.getConnection(url,username,password);
          }

       

    • 问题
      • 为什么使用反射来加载类而不是new
        依赖性更弱,更改数据库类型时只需要修改配置文件即可,也就无需重新编译
  • 处理SQL语句
    • java.sql包中有三个接口分别定义了对数据库调用的不同方式
      Statement: 执行静态SQL语句(一般不使用,有SQL注入问题)
      PreparedStatement: SQL语句被预编译存储在此对象中,更加安全高效执行
      CallableStatement: 执行SQL存储
    • Statement的问题
      • SQL语句需要拼串导致可读性差
      • SQL注入——恶意输入导致SQL语句原有逻辑改变
        Scanner scan = new Scanner(System.in);
        
                System.out.print("用户名:");
                String userName = scan.nextLine();
                System.out.print("密   码:");
                String password = scan.nextLine();
        
        
                String sql = "SELECT user,password FROM user_table WHERE USER = '"
                        + userName +
                        "' AND PASSWORD = '"
                        + password +
                        "'";
        
                /*
                    输入
                    1' or
                    ='1' or '1' = '1
                    这时原语句的与逻辑被篡改为或逻辑
        
                 */

         

    • PreparedStatement
      • Statement的子接口
      • 表示一条预编译的SQL语句
        //获取连接
        Connection conn = getConnection();
        
        String sql = "insert into customers values(?,?)";
        
        //预编译SQL语句
        PreparedStatement ps = conn.prepareStatement(sql);
        
        //填充占位符,注意占位符索引从1开始
        ps.setObject(1, "奥特曼");
        ps.setObject(2,18);
        
        //执行SQL语句
        ps.executeUpdate();
        
        //关闭资源
        ps.close();
        conn.close();

         

  • 处理结果(查询操作)

西瓜要挖着吃

一个通往大佬之路的男人

You may also like...

发表评论

电子邮件地址不会被公开。 必填项已用*标注