目录
一、JDBC
1. JDBC相关类与接口
1.1 DriverManager
1.2 Connection
1.3 Statement
4.ResultSet
2. JDBC工作原理
二、连接mysql数据库
1. 导入jar包
2. 使用DriverManager加载驱动类
3. Connection接口
4. Statement接口
5. ResultSet接口
编辑
6. 关闭并释放资源
三、测试
1. 连接测试
2. 添加测试
3. 修改测试
4. 查询测试
四、不同数据库厂商实现-MySQL和Oracle
MySQL实现
Oracle实现
一、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类中存在静态代码块(通过查看源码发现)
//这是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只是接口!真正的实现是数据库厂商提供的驱动包完成的。
jdbc:mysql://localhost:3306/myhomework03?serverTimezone=GMT
4. Statement接口
Statement用于执行SQL语句
注:不同的SQL语句,要调用不同的方法来执行。
Statementstmt = conn.createstatement(); int count= stmt.executeUpdate(sql); ResultSet rs=stmt.executeQuery(sql);
Statement用于执行DML
int count = stmt.executeUpdate(sq1);
Statement用于执行DQL
ResultSet rs =stmt.executeQuery(sql);
5. ResultSet接口
Statement用于执行DQL
ResultSet rs =stmt.executeQuery(sql);
执行查询SQL语句后返回的结果集,由 ResultSet接口接收。
常用处理方式:遍历/判断是否有结果
String sql="select *from emp"; ResultSet rsstmt.executeQuery(sql);
查询结果存放在ResultSet对象的一系列行中
- ResultSet对象的最初位置在行首
- ResultSet.next()方法用来在行间移动
- ResultSet.getXXX()方法用来取得字段的内容
遍历ResultSet
while(rs.next()){ int empno = rs.getInt("empno"); String ename = rs.getstring("ename") System.out.println(empno+","+ename); }
6. 关闭并释放资源
数据库操作执行完毕以后要释放相关资源
- Connection
- Statement
- ResultSet
rs.close(); stmt.close(); Conn.close();
三、测试
1. 连接测试
public 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. 添加测试
public 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. 修改测试
public 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. 查询测试
public 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”)