跳至主要內容

JDBC 学习

PPLong大约 2 分钟

JDBC 学习


JDBC

** JAVA DATABASE CONNECTIVITY **

  • 定义了 操作所有关系型数据库的规则(接口) ---SUN公司定义
    各个数据库厂商实现接口 ,提供驱动jar包 真正执行的代码是jar包中的实现类

导入驱动jar包

--注册驱动 --

获取数据库连接对象 Connection --

定义sql --

获取执行sql语句对象statement --

执行sql 接受结果-

处理结果

        //注册驱动 ,加载进内存  (内含静态代码快 其中便是DriverManager的注册方法)!!
        Class.forName("com.mysql.cj.jdbc.Driver");
        //获取数据库连接对象
        Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/test_db?serverTimezone=UTC","root","Zyl2000215");
        /*DriverManager  驱动管理对象(注册驱动 --获取连接)
            getConnection (url,user,password)
            url :jdbc:mssql//ip :端口 /数据库名称
            细节:若是本机的mysql服务器且端口为3306 可以不写ip:端口
         */
        /*
            Connection
            1.获取执行sql对象
            createStatement
            2.管理事务:
            开启事务 setAutoCommit()
            提交事务 commit()
            回滚事务 rollback()
         */
        String sql1="update account set salary =3000";
        Statement stat=conn.createStatement();
        /*
             Statement :
             1. 执行sql
             int executeupdate(string sql): 执行 DML DDL  返回值:影响的行数
             ResultSet executeQuery 执行DQL 语句
         */
        int count =stat.executeUpdate(sql1);
        /*
            ResultSet :
            1. next():游标向下移动一行 注意,最开始的从第一行之前开始
               getXXX(数据类型)(参数):获取数据
               while(rs.next())实现循环
               1, 参数为 int :列的编号  从  -1- 开始
               2.  参数为String , 列的名称

                     */
        System.out.println(count);
        stat.close();
        conn.close();

抽取JDBC 工具类(for 简化书写)

1.注册驱动也抽取
2.抽取一个方法获取连接对象

  • ** 使用配置文件---使用静态代码块 ** 
    

3.抽取一个方法释放资源

 private static String url;
    private static String user;
    private static String password;
    private static String driver;

    /*
          静态代码块,文件加载时执行一次
     */
    static {
        try {
            Properties pro=new Properties();

            //类加载器  避免直接输入绝对路径造成路径转移时问题
            ClassLoader classLoader=JDBCUtils.class.getClassLoader();
            URL res=classLoader.getResource("jdbc.properties");
            String path=res.getPath();

            pro.load(new FileReader(path));

            url=pro.getProperty("url");
            user=pro.getProperty("user");
            password=pro.getProperty("password");
            driver=pro.getProperty("driver");

            Class.forName(driver);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

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

    public static void closeAll(Statement stmt, Connection conn, ResultSet rs){
        if(rs!=null){
            try {
                rs.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        if(stmt!=null){
            try {
                stmt.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        if(conn!=null){
            try {
                conn.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
    }

PreparedStatement :执行sql 的对象

  1. sql注入问题
    1. 目的: 用户输入的一些sql的特殊关键字参与拼接,造成安全性问题
    2. 预编译sql: 参数使用 ? 作为占位符
    3. 步骤麻烦 但安全:
      1. Connection.preparedSatement(sql)

      2. 给?赋值: setXXX(参数1,参数2)
        参数1: ?的位置编号,从1开始
        参数2: ?的值

      3. resultset 传参时,不需要再传参sql
        相当于preparedSatement代替了父类statement

** 后期都会使用到preparedStatement!!!**


JDBC 控制事务

conn.setAutoCommit.(false);
抓异常回滚时,是在异常catch中抓 conn.rollback();