JDBC连接数据库

JDBC Java 数据库连接(Java DataBase Connectivity)
//固定代码
      
      //    1.注册驱动.
      //    告知JVM使用的是哪一个数据库的驱动
        Class.forName("com.mysql.jdbc.Driver");//mysql  驱动类//DriverManager.registerDriver(new Driver());
        // 2.建立连接
        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/webdatabase", "root", "root");
        // 3.编写sql (在java中编写sql语句,结尾可以不加分号)
        String sql = "insert into user values(null,'lucy','666')";
        // 4.获取sql执行对象(小货车)
        Statement statement = connection.createStatement();
        // 5.发送(执行)sql并返回结果
        int i = statement.executeUpdate(sql);
        // 6.处理结果
        if (i > 0) {
            System.out.println("新增成功");
        } else {
            System.out.println("新增失败");
        }
        // 7.释放资源
        statement.close();
        connection.close();

API介绍

DriverManager:驱动管理对象【工具类】

1. 注册驱动
    a)【了解】
        static void registerDriver(Driver driver)  
        我们通过翻看mysql Driver驱动实现类的源码发现了,内部静态代码块已经实现注册驱动功能
            static {
                try {
                    DriverManager.registerDriver(new Driver());
                } catch (SQLException var1) {
                    throw new RuntimeException("Can't register driver!");
                }
            }
    b)反射【掌握】
        Class.forName("com.mysql.jdbc.Driver");
    
2. 建立连接
        static Connection getConnection(String url, String user, String password)  
    参数说明
        url:建立指定数据库连接的URL地址【固定格式】
            格式:jdbc:mysql://ip地址:端口/数据库名称?useUnicode=true&characterEncoding=UTF-8
  实例: jdbc:mysql://localhost:3306/webdatabase?useUnicode=true&characterEncoding=UTF-8
jdbc:mysql:///webdatabase   user:用户名 password:密码

Connection:数据库连接对象

1. 获取sql执行对象
        Statement createStatement()
        PreparedStatement prepareStatement(String sql)

2. 事务管理
    a)开启事务(关闭自动提交)
        void setAutoCommit(boolean autoCommit)  
            参数:
                true:自动提交sql【mysql默认值】
                false:手动提交
    b)提交事务
        void commit()  
    c)回滚事务
        void rollback() 

Statement:执行(发送)sql语句的对象

1. 执行所有类型(DDL、DML、DQL)的sql语句
        boolean execute(String sql)  
------------------------------------------

2. 用于执行DML类型的sql语句
        int executeUpdate(String sql)  
            参数:insert、delete、update的sql语句
            返回:影响行数
            
3. 用于执行DQL类型的sql语句
        ResultSet executeQuery(String sql)  
            参数:select的sql语句
            返回:结果集(集合对象)

增强类 PreparedStatement
// 1.获取连接
// 2.编写sql(通过?占位符代替实际参数拼接)
String sql = "SELECT * FROM `user` WHERE username = ? AND `password` = ?";
// 3.获取sql预编译执行对象
PreparedSatement pstmt = conn.prepareStatement(sql);
// 4.设置占位符实际参数
pstmt.setString(1,"admin' #");
pstmt.setObject(2,"");
// 5.执行sql并返回结果
ResultSet resultSet = pstmt.executeQuery();

  优点
  1. 防止sql注入,提高程序的安全性
  2. 参数与sql分离,使用 ?占位符,提高sql可读性
  3. 减少编译次数,批量操作时(插入),提高程序高性能
    1. statement对象每次执行sql语句时,都需要进行编译
    2. PreparedSatement对象,只需要预编译一次,相同的sql语句,可以执行多次

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

1. 指针下移
      boolean  next()
          返回
              true,此行有数据
              flase,表示此行没数据
          通常与while循环结合使用,遍历数据
            
2. 获取数据(key-value)
      T getXxx(int 列编号)
      T getXxx(String 列名)
        
      补充:获取所有的数据类型
          Object getObject(String 列名)
          String getString(String 列名)

事务操作

* 事务
    如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败。
    
* MySQL操作
    1.开启事务
        begin | start transaction
    2.提交事务
        commit
    3.回顾事务
        rollback
    
* java操作(使用Connection对象)
    1.关闭自动提交(开启事务)
        void setAutoCommit(false);
    2.提交事务
        void commit();
    3.回顾事务
        void rollback();

将JDBC封装成独立的方法,方便直接调用

 // 声明数据库配置变量
    private static String driver;
    private static String url;
    private static String username;
    private static String password;

    // 加载jdbc.properties配置文件,给变量赋值
    static {
        // SE阶段 new Properties.load();

        // sun公司提供,专门加载src目录下的properties类型文件,不需要手写扩展名
        ResourceBundle jdbc = ResourceBundle.getBundle("jdbc");
        driver = jdbc.getString("jdbc.driver");
        url = jdbc.getString("jdbc.url");
        username = jdbc.getString("jdbc.username");
        password = jdbc.getString("jdbc.password");
    }


    // 1.注册驱动【保证只注册一次】
    static {
        try {
            Class.forName(driver);
        } catch (ClassNotFoundException e) {
            throw new RuntimeException("注册驱动失败...");
        }
    }

    // 2.获取连接
    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(url, username, password);
    }

    // 3.释放资源
    public static void release(ResultSet resultSet, Statement statement, Connection connection) {
        // 关闭ResultSet
        if (resultSet != null) {
            try {
                resultSet.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        // 关闭Statement
        if (statement != null) {
            try {
                statement.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        // 关闭Connection
        if (connection != null) {
            try {
                statement.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

    }

    // 方法重载
    public static void release(Statement statement, Connection connection) {
        release(null, statement, connection);
    }
原文地址:https://www.cnblogs.com/xiaozhang666/p/10593459.html