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(); } }