jdbc了解及使用

在人生的道路上,不管是潇洒走一回,或者是千山独行,皆须是自己想走的路,虽然,有的人并不是很快就能找到自己的方向和道路,不过,只要坚持到底,我相信,就一定可以找到自己的路,只要找到路,就不必怕路途遥远了。

导读:本篇文章讲解 jdbc了解及使用,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

1. jdbc阐述

  • 程序->数据库驱动->数据库交互。。数据库驱动由数据库厂商提供
  • jdbc:sun公司简化开发人员的(对数据库的统一)操作(多驱动操作不同数据库),提供一个(java操作数据库)规范
  • 规范的实现是有厂商实现的,开发人员掌握jdbc的接口操作即可
  • 架构中,没有什么是加一层解决不了的,如果解决不了那在加一层tomcat-nginx-lx
  • 演变:程序->JDBC规范->DB驱动->DB交互,DB驱动由DB厂商提供

2. jdbc程序

  • java.sql
  • javax.sql
  • 驱动包mysql-connector-java-8.0.15.jar
2.1 创建步骤
  • 创建测试数据库

  • 创建一个普通项目

  • 导入数据库驱动,并点击add as library项目库
    [外链图片转存中...(img-IZdkUqyW-1651813848222)]

  • 方式2:
    [外链图片转存中...(img-EjGB5p5Y-1651813848223)]
    在这里插入图片描述

  • 编写测试代码

  • ssl报错是因为5.7.28以后的版本才真正支持ssl,但应用服务器没有提供验证所以出错,通过提供truststore或关闭ssl解决

  • 注意时区&serverTimezone=UTC

public static void main(String[] args) throws ClassNotFoundException, SQLException {
    //链接数据库和用可视化工具一样
    //引入驱动
    //最新的使用规范变成了(com.mysql.cj.jdbc.Driver)
    Class.forName("com.mysql.cj.jdbc.Driver"); //固定,加载驱动
    //输入链接信息
    //中文编码         字符集                  安全链接
    //useUnicode=true&characterEncoding=utf8&useSSL=true
    String url = "jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=UTC";
    String user = "root";
    String password = "123456";
    //链接成功,返回sql对象 connection代表数据库
    Connection connection = DriverManager.getConnection(url, user, password);
    //执行sql对象,statement 执行sql代码,存在结果返回结果
    Statement statement = connection.createStatement();
    String sql = "SELECT * FROM `users`";
    //查询是executeQuery
    ResultSet resultSet = statement.executeQuery(sql); //返回结果集
    while (resultSet.next()){
        System.out.println("i"+resultSet.getObject("Name"));
    }
    //插入和更新,删除是executeUpdate
    //释放链接
    resultSet.close();
    statement.close();
    connection.close();

}
  • 步骤总结:
    • 加载驱动
    • 链接信息
    • 链接数据库Connection
    • 创建执行对象statement
    • 执行sql语句,返回结果ResultSet
    • 关闭资源
2.2 所用对象
  • DriverManager
//DriverManager.registerDriver(new Driver());   //之前的写法,new Driver()原方法已经注册执行,相当于执行两遍
Class.forName("com.mysql.cj.jdbc.Driver"); //固定,加载驱动

//链接成功,返回sql对象 connection代表数据库
Connection connection = DriverManager.getConnection(url, user, password);
//数据库级别可以设置自动提交、提交回滚
connection.setAutoCommit(true);
connection.commit();
connection.rollback();
  • url
String url = "jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=UTC";

//mysql
jdbc:mysql协议
jdbc:mysql://主机地址:端口号/DBNAME?参数1&参数2&参数3
//oracle 1521
jdbc:oracle:thin:@主机地址:端口号:sid
//oracle没数据库,都是表空间-数据库
  • Statement SQL执行对象:
  • 用于向数据库发送sql语句,若要完成对数据库的增删改查,只需通过这个对象向数据库发送增删改查即可
  • statement.executeUpdate方法用于向数据库发送增删改的sql语句,executeUpdate执行完后,会返回一个整数(增删改语句导致的数据表几行数据发生变化)
  • statement.executeQuery方法用于向数据库发送查询的sql语句,executeQuery方法返回代表查询结果的resultset对象
