目录
[1. JDBC相关类与接口](#1. JDBC相关类与接口)
[1.1 DriverManager](#1.1 DriverManager)
[1.2 Connection](#1.2 Connection)
[1.3 Statement](#1.3 Statement)
[2. JDBC工作原理](#2. JDBC工作原理)
[1. 导入jar包](#1. 导入jar包)
[2. 使用DriverManager加载驱动类](#2. 使用DriverManager加载驱动类)
[3. Connection接口](#3. Connection接口)
[4. Statement接口](#4. Statement接口)
[5. ResultSet接口](#5. ResultSet接口)
[6. 关闭并释放资源](#6. 关闭并释放资源)
[1. 连接测试](#1. 连接测试)
[2. 添加测试](#2. 添加测试)
[3. 修改测试](#3. 修改测试)
[4. 查询测试](#4. 查询测试)
一、JDBC
- Java Database Connectivity:Java访问数据库的解决方案
- JDBC定义了一套标准接口,即访问数据库的通用API, 不同的数据库厂商根据各自数据库的特点去实现这些接口。
- JDBC希望用相同的方式访问不同的数据库,让具体的数据库操作与数据库厂商实现无关,从而在不同数据库之间轻易的进行切换
1. JDBC相关类与接口
- Driver 接口:加载驱动程序。
- DriverManager 类:装人所需的 JDBC 驱动程序,编程时调用它的方法来创建连接。
- Connection 接口:编程时使用该类对象创建 Statement 对象。
- Statement 接口:编程时使用该类对象得到 ResultSet 对象。
- ResultSet 类:负责保存 Statement 执行后所产生的查询结果。
1.1 DriverManager
DriverManager:驱动管理对象
注册驱动(告诉程序该使用哪一个数据库驱动)
在com.mysql.jdbc.Driver类中存在静态代码块(通过查看源码发现)
java//这是com.mysql.jdbc.Driver的静态代码块,只要使用这个类,就会执行这段代码 //而Class.forName("com.mysql.jdbc.Driver")就正好使用到了这个类 static { try { java.sql.DriverManager.registerDriver(new Driver()); } catch (SQLException E) { throw new RuntimeException("Can't register driver!"); } }
注意:我们不需要通过DriverManager调用静态方法registerDriver(),因为只要Driver类被使用,则会执行其静态代码块完成注册驱动
所以后边我们其实可以省略注册驱动的步骤(可以注释掉上个案例的注册驱动的步骤,也可以查询到数据)
mysql5之后可以省略注册驱动的步骤。在jar包中,存在一个java.sql.Driver配置文件,文件中指定了com.mysql.jdbc.Driver
获取数据库连接(获取到数据库的连接并返回连接对象)
- static Connection getConnection(String url, String user, String password);
- 返回值:Connection数据库连接对象
- 参数
- url:指定连接的路径。语法:jdbc:mysql://ip地址(域名):端口号/数据库名称
- user:用户名
- password:密码
1.2 Connection
- Connection:数据库连接对象
- 获取执行者对象
- 获取普通执行者对象:Statement createStatement();
- 获取预编译执行者对象:PreparedStatement prepareStatement(String sql);
- 管理事务
- 开启事务:setAutoCommit(boolean autoCommit); 参数为false,则开启事务。
- 提交事务:commit();
- 回滚事务:rollback();
- 释放资源
- 立即将数据库连接对象释放:void close();
1.3 Statement
- Statement:执行sql语句的对象
- 执行DML语句:int executeUpdate(String sql);
- 返回值int:返回影响的行数。
- 参数sql:可以执行insert、update、delete语句。
- 执行DQL语句:ResultSet executeQuery(String sql);
- 返回值ResultSet:封装查询的结果。
- 参数sql:可以执行select语句。
- 释放资源
- 立即将执行者对象释放:void close();
4.ResultSet
- ResultSet:结果集对象
- 判断结果集中是否还有数据:boolean next();
- 有数据返回true,并将索引向下移动一行
- 没有数据返回false
- 获取结果集中的数据:XXX getXxx("列名");
- XXX代表数据类型(要获取某列数据,这一列的数据类型)
- 例如:String getString("name"); int getInt("age");
- 释放资源
- 立即将结果集对象释放:void close();
2. JDBC工作原理
二、连接mysql数据库
1. 导入jar包
- 创建一个 lib 目录
- 将 mysql-connector-java-8.0.15驱动复制进去
- 右键添加路径Eclipse: Build Path
2. 使用DriverManager加载驱动类
- 加载驱动类
- 通过Class.forName( )方法(反射) 完成驱动类的注册
找到驱动类 右键复制全路径
3. Connection接口
根据URL连接参数找到与之匹配的Driver对象, 调用其方法获取连接
注:Connection只是接口!真正的实现是数据库厂商提供的驱动包完成的。
javajdbc:mysql://localhost:3306/myhomework03?serverTimezone=GMT
4. Statement接口
Statement用于执行SQL语句
注:不同的SQL语句,要调用不同的方法来执行。
javaStatementstmt = conn.createstatement(); int count= stmt.executeUpdate(sql); ResultSet rs=stmt.executeQuery(sql);
Statement用于执行DML
javaint count = stmt.executeUpdate(sq1);
Statement用于执行DQL
javaResultSet rs =stmt.executeQuery(sql);
5. ResultSet接口
Statement用于执行DQL
javaResultSet rs =stmt.executeQuery(sql);
执行查询SQL语句后返回的结果集,由 ResultSet接口接收。
常用处理方式:遍历/判断是否有结果
javaString sql="select *from emp"; ResultSet rsstmt.executeQuery(sql);
查询结果存放在ResultSet对象的一系列行中
- ResultSet对象的最初位置在行首
- ResultSet.next()方法用来在行间移动
- ResultSet.getXXX()方法用来取得字段的内容
遍历ResultSet
javawhile(rs.next()){ int empno = rs.getInt("empno"); String ename = rs.getstring("ename") System.out.println(empno+","+ename); }
6. 关闭并释放资源
数据库操作执行完毕以后要释放相关资源
- Connection
- Statement
- ResultSet
javars.close(); stmt.close(); Conn.close();
三、测试
1. 连接测试
javapublic class TestConn { public static void main(String[] args) throws ClassNotFoundException, SQLException { // 1. 加载驱动 com.mysql.cj.jdbc.Driver.class Class.forName("com.mysql.cj.jdbc.Driver"); // 2. 获取连接对象 url String url = "jdbc:mysql://localhost:3306/myhomework03?serverTimezone=GMT"; String user = "root"; String pwd = "123456"; Connection conn = DriverManager.getConnection(url, user, pwd); // 测试 System.out.println(conn); // 3. 释放资源 conn.close(); }
测试成功
2. 添加测试
javapublic class TestAdd { public static void main(String[] args) throws SQLException, ClassNotFoundException { // 1. 加载驱动 Class.forName("com.mysql.cj.jdbc.Driver"); // 2. 获取连接 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/myhomework03?serverTimezone=GMT", "root", "123456"); // 3. 创建一条sql语句 String sql = "insert into student(sname,birthday,ssex,classid) values('凹凸曼','1999-4-4','男',1)"; // 3.1 创建执行sql语句的对象 Statement statement = conn.createStatement(); // 3.2 执行sql语句 int ret = statement.executeUpdate(sql); // 逻辑 if (ret > 0) { System.out.println("添加成功"); } else { System.out.println("添加失败"); } // 4. 释放资源 JDBC资源都是先获取的后释放 statement.close(); conn.close(); }
测试成功
3. 修改测试
javapublic class TestUpdate { public static void main(String[] args) throws ClassNotFoundException, SQLException { Scanner input = new Scanner(System.in); // 1. 加载驱动 Class.forName("com.mysql.cj.jdbc.Driver"); // 2. 获取连接 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/myhomework03?serverTimezone=GMT", "root", "123456"); // 3. sql语句 System.out.println("要修改哪个学生,请写出编号:"); int sid = input.nextInt(); System.out.println("修改学生姓名:"); String sname = input.next(); System.out.println("修改学生生日(yyyy-MM-dd):"); String bir = input.next(); System.out.println("修改学生性别:"); String sex = input.next(); System.out.println("修改学生班级编号:"); int classid = input.nextInt(); String sql = "update student set sname='" + sname + "',birthday='" + bir + "'," + "ssex='" + sex + "',classid=" + classid + " where sid =" + sid; Statement statement = conn.createStatement(); int ret = statement.executeUpdate(sql); if (ret > 0) { System.out.println("修改成功"); } else { System.out.println("修改失败"); } // 释放资源 statement.close(); conn.close(); }
测试成功
4. 查询测试
javapublic static void main(String[] args) throws ClassNotFoundException, SQLException { // 1. 加载驱动 Class.forName("com.mysql.cj.jdbc.Driver"); // 2. 获取连接 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/myhomework03?serverTimezone=GMT", "root", "123456"); // 3. sql String sql = "select birthday,sid,classid,sname,ssex from student"; Statement statement = conn.createStatement(); ResultSet rs = statement.executeQuery(sql); // 解析结果集 while (rs.next()) { // int sid = rs.getInt(1); // jdbc相关索引都是从1开始 // String sname = rs.getString(2); // Date bir = rs.getDate(3); // String sex = rs.getString(4); // int classid = rs.getInt(5); // 推荐 int sid = rs.getInt("sid"); Date bir = rs.getDate("birthday"); String sname = rs.getString("sname"); String sex = rs.getString("ssex"); int classid = rs.getInt("classid"); System.out.println(sid + sname + bir + sex + classid); } // 4.释放资源 rs.close(); statement.close(); conn.close(); }
四、不同数据库厂商实现-MySQL和Oracle
MySQL实现
- 下载对应的数据库驱动jar包 mysql-connector-java-5.0.4-bin.jar
- 将驱动jar包加载到项目中 Eclipse:BuildPath
- 加载驱动类 Class.forName("com.mysql.jdbc.Driver")
Oracle实现
- 下载对应的数据库驱动jar包 ojdbc6.jar/ojdbc14.jar
- 将驱动jar包加载到项目中 Eclipse:BuildPath
- 加载驱动类 Class.forName("oracle.jdbc.OracleDriver")