后端开发——jdbc的学习(一)

上篇结束了Mysql数据库的基本使用,本篇开始对JDBC进行学习总结,开始先简单介绍jdbc的基本使用,以及简单的练习;后续会继续更新!以下代码可以直接复制到idea中运行,便于理解和练习。

JDBC的概念
JDBC(Java DataBase Connectivity:java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系型数据库提供统一访问,它是由一组用Java语言编写的类和接口组成的。
JDBC的作用:可以通过java代码操作数据库
JDBC的本质
JDBC实质上是java官方提供的一套规范(接口)。用于帮助开发人员快速实现不同关系型数据库的连接!

代码一:

import com.mysql.cj.jdbc.Driver;
import java.sql.*;
//TODO 简单练习感受jdbc:
public class data_test1 {
    public static void main(String[] args) throws SQLException {
        //1.注册驱动:
        DriverManager.registerDriver(new Driver());
        //2.获取连接:(桥梁)
        // java程序需要和数据库建立连接; 需要调用getConnection方法,并且需要填入连接数据库的基本信息:数据库ip地址,数据库端口号;账号;密码;连接数据库的名称;
        //该方法第一个参数:url;第二个参数:username;第三个参数:password;
        Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/atguigudb", "root", "dir99");
        //3.创建statement(创建将sql语句传入mysql的载具)
        Statement statement=connection.createStatement();
        //4.发送sql语句,并且获取返回结果:
        String sql="select *from jobs;";
        ResultSet resultSet = statement.executeQuery(sql);
        //5.将结果进行解析:
        //先看看有没有下一行数据,有就可以获取:
        while(resultSet.next()){
            String job_id = resultSet.getString("job_id");
            String job_title = resultSet.getString("job_title");
            int min_salary = resultSet.getInt("min_salary");
            int max_salary = resultSet.getInt("max_salary");
            System.out.println(job_id+"  "+job_title+"  "+min_salary+"  "+max_salary);
        }
        //6.关闭资源:
        resultSet.close();
        statement.close();
        connection.close();


    }
}

代码二:

import java.sql.*;
import java.util.Scanner;
//TODO 正式使用jdbc:
//查询对应的id号的数据,statement载具,有点缺陷:
public class data_test2 {
    public static void main(String[] args) throws Exception {
        //获取用户输入信息
        Scanner scan=new Scanner(System.in);
        System.out.println("请输入房间id号:");
        String department_id=scan.next();
        System.out.println("请输入位置id号:");
        String location_id=scan.next();
        //1.注册驱动:
        //注意像之前那个方法,有问题:其实是注册了两次驱动,1.DriverManager.registerDriver()方法本身会注册一次;
        // 2.Driver.static{DriverManager.registerDriver()},在这个静态代码块中还会执行一次,因为只要类加载静态代码块就会执行;
        //解决:只想注册一次驱动:只触发静态代码块:
        //对于触发静态代码块:类加载机制:类的加载时刻,会触发静态代码块;有三个步骤:加载(class文件->jvm虚拟机的class对象);连接(验证(检查文件类型)->准备(静态变量默认值)->解析(触发静态代码块));初始化(静态属性赋真实值)
        //触发类加载:new关键字;调用静态方法;调用静态属性;反射;子类触发父类;所以从这几种中选择一个最合适的;
        //此处可以选择反射来注册驱动;
        Class.forName("com.mysql.jdbc.Driver");//此处参数是字符串,后面可以在配置文件中写入然后解析到这里,更改比较方便灵活;
        //2.获取连接:
        //对于getConnection方法来说有三种不同的方法(重载);
        // 传入的参数为:1.数据库软件所在的主机ip地址;2.数据库所在的主机的端口号;3.连接的具体库;4.连接的账号;5.连接的密码:
        //一、对于三个参数的getConnection方法: 1.String url:数据库所在的信息:具体语法:jdbc:mysql://127.0.0.1:3306/atguigudb;
        // 2.String user数据库的账号:root;3.String password:数据库的密码:dir99;
        //二、对于两个参数的方法:1.
        Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/atguigudb","root","dir99");
        //3.创建发送sql语句的statement对象:statement可以发送sql语句到数据库,并且可以获得返回结果;
        Statement statement = connection.createStatement();
        //4.发送sql语句:(编写sql语句,发送sql语句):
        /*
        对于sql分类:DDL(容器创建,修改,删除)DML(插入、修改、删除)DQL(查询)DCL(权限控制)TPL(事务控制语言)
        有两种方法:返回值为int类型的:适合非DQL;1.情况一执行DML 返回影响的行数:例如:插入两条数据,返回值为2;删除三条数据,返回值为3;2.情况二非DML 返回值为0;
        返回值为ResultSet类型的,结果封装对象;适合DQL;也就是说查询调用Query非查询调用Update;
         */
        //下面这种sql语句拼接方式复杂,而且容易注入攻击,因此一般不用这种方法:data_test3中进行了更改,用新的方式:
        String sql="select * from departments where department_id='"+department_id+"'and location_id='"+location_id+"';";
        //int类型的方法:int i = statement.executeUpdate(sql);
        //对于查询语句,用返回值为ResultSet类型的;
        ResultSet resultSet=statement.executeQuery(sql);
        //5.查询结果集解析:
        //获取数据解析,移动游标获取数据行,然后获取对应行的列数据即可;采用next()方法移动光标,返回类型为boolean类型;
        // 初始指向第一行数据之前,然后next一下指向下一行,如果有数据返回true,没有返回false;
        //移动光标之后需要获取对应行的列数据:resultSet.get类型(String columLable|int columIndex);columLable:列名,如果有别名,可以写别名;columIndex:列的下角坐标,从左向右,从1开始,注意和数组区别;
        while(resultSet.next()){
            int depart_id=resultSet.getInt(1);
            String name=resultSet.getString("department_name");
            int manager_id=resultSet.getInt("manager_id");
            int locat_id=resultSet.getInt(4);
            System.out.println(depart_id+"--"+name+"--"+manager_id+"--"+locat_id);
        }
        resultSet.close();
        statement.close();
        connection.close();

    }
}