• JDBC(Java Data Base Connectivity——java数据库连接)


    一、定义
    数据库驱动:数据库厂商为了方便开发人员从程序中操作数据库而提供的一套jar包,通过导入这个jar包就可以调用其中的方法操作数据库,这样的jar包就叫做数据库驱动
    JDBC:sun定义的一套标准,本质上是一大堆的操作数据库的接口,所有数据库厂商为java设计的数据库驱动都实现过这套接口,这样一来统一了不同数据库驱动的方法,开发人员只需要学习JDBC就会使用任意数据库驱动了。
     
    二、使用JDBC连接数据库
    方法一:
    package com.shelly.jdbc;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    import com.mysql.jdbc.Driver;
    
    public class Demo1 {
    
        /**
         * @param args
         * @throws SQLException 
         */
        public static void main(String[] args) throws SQLException {
            // 1.注册数据库驱动
            DriverManager.registerDriver(new Driver());
            // 2.获取数据库连接
            Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/blog", "root", "root");
            // 3.获取传输器对象
            Statement stat = conn.createStatement();
            // 4.利用传输器传输sql语句到数据库中执行,获取结果集对象
            ResultSet rs = stat.executeQuery("select * from user");
            // 5.遍历结果集获取查询结果
            while(rs.next()){
                String username = rs.getString("username");
                System.out.println(username);
            }
            // 6.关闭资源
            rs.close();
            stat.close();
            conn.close();
        }
    }
    缺点:
    ① DriverManager.registerDriver(new Driver());//缺点一:由于mysql的Driver源码本身已经注册过一次,导致了数据库驱动被注册了两次。缺点二:整个程序域mysql数据库驱动绑定增加了耦合性,程序和具体的mysql驱动绑死在一起,在切换数据库时需要改动java代码,不够灵活。
    ② 关闭资源有问题。若程序抛出异常,资源无法关闭。
    ③ Statement容易引起sql注入。
     
    方法二:
    package com.shelly.jdbc;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    
    public class Demo1 {
        /**
         * @param args
         */
        public static void main(String[] args) {
            Connection conn = null;
            PreparedStatement ps = null;
            ResultSet rs = null;
            try{
                // 1.注册数据库驱动
                Class.forName("com.mysql.jdbc.Driver");
                // 2.获取数据库连接
                conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/blog", "root", "root");
                // 3.获取传输器对象
                ps = conn.prepareStatement("select * from user where username = ?");
                ps.setString(1, "Sue");
                // 4.获取结果集对象
                rs = ps.executeQuery();
                // 5.遍历结果集获取查询结果
                while(rs.next()){
                    String username = rs.getString("username");
                    System.out.println(username);
                }
            }catch(Exception e){
                e.printStackTrace();
            }finally{
                // 6.关闭资源
                if(rs != null){//防止空指针异常
                    try {
                        rs.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    } finally{
                        rs = null;
                    }
                }
                if(ps != null){
                    try {
                        ps.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }finally{
                        ps = null;
                    }
                }
                if(conn != null){
                    try {
                        conn.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }finally{
                        conn = null;
                    }
                }
            }
        }
    }

    优点:

    ① Class.forName(“com.mysql.jdbc.Driver”);//代替DriverManager,可以查找是否已有注册数据库驱动,所以只会注册一次。关联字符串,可以将字符串放在配置文件中,在切换数据库时就不需要改动java代码了。

    ② 抛出异常问题解决见程序二。

     ③ PreparedStatement是Statement的孩子,不同的是,PreparedStatement使用预编译机制,在创建PreparedStatement对象时就需要将sql语句传入,传入的过程中参数要用?替代,这个过程回导致传入的sql被进行预编译,然后再调用PreparedStatement的setXXX将参数设置上去,由于sql语句已经经过了预编译,再传入特殊值也不会起作用了。PreparedStatement使用了预编译机制,sql语句在执行的过程中效率比Statement要高。
    Tip:
    数据库驱动写法:
    Oracle写法:oracle.jdbc.driver.OracleDriver
    SqlServer:com.microsoft.sqlserver.jdbc.SQLServerDriver
    MySql:com.mysql.jdbc.Driver
     
     
    数据库URL:URL用于标识数据库的位置,程序员通过URL地址告诉JDBC程序连接哪个数据库。
    常用数据库URL地址的写法:
    Oracle写法:jdbc:oracle:thin:@localhost:1521:sid
    SqlServer:jdbc:microsoft:sqlserver://localhost:1433; DatabaseName=sid
    MySql:jdbc:mysql://localhost:3306/sid
    Mysql的url地址的简写形式: jdbc:mysql:///sid
    常用属性:useUnicode=true&characterEncoding=UTF-8

    Sql注入:由于jdbc程序在执行的过程中sql语句在拼装时使用了由页面传入参数,如果用户恶意传入一些sql中的特殊关键字,会导致sql语句意义发生变化,这种攻击方式就叫做sql注入,参考用户注册登录案例。

     
     
  • 相关阅读:
    入门5查询生成器
    入门4关键概念
    入门3请求处理
    入门2应用结构
    入门1-基础入门
    PHP代码规范
    Bug总结
    数据结构与常用集合总结
    CSS之使用display:inline-block来布局
    nginx,lvs,haproxy+keepalived区别
  • 原文地址:https://www.cnblogs.com/shelly0307/p/10392824.html
Copyright © 2020-2023  润新知