jdbc相关内容
1.什么是 jdbc?
jdbc 是连接和操作数据库的一种标准 API。
2.jdbc的主要作用
第一个是数据库的连接,第二个是执行 SQL 语句,第三个处理查询结果,第四个事务管理,第五个跨数据库兼容
3.jdbc开发的步骤
4.分别介绍jdbc的开发步骤
DriverManager类(驱动)
DriverManager是JDBC中管理数据库驱动的核心类,主要负责管理各种数据库驱动的实现类。 它的主要作用有两个: 第一个是加载驱动,通过registerDriver(Driver driver)方法来注册驱动,但直接传入new Driver()这种方式有缺点,一方面会让代码过度依赖具体的驱动实现类,不利于更换数据库;另一方面还会导致驱动的jar包被加载两次。
所以更好的做法Class.forName("com.mysql.jdbc.Driver")这种方式,它会加载驱动类并自动完成注册,避免了上述问题。 第二个是获取数据库连接,通过getConnection(String url, String user, String password)方法实现。
这个方法需要三个参数: 第一个是数据库URL,格式是jdbc:mysql://localhost:3306/数据库名,其中jdbc是主协议,mysql是子协议,localhost是主机名,3306是默认端口号。如果是访问本地数据库,localhost:3306可以省略,简写为jdbc:mysql:数据库名 - 第二个是数据库用户名,通常是root - 第三个是数据库密码
简单来说,DriverManager就是用来管理驱动,并通过加载驱动和获取连接这两个主要功能,让Java程序能够和数据库建立连接。
再结合后面提到的内容总结一下:DriverManager主要负责管理驱动,通过Class.forName("com.mysql.jdbc.Driver")加载驱动,通过getConnection("jdbc:mysql:///day07","root","密码")获取连接;而Connection是连接接口,Statement是能执行SQL语句的接口。
Connection 接口
代表与数据库的连接,是很珍贵的资源,用完必须释放。主要作用有:
- 获取执行 SQL 的对象:
- 通过
createStatement()
得到 Statement 对象 - 通过
prepareStatement(String sql)
得到 PreparedStatement 对象(更安全,能防 SQL 注入)
- 通过
- 管理事务:
setAutoCommit(boolean)
开启事务commit()
提交事务rollback()
回滚事务
Statement 接口
是执行 SQL 语句的对象,主要功能:
- 执行 SQL:
executeQuery(String sql)
:执行查询语句,返回结果集executeUpdate(String sql)
:执行增删改语句,返回影响行数
- 批处理操作:
addBatch(String sql)
:添加 SQL 到批处理clearBatch()
:清空批处理executeBatch()
:执行批处理
ResultSet 接口
封装了查询语句的结果,特点是:
- 用表格形式存储查询结果
- 内部有个游标,默认在第一行数据前
- 调用
next()
方法移动游标,只能向下移动 - 获取数据时,根据字段类型调用对应方法:
- 整数类型用
getInt()
,字符串用getString()
等 - 可以用字段索引(从 1 开始)或字段名获取,常用字段名方式
getObject()
可获取任意类型,需要自己强转
- 整数类型用
资源释放
所有连接相关的对象必须释放,标准做法是:
在 finally 代码块中释放,确保一定会执行,例如:
java
if(conn != null){try {conn.close();} catch (SQLException e) {e.printStackTrace();}conn = null;
}
5.具体程序
向上提取的思想
package cn.qcby.demo1;import com.mysql.jdbc.Driver;import java.sql.*;/*** JDBC的入门程序* 需求:把数据库中所有的数据全部查询出来,显示到控制台*/
public class JdbcTest1 {public static void main(String[] args) {// 数据库连接Connection conn = null;// 能执行SQL语句的对象Statement stmt = null;// 查询数据,把数据封装到该结果集中,表格ResultSet rs = null;try {// 加载驱动类DriverManager.registerDriver(new Driver());//Class.forName("com.mysql.jdbc.Driver");// 获取到连接 1数据库连接地址(需要编写协议) 2用户名 3密码// Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbcdemo", "root", "root");// 获取到连接,localhost:3306可以省略不写的,访问本地mysql服务器conn = DriverManager.getConnection("jdbc:mysql:///jdbcdemo", "root", "root");// 执行SQL语句// 编写SQL语句String sql = "select * from t_user";// 有能执行SQL语句的对象 Statement对象,能执行SQL语句 sql注入问题 不能stmt = conn.createStatement();//conn.prepareStatement()// 执行SQL语句,数据封装到结果集中rs = stmt.executeQuery(sql);// 遍历rs结果集while(rs.next()){// 获取到数据就OKint id = rs.getInt("id");String username = rs.getString("username");String password = rs.getString("password");String email = rs.getString("email");// 做打印System.out.println(id+"-"+username+"-"+password+"-"+email);}} catch (Exception e) {e.printStackTrace();}finally {// 总是会执行的,释放的顺序相反if(rs != null){try {rs.close();} catch (SQLException e) {e.printStackTrace();}}if(stmt != null){try {stmt.close();} catch (SQLException e) {e.printStackTrace();}}if(conn != null){try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}}}
package cn.qcby.demo1;import com.mysql.jdbc.Driver;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;/*** 演示增删改的操作*/
public class JdbcTest2 {public static void main(String[] args) {// 测试保存new JdbcTest2().testInsert();// 测试修改// new JdbcTest2().testUpdate();// 测试删除// new JdbcTest2().testDelete();}/*** 新增数据*/public void testInsert(){// 连接Connection conn = null;// 执行SQL语句Statement stmt = null;try {// 注册驱动// DriverManager.registerDriver(new Driver());// 注册驱动,切换一种写法,反射代码。加载com.mysql.jdbc.Driver类,只要该类一加载,static代码块就会执行(注册驱动)// 编写的是字符串,把com.mysql.jdbc.Driver编写到一个配置文件中去Class.forName("com.mysql.jdbc.Driver");// 获取链接conn = DriverManager.getConnection("jdbc:mysql:///jdbcdemo","root","root");// 编写SQL语句String sql = "insert into t_user values (null,'fff','111','ddd@126.com')";// 获取到stmt对象stmt = conn.createStatement();// 执行SQL语句,执行增删改的操作stmt.executeUpdate(sql);} catch (Exception e) {e.printStackTrace();}finally {// 释放资源if(stmt != null){try {stmt.close();} catch (SQLException e) {e.printStackTrace();}}if(conn != null){try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}}/*** 修改数据*/public void testUpdate(){// 连接Connection conn = null;// 执行SQL语句Statement stmt = null;try {// 注册驱动DriverManager.registerDriver(new Driver());// 获取链接conn = DriverManager.getConnection("jdbc:mysql:///jdbcdemo","root","root");// 编写SQL语句String sql = "update t_user set username = 'eee' where id = 4";// 获取到stmt对象stmt = conn.createStatement();// 执行SQL语句,执行增删改的操作stmt.executeUpdate(sql);} catch (Exception e) {e.printStackTrace();}finally {// 释放资源if(stmt != null){try {stmt.close();} catch (SQLException e) {e.printStackTrace();}}if(conn != null){try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}}/*** 删除数据*/public void testDelete(){// 连接Connection conn = null;// 执行SQL语句Statement stmt = null;try {// 注册驱动DriverManager.registerDriver(new Driver());// 获取链接conn = DriverManager.getConnection("jdbc:mysql:///jdbcdemo","root","root");// 编写SQL语句String sql = "delete from t_user where id = 4";// 获取到stmt对象stmt = conn.createStatement();// 执行SQL语句,执行增删改的操作stmt.executeUpdate(sql);} catch (Exception e) {e.printStackTrace();}finally {// 释放资源if(stmt != null){try {stmt.close();} catch (SQLException e) {e.printStackTrace();}}if(conn != null){try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}}}