Statement statement = connection.createStatement();
statement.execute(""); //执行全部,有判断过程效率低
statement.executeQuery("");//查询返回结果集
statement.executeUpdate("");//增删该,返回受影响行数
statement.executeBatch(); //批处理
Statement statement = connection.createStatement();
 String sql = "INSERT INTO `users`() VALUES()";
int num = statement.executeUpdate(sql);
if(num>0){
    System.out.println("插入成功");
}
//删除、更新也是同样操作
  • preparedStatement SQL执行预处理对象
PreparedStatement preparedStatement = connection.prepareStatement("");
  • ResultSet
//使用方式1
resultSet.getObject("Name");//不知道数据库表中列具体类型
resultSet.getInt("");//得知数据库表中列具体类型
//遍历  resultSet--set
resultSet.beforeFirst(); //指针指向第一行
resultSet.afterLast(); //指针指向最后一行
resultSet.next();
resultSet.previous();//指针指向前一行
resultSet.absolute(1); //指针指向某一行

  • 释放资源
resultSet.close();
statement.close();
connection.close(); //耗资源
2.3 jdbc工具类
  • jdbc工具类:
  • proterties文件作用:目的类属性和功能分离,方法就是配置文件+工具类
  • proterties文件放src目录下,通过反射中类加载即可用文件明直接加载到,若放到项目下,则需要用路径
  • jdbc插入i(nsert)数据时,要显示指明插入的字段名,即使是全部插入,也要写
#db.properties每句不加;号,否则反射无法加载这个配置文件
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC
username=root
password=123456
public class JdbcUtils {
    private static String driver = null;
    private static String url = null;
    private static String username = null;
    private static String password = null;
    static {
        //db.properties配置文件放在src目录,可以直接读取到
        //若放在项目包目录下,需要加路径
        InputStream in = JdbcUtils.class.getClassLoader().getResourceAsStream("db.properties");
        Properties properties = new Properties();
        try {
            properties.load(in);
            driver = properties.getProperty("driver");
            url = properties.getProperty("url");
            username = properties.getProperty("username");
            password = properties.getProperty("password");
            try {
                //驱动只用加载一次
                Class.forName(driver);
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
    public static Connection getConnection() throws SQLException {
         return DriverManager.getConnection(url, username, password);
    }

    public static void close(Connection connection, Statement statement, ResultSet resultSet){
        //按顺序释放
        if (resultSet!=null){
            try {
                resultSet.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        if (statement!=null){
            try {
                statement.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        if (connection!=null){
            try {
                connection.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
    }
}
  • 利用jdbc工具类进行crud操作
private static void insertMethod() {
    Connection connection = null;
    Statement statement = null;
    ResultSet resultSet = null;

    try {
        connection = JdbcUtils.getConnection();
        statement = connection.createStatement();
        String sql = "INSERT INTO `users`(`name`,`PASSWORD`,`email`,`birthday`) VALUES('李四','123456','123456789@163.com',NOW())";
        int num = statement.executeUpdate(sql);
        if(num>0){
            System.out.println("插入成功");
        }
    } catch (SQLException throwables) {
        throwables.printStackTrace();
    }finally {
        JdbcUtils.close(connection,statement,resultSet);
    }
}

2.4 sql注入问题

  • sql存在漏洞:SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。
  • 本质就是破坏掉当前执行的sql语句的结构,sql会被拼接,or
public static void main(String[] args) {
    selectMethod("' or '1=1","123456");
}
private static void selectMethod(String user,String password) {
    Connection connection = null;
    Statement statement = null;
    ResultSet resultSet = null;

    try {
        connection = JdbcUtils.getConnection();
        statement = connection.createStatement();
        PreparedStatement preparedStatement = connection.prepareStatement("");
        String sql = "SELECT * FROM `users` WHERE `NAME`='"+user+"' and `PASSWORD` = '"+password+"';";
        ResultSet rs = statement.executeQuery(sql);
        while (rs.next()){
            System.out.println(rs.getString("name")+"===="+rs.getString("PASSWORD"));
        }
    } catch (SQLException throwables) {
        throwables.printStackTrace();
    }finally {
        JdbcUtils.close(connection,statement,resultSet);
    }
}

2.5 PreparedStatement对象

  • 防止sql注入,效率更高
  • PreparedStatement防止sql注入的本质将参数作为字符,用””包裹
  • 遇到转义字符如’’则会转义掉
private static void insertMethod() {
    Connection connection = null;
    PreparedStatement pstm = null;
    ResultSet resultSet = null;

    try {
        connection = JdbcUtils.getConnection();
        //区别
        //使用?作为占位符
        String sql = "INSERT INTO `users`(`name`,`PASSWORD`,`email`,`birthday`) VALUES(?,?,?,?)";
        //先写下面这个预编译的方法,上面的sql会提示
        pstm = connection.prepareStatement(sql); //预编译,先写sql然后不执行
        pstm.setString(1,"王五");
        pstm.setString(2,"123456");
        pstm.setString(3,"123456789@163.com");
        //注意:sql.date 数据库支持的 java.sql.Date
        //      util.Date java  new.Date.gettime() 获得时间戳
        pstm.setDate(4,new Date(System.currentTimeMillis()));
        boolean flag = pstm.execute();  //返回ResultSet为true,否则相反
        int num = pstm.executeUpdate();  //受影响行数
        if(num>0){
            System.out.println("插入成功");
        }
    } catch (SQLException throwables) {
        throwables.printStackTrace();
    }finally {
        JdbcUtils.close(connection,pstm,resultSet);
    }
}
private static void selectMethod2(String user,String password) {
    Connection connection = null;
    PreparedStatement pstm = null;
    ResultSet resultSet = null;

    try {
        connection = JdbcUtils.getConnection();
        //PreparedStatement防止sql注入的本质将参数作为字符,用""包裹
        //遇到转义字符如''则会转义掉
        String  sql= "SELECT * FROM `users` WHERE `NAME`= ? and `PASSWORD` = ?;";
        pstm = connection.prepareStatement(sql);
        pstm.setString(1,user);
        pstm.setString(2,password);
        ResultSet rs = pstm.executeQuery();
        while (rs.next()){
            System.out.println(rs.getString("name")+"===="+rs.getString("PASSWORD"));
        }
    } catch (SQLException throwables) {
        throwables.printStackTrace();
    }finally {
        JdbcUtils.close(connection,pstm,resultSet);
    }
}

3. IDEA链接数据库

  • 提前导入驱动包mysql-connector-java-8.0.15.jar
  • 收合IDEA侧边栏

[外链图片转存中...(img-4yrcanjC-1651813848224)]
[外链图片转存中...(img-xzH13qT7-1651813848225)]
[外链图片转存中...(img-dP7rv1bX-1651813848225)]
[外链图片转存中...(img-v4jCbpJ5-1651813848226)]

  • 链接成功后,选择数据库
    [外链图片转存中...(img-zeeBtZP9-1651813848226)]
  • 双击数据库
    [外链图片转存中...(img-6KAGujLL-1651813848226)]
  • 提交数据

[外链图片转存中...(img-6qFo2FN0-1651813848227)]

  • sql编辑器
    [外链图片转存中...(img-njM6bE5O-1651813848227)]
  • 控制台
    [外链图片转存中...(img-qQv5WLnc-1651813848227)]
  • 切换数据库

[外链图片转存中...(img-l2PzqafW-1651813848228)]

  • 存在的问题
    [外链图片转存中...(img-yw8QSynk-1651813848228)]

4.事务

  • 要么都成功,要么都失败

ACID原则

原子性:要么都成功,要么都失败

一致性:数据最终结果一致

隔离性:多进程不干扰

持久性:一旦提交,数据不变

  • 隔离性导致的问题
  • 脏读:读未提交
  • 不可重复读:读被更新
  • 幻读:读被新增删除

  • 事物实现
  • 关闭数据库自动提交,自动会开启事务connection.setAutoCommit(false); //开启事务
  • 业务完毕提交事务 connection.commit();
  • catch中用connection.rollback(); //如果失败就回滚(显示的)、不写也会回滚 (默认)
private static void insertMethod() {
    Connection connection = null;
    PreparedStatement pstm = null;
    ResultSet resultSet = null;

    try {
        connection = JdbcUtils.getConnection();
        //关闭数据库自动提交,自动会开启事务
        connection.setAutoCommit(false); //开启事务
        //区别
        //使用?作为占位符
        String sql = "INSERT INTO `users`(`name`,`PASSWORD`,`email`,`birthday`) VALUES(?,?,?,?)";
        //先写下面这个预编译的方法,上面的sql会提示
        pstm = connection.prepareStatement(sql); //预编译,先写sql然后不执行
        pstm.setString(1,"王五");
        pstm.setString(2,"123456");
        pstm.setString(3,"123456789@163.com");
        //注意:sql.date 数据库支持的 java.sql.Date
        //      util.Date java  new.Date.gettime() 获得时间戳
        pstm.setDate(4,new Date(System.currentTimeMillis()));
        boolean flag = pstm.execute();  //返回ResultSet为true,否则相反
        //业务完毕提交事务
        connection.commit();
        int num = pstm.executeUpdate();  //受影响行数
        if(num>0){
            System.out.println("插入成功");
        }
    } catch (SQLException throwables) {
        try {
            //不写也会回滚
            connection.rollback();  //如果失败就回滚
        } catch (SQLException e) {
            e.printStackTrace();
        }
        throwables.printStackTrace();
    }finally {
        JdbcUtils.close(connection,pstm,resultSet);
    }
}

5.数据库连接池#### 1. jdbc阐述

  • 程序->数据库驱动->数据库交互。。数据库驱动由数据库厂商提供
  • jdbc:sun公司简化开发人员的(对数据库的统一)操作(多驱动操作不同数据库),提供一个(java操作数据库)规范
  • 规范的实现是有厂商实现的,开发人员掌握jdbc的接口操作即可
  • 架构中,没有什么是加一层解决不了的,如果解决不了那在加一层tomcat-nginx-lx
  • 演变:程序->JDBC规范->DB驱动->DB交互,DB驱动由DB厂商提供

2. jdbc程序

  • java.sql
  • javax.sql
  • 驱动包mysql-connector-java-8.0.15.jar
2.1 创建步骤
  • 创建测试数据库
  • 创建一个普通项目
  • 导入数据库驱动,并点击add as library项目库

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IZdkUqyW-1651813848222)(E:\zkNote\typora-user-images\image-20220501000513789.png)]

  • 方式2:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EjGB5p5Y-1651813848223)(E:\zkNote\typora-user-images\image-20220501232203507.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bQwZpOeI-1651813848224)(E:\zkNote\typora-user-images\image-20220501232245541.png)]

  • 编写测试代码
  • ssl报错是因为5.7.28以后的版本才真正支持ssl,但应用服务器没有提供验证所以出错,通过提供truststore或关闭ssl解决
  • 注意时区&serverTimezone=UTC
public static void main(String[] args) throws ClassNotFoundException, SQLException {
    //链接数据库和用可视化工具一样
    //引入驱动
    //最新的使用规范变成了(com.mysql.cj.jdbc.Driver)
    Class.forName("com.mysql.cj.jdbc.Driver"); //固定,加载驱动
    //输入链接信息
    //中文编码         字符集                  安全链接
    //useUnicode=true&characterEncoding=utf8&useSSL=true
    String url = "jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=UTC";
    String user = "root";
    String password = "123456";
    //链接成功,返回sql对象 connection代表数据库
    Connection connection = DriverManager.getConnection(url, user, password);
    //执行sql对象,statement 执行sql代码,存在结果返回结果
    Statement statement = connection.createStatement();
    String sql = "SELECT * FROM `users`";
    //查询是executeQuery
    ResultSet resultSet = statement.executeQuery(sql); //返回结果集
    while (resultSet.next()){
        System.out.println("i"+resultSet.getObject("Name"));
    }
    //插入和更新,删除是executeUpdate
    //释放链接
    resultSet.close();
    statement.close();
    connection.close();

}
  • 步骤总结:
    • 加载驱动
    • 链接信息
    • 链接数据库Connection
    • 创建执行对象statement
    • 执行sql语句,返回结果ResultSet
    • 关闭资源
2.2 所用对象
  • DriverManager
//DriverManager.registerDriver(new Driver());   //之前的写法,new Driver()原方法已经注册执行,相当于执行两遍
Class.forName("com.mysql.cj.jdbc.Driver"); //固定,加载驱动

//链接成功,返回sql对象 connection代表数据库
Connection connection = DriverManager.getConnection(url, user, password);
//数据库级别可以设置自动提交、提交回滚
connection.setAutoCommit(true);
connection.commit();
connection.rollback();
  • url
String url = "jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=UTC";

//mysql
jdbc:mysql协议
jdbc:mysql://主机地址:端口号/DBNAME?参数1&参数2&参数3
//oracle 1521
jdbc:oracle:thin:@主机地址:端口号:sid
//oracle没数据库,都是表空间-数据库
  • Statement SQL执行对象:
  • 用于向数据库发送sql语句,若要完成对数据库的增删改查,只需通过这个对象向数据库发送增删改查即可
  • statement.executeUpdate方法用于向数据库发送增删改的sql语句,executeUpdate执行完后,会返回一个整数(增删改语句导致的数据表几行数据发生变化)
  • statement.executeQuery方法用于向数据库发送查询的sql语句,executeQuery方法返回代表查询结果的resultset对象
Statement statement = connection.createStatement();
statement.execute(""); //执行全部,有判断过程效率低
statement.executeQuery("");//查询返回结果集
statement.executeUpdate("");//增删该,返回受影响行数
statement.executeBatch(); //批处理
Statement statement = connection.createStatement();
 String sql = "INSERT INTO `users`() VALUES()";
int num = statement.executeUpdate(sql);
if(num>0){
    System.out.println("插入成功");
}
//删除、更新也是同样操作
  • preparedStatement SQL执行预处理对象
PreparedStatement preparedStatement = connection.prepareStatement("");
  • ResultSet
//使用方式1
resultSet.getObject("Name");//不知道数据库表中列具体类型
resultSet.getInt("");//得知数据库表中列具体类型
//遍历  resultSet--set
resultSet.beforeFirst(); //指针指向第一行
resultSet.afterLast(); //指针指向最后一行
resultSet.next();
resultSet.previous();//指针指向前一行
resultSet.absolute(1); //指针指向某一行

  • 释放资源
resultSet.close();
statement.close();
connection.close(); //耗资源
2.3 jdbc工具类
  • jdbc工具类:
  • proterties文件作用:目的类属性和功能分离,方法就是配置文件+工具类
  • proterties文件放src目录下,通过反射中类加载即可用文件明直接加载到,若放到项目下,则需要用路径
  • jdbc插入i(nsert)数据时,要显示指明插入的字段名,即使是全部插入,也要写
#db.properties每句不加;号,否则反射无法加载这个配置文件
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC
username=root
password=123456
public class JdbcUtils {
    private static String driver = null;
    private static String url = null;
    private static String username = null;
    private static String password = null;
    static {
        //db.properties配置文件放在src目录,可以直接读取到
        //若放在项目包目录下,需要加路径
        InputStream in = JdbcUtils.class.getClassLoader().getResourceAsStream("db.properties");
        Properties properties = new Properties();
        try {
            properties.load(in);
            driver = properties.getProperty("driver");
            url = properties.getProperty("url");
            username = properties.getProperty("username");
            password = properties.getProperty("password");
            try {
                //驱动只用加载一次
                Class.forName(driver);
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
    public static Connection getConnection() throws SQLException {
         return DriverManager.getConnection(url, username, password);
    }

    public static void close(Connection connection, Statement statement, ResultSet resultSet){
        //按顺序释放
        if (resultSet!=null){
            try {
                resultSet.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        if (statement!=null){
            try {
                statement.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        if (connection!=null){
            try {
                connection.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
    }
}
  • 利用jdbc工具类进行crud操作
private static void insertMethod() {
    Connection connection = null;
    Statement statement = null;
    ResultSet resultSet = null;

    try {
        connection = JdbcUtils.getConnection();
        statement = connection.createStatement();
        String sql = "INSERT INTO `users`(`name`,`PASSWORD`,`email`,`birthday`) VALUES('李四','123456','123456789@163.com',NOW())";
        int num = statement.executeUpdate(sql);
        if(num>0){
            System.out.println("插入成功");
        }
    } catch (SQLException throwables) {
        throwables.printStackTrace();
    }finally {
        JdbcUtils.close(connection,statement,resultSet);
    }
}

2.4 sql注入问题

  • sql存在漏洞:SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。
  • 本质就是破坏掉当前执行的sql语句的结构,sql会被拼接,or
public static void main(String[] args) {
    selectMethod("' or '1=1","123456");
}
private static void selectMethod(String user,String password) {
    Connection connection = null;
    Statement statement = null;
    ResultSet resultSet = null;

    try {
        connection = JdbcUtils.getConnection();
        statement = connection.createStatement();
        PreparedStatement preparedStatement = connection.prepareStatement("");
        String sql = "SELECT * FROM `users` WHERE `NAME`='"+user+"' and `PASSWORD` = '"+password+"';";
        ResultSet rs = statement.executeQuery(sql);
        while (rs.next()){
            System.out.println(rs.getString("name")+"===="+rs.getString("PASSWORD"));
        }
    } catch (SQLException throwables) {
        throwables.printStackTrace();
    }finally {
        JdbcUtils.close(connection,statement,resultSet);
    }
}

2.5 PreparedStatement对象

  • 防止sql注入,效率更高
  • PreparedStatement防止sql注入的本质将参数作为字符,用””包裹
  • 遇到转义字符如’’则会转义掉
private static void insertMethod() {
    Connection connection = null;
    PreparedStatement pstm = null;
    ResultSet resultSet = null;

    try {
        connection = JdbcUtils.getConnection();
        //区别
        //使用?作为占位符
        String sql = "INSERT INTO `users`(`name`,`PASSWORD`,`email`,`birthday`) VALUES(?,?,?,?)";
        //先写下面这个预编译的方法,上面的sql会提示
        pstm = connection.prepareStatement(sql); //预编译,先写sql然后不执行
        pstm.setString(1,"王五");
        pstm.setString(2,"123456");
        pstm.setString(3,"123456789@163.com");
        //注意:sql.date 数据库支持的 java.sql.Date
        //      util.Date java  new.Date.gettime() 获得时间戳
        pstm.setDate(4,new Date(System.currentTimeMillis()));
        boolean flag = pstm.execute();  //返回ResultSet为true,否则相反
        int num = pstm.executeUpdate();  //受影响行数
        if(num>0){
            System.out.println("插入成功");
        }
    } catch (SQLException throwables) {
        throwables.printStackTrace();
    }finally {
        JdbcUtils.close(connection,pstm,resultSet);
    }
}
private static void selectMethod2(String user,String password) {
    Connection connection = null;
    PreparedStatement pstm = null;
    ResultSet resultSet = null;

    try {
        connection = JdbcUtils.getConnection();
        //PreparedStatement防止sql注入的本质将参数作为字符,用""包裹
        //遇到转义字符如''则会转义掉
        String  sql= "SELECT * FROM `users` WHERE `NAME`= ? and `PASSWORD` = ?;";
        pstm = connection.prepareStatement(sql);
        pstm.setString(1,user);
        pstm.setString(2,password);
        ResultSet rs = pstm.executeQuery();
        while (rs.next()){
            System.out.println(rs.getString("name")+"===="+rs.getString("PASSWORD"));
        }
    } catch (SQLException throwables) {
        throwables.printStackTrace();
    }finally {
        JdbcUtils.close(connection,pstm,resultSet);
    }
}

3. IDEA链接数据库

  • 提前导入驱动包mysql-connector-java-8.0.15.jar
  • 收合IDEA侧边栏
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4yrcanjC-1651813848224)(E:\zkNote\typora-user-images\image-20220503231058606.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xzH13qT7-1651813848225)(E:\zkNote\typora-user-images\image-20220503231742453.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dP7rv1bX-1651813848225)(E:\zkNote\typora-user-images\image-20220503231831780.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v4jCbpJ5-1651813848226)(E:\zkNote\typora-user-images\image-20220503232721030.png)]

  • 链接成功后,选择数据库

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zeeBtZP9-1651813848226)(E:\zkNote\typora-user-images\image-20220503233112987.png)]

  • 双击数据库
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6KAGujLL-1651813848226)(E:\zkNote\typora-user-images\image-20220503234239597.png)]
  • 提交数据
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6qFo2FN0-1651813848227)(E:\zkNote\typora-user-images\image-20220503234314987.png)]
  • sql编辑器
    在这里插入图片描述
  • 控制台
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qQv5WLnc-1651813848227)(E:\zkNote\typora-user-images\image-20220503234831058.png)]
  • 切换数据库
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l2PzqafW-1651813848228)(E:\zkNote\typora-user-images\image-20220503234947854.png)]
  • 存在的问题
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yw8QSynk-1651813848228)(E:\zkNote\typora-user-images\image-20220503235441127.png)]

4.事务

  • 要么都成功,要么都失败

ACID原则

原子性:要么都成功,要么都失败

一致性:数据最终结果一致

隔离性:多进程不干扰

持久性:一旦提交,数据不变

  • 隔离性导致的问题
  • 脏读:读未提交
  • 不可重复读:读被更新
  • 幻读:读被新增删除

  • 事物实现
  • 关闭数据库自动提交,自动会开启事务connection.setAutoCommit(false); //开启事务
  • 业务完毕提交事务 connection.commit();
  • catch中用connection.rollback(); //如果失败就回滚(显示的)、不写也会回滚 (默认)
private static void insertMethod() {
    Connection connection = null;
    PreparedStatement pstm = null;
    ResultSet resultSet = null;

    try {
        connection = JdbcUtils.getConnection();
        //关闭数据库自动提交,自动会开启事务
        connection.setAutoCommit(false); //开启事务
        //区别
        //使用?作为占位符
        String sql = "INSERT INTO `users`(`name`,`PASSWORD`,`email`,`birthday`) VALUES(?,?,?,?)";
        //先写下面这个预编译的方法,上面的sql会提示
        pstm = connection.prepareStatement(sql); //预编译,先写sql然后不执行
        pstm.setString(1,"王五");
        pstm.setString(2,"123456");
        pstm.setString(3,"123456789@163.com");
        //注意:sql.date 数据库支持的 java.sql.Date
        //      util.Date java  new.Date.gettime() 获得时间戳
        pstm.setDate(4,new Date(System.currentTimeMillis()));
        boolean flag = pstm.execute();  //返回ResultSet为true,否则相反
        //业务完毕提交事务
        connection.commit();
        int num = pstm.executeUpdate();  //受影响行数
        if(num>0){
            System.out.println("插入成功");
        }
    } catch (SQLException throwables) {
        try {
            //不写也会回滚
            connection.rollback();  //如果失败就回滚
        } catch (SQLException e) {
            e.printStackTrace();
        }
        throwables.printStackTrace();
    }finally {
        JdbcUtils.close(connection,pstm,resultSet);
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由半码博客整理,本文链接:https://www.bmabk.com/index.php/post/123956.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
半码博客——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!