概述
- 概念:Java数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。
- JDBC本质:官方(sum公司)定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)来编程,真正执行的代码是jar包中的实现类
简单入门
- 步骤:
- 导入驱动
jar
包 - 注册驱动
- 获取数据库的连接对象 Connection
- 定义sql
- 获取执行sql语句的对象Statement
- 执行sql,接收返回的结果
- 处理结果
- 释放资源
// 1.导入驱动jar包 // 1.1 复制驱动jar包到项目模块的libs目录下 // 1.2 右键 --> Add As Library // 2.注册驱动,MySQL5之后的驱动jar包可以省略该步骤 Class.forName("com.mysql.jdbc.Driver"); // 3.获取数据库的连接对象 Connection conn= DriverManager.getConnection("jdbc:mysql://localhost:3306/db2", "root", "root"); // 4.定义sql语句 String sql="update account set money = 500 where id=2"; // 5.获取执行sql的对象Statement Statement stmt = conn.createStatement(); // 6.执行sql int count = stmt.executeUpdate(sql); // 7.处理结果 System.out.println(count); // 返回1 // 8.释放资源 stmt.close(); conn.close();
- 导入驱动
对象
-
DriverManager:驱动管理对象
- 概述:用于管理一组JDBC驱动程序的基本服务。
- 功能:
- 注册驱动:告诉程序改使用哪一个数据库驱动jar
static void registerDriver(Driver driver) 使用 DriverManager注册给定的驱动程序。
- 获取数据库连接
static Connection getConnection(String url, String user, String password) 尝试建立与给定数据库URL的连接。 // url 指定连接的路径 语法:jdbc:mysql://ip地址(域名):端口号/数据库名称 // 如果连接的本机的mysql服务器,并且mysql服务器的端口号是3306,url可以简写为 // jdbc:mysql:///数据库名称 // user 用户名 // password 密码
-
Connection:数据库连接对象
- 概述:与特定数据库的连接(会话)。 执行SQL语句并在连接的上下文中返回结果。
- 功能:
- 获取执行sql语句的对象
Statement createStatement() 创建一个 Statement对象,用于将SQL语句发送到数据库。 PreparedStatement prepareStatement(String sql) 创建一个 PreparedStatement对象,用于将参数化的SQL语句发送到数据库。
- 管理事务:
// 调用改方法,设置参数值为false,则开启事务 void setAutoCommit(boolean autoCommit) 将此连接的自动提交模式设置为给定状态。 // 提交事务 void commit() 使上次提交/回滚之后所做的所有更改都将永久性,并释放此 Connection对象当前持有的任何数据库锁。 // 回滚事务 void rollback() 撤消在当前事务中所做的所有更改,并释放此 Connection对象当前持有的任何数据库锁。
-
Statement:执行sql的对象
- 概述:用于执行静态SQL语句并返回其生成的结果的对象。
// 可以执行任意的sql boolean execute(String sql) 执行给定的SQL语句,这可能会返回多个结果。 // 返回值是影响的行数 int executeUpdate(String sql) 执行给定的SQL语句,这可能是 INSERT , UPDATE ,或 DELETE声明,或者不返回任何内容,如SQL DDL语句的SQL语句。 ResultSet executeQuery(String sql) 执行给定的SQL语句,返回一个 ResultSet对象。
-
ResultSet:结果集对象,封装查询结果
next():游标向下移动一行 getXX(参数):获取数据,XX代表数据类型 如:getInt()、getString() 参数:int --> 代表列的编号,从1开始 String --> 代表列的名称
Connection connection=null; Statement statement=null; ResultSet resultSet=null; try { // 2.注册驱动 Class.forName("com.mysql.jdbc.Driver"); // 3.获取连接对象 connection = DriverManager.getConnection("jdbc:mysql:///db2", "root", "root"); // 4.创建sql语句 String sql="select * from account"; // 5.获取执行sql语句的对象 statement = connection.createStatement(); // 6.执行sql语句 resultSet = statement.executeQuery(sql); // 7.处理结果 // 7.1让游标向下移动异常 // 获取到的是account表中的第一行的数据 resultSet.next(); int anInt = resultSet.getInt(1); String name = resultSet.getString("name"); double aDouble = resultSet.getDouble(3); System.out.println(anInt+"---"+name+"---"+aDouble); } catch (Exception e) { e.printStackTrace(); }finally { if(resultSet!=null){ try { resultSet.close(); } catch (SQLException e) { e.printStackTrace(); } } if(statement !=null){ try { statement.close(); } catch (SQLException e) { e.printStackTrace(); } }if(connection !=null){ try { connection.close(); } catch (SQLException e) { e.printStackTrace(); } } }
Connection connection=null; Statement statement=null; ResultSet resultSet=null; try { // 2.注册驱动 Class.forName("com.mysql.jdbc.Driver"); // 3.获取连接对象 connection = DriverManager.getConnection("jdbc:mysql:///db2", "root", "root"); // 4.创建sql语句 String sql="select * from account"; // 5.获取执行sql语句的对象 statement = connection.createStatement(); // 6.执行sql语句 resultSet = statement.executeQuery(sql); // 7.处理结果 while (resultSet.next()){ int anInt = resultSet.getInt(1); String name = resultSet.getString("name"); double aDouble = resultSet.getDouble(3); System.out.println(anInt+"---"+name+"---"+aDouble); } } catch (Exception e) { e.printStackTrace(); }finally { if(resultSet!=null){ try { resultSet.close(); } catch (SQLException e) { e.printStackTrace(); } } if(statement !=null){ try { statement.close(); } catch (SQLException e) { e.printStackTrace(); } }if(connection !=null){ try { connection.close(); } catch (SQLException e) { e.printStackTrace(); } } }
-
PreparedStatement:执行sql对象
- SQL注入问题:在拼接sql时,由一些sql的特殊关键字参与字符串的拼接会造成一些安全性的问题
- 解决SQL注入问题,用PreparedStatement对象
- 预编译的SQL:参数使用?作为占位符
- 步骤:
- 导入驱动
jar
包 - 注册驱动
- 获取数据库的连接对象 Connection
- 定义sql
4.1 注意:sql的参数作为占位符,select * from users where username=? and password= ?
- 获取执行sql语句的对象PreparedStatement,
Connection.preparedStatement(String sql)
- 给
?
赋值:setXX(参数1,参数2)
,参数1:? 的位置编号 从1开始,参数2:? 的值,XX:数据类型 - 执行sql,接收返回的结果
- 处理结果
- 释放资源
- 例:JDBC抽取工具类 ——>练习——>1
- 注意:后期都会使用PreparedStatement对象完成增删改查的所有操作
- 可以防止SQL的注入
- 效率更高
JDBC控制事务
- 事务:一个包含多个步骤的业务操作,如果这个业务被事务管理,则这个步骤要么同时成功,要么同时失败
- 操作:
- 开启事务
- 在sql执行前开启事务
- 提交事务
- 当所有sql执行完,提交事务
- 回滚事务
- 在catch中回滚事务
- 使用Connect对象来管理事务
// 调用改方法,设置参数值为false,则开启事务 void setAutoCommit(boolean autoCommit) 将此连接的自动提交模式设置为给定状态。 // 提交事务 void commit() 使上次提交/回滚之后所做的所有更改都将永久性,并释放此 Connection对象当前持有的任何数据库锁。 // 回滚事务 void rollback() 撤消在当前事务中所做的所有更改,并释放此 Connection对象当前持有的任何数据库锁。
- 例:JDBC抽取工具类 ——>练习——>2
练习
-
表添加一条记录
// account 表添加一条记录 Statement statement=null; Connection con=null; try { // 2.注册驱动 Class.forName("com.mysql.jdbc.Driver"); // 3.定义sql String sql="insert into account(name,money) values('wangwu',3700)"; // 4.获取Connection对象 con = DriverManager.getConnection("jdbc:mysql://localhost:3306/db2","root","root"); // 5.获取执行sql的Statement对象 statement = con.createStatement(); // 6.执行sql int count = statement.executeUpdate(sql); System.out.println(count); } catch (Exception e) { e.printStackTrace(); }finally { if(statement!=null){ try { statement.close(); } catch (SQLException e) { e.printStackTrace(); } } if (con!=null){ try { con.close(); } catch (SQLException e) { e.printStackTrace(); } } }
-
表修改一条记录
// account表修改数据 Connection connection=null; Statement statement=null; try { // 2.注册驱动 Class.forName("com.mysql.jdbc.Driver"); // 3.获取连接对象 connection = DriverManager.getConnection("jdbc:mysql:///db2", "root", "root"); // 4.创建sql语句 String sql="update account set money=2000 where id=3"; // 5.获取执行sql语句的对象 statement = connection.createStatement(); // 6.执行sql语句 int count = statement.executeUpdate(sql); System.out.println(count); } catch (Exception e) { e.printStackTrace(); }finally { if(statement !=null){ try { statement.close(); } catch (SQLException e) { e.printStackTrace(); } }if(connection !=null){ try { connection.close(); } catch (SQLException e) { e.printStackTrace(); } } }
-
表修改一条记录
// account表删除一条记录 Connection connection=null; Statement statement=null; try { // 2.注册驱动 Class.forName("com.mysql.jdbc.Driver"); // 3.获取连接对象 connection = DriverManager.getConnection("jdbc:mysql:///db2", "root", "root"); // 4.创建sql语句 String sql="delete from account where id=3"; // 5.获取执行sql语句的对象 statement = connection.createStatement(); // 6.执行sql语句 int count = statement.executeUpdate(sql); System.out.println(count); } catch (Exception e) { e.printStackTrace(); }finally { if(statement !=null){ try { statement.close(); } catch (SQLException e) { e.printStackTrace(); } }if(connection !=null){ try { connection.close(); } catch (SQLException e) { e.printStackTrace(); } } }
-
创建一张表
// 创建一张表,stu Connection connection=null; Statement statement=null; try { // 2.注册驱动 Class.forName("com.mysql.jdbc.Driver"); // 3.获取连接对象 connection = DriverManager.getConnection("jdbc:mysql:///db2", "root", "root"); // 4.创建sql语句 String sql="create table stu(id int,name varchar(20))"; // 5.获取执行sql语句的对象 statement = connection.createStatement(); // 6.执行sql语句 int count = statement.executeUpdate(sql); System.out.println(count); // 0 } catch (Exception e) { e.printStackTrace(); }finally { if(statement !=null){ try { statement.close(); } catch (SQLException e) { e.printStackTrace(); } } if(connection !=null){ try { connection.close(); } catch (SQLException e) { e.printStackTrace(); } } }
-
定义一个方法,查询表的数据并将其封装为对象,然后装载集合,返回
//对应封装account表数据的java类 public class Account { private int id; private String name; private double money; public Account(int id, String name, double money) { this.id = id; this.name = name; this.money = money; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public double getMoney() { return money; } public void setMoney(double money) { this.money = money; } @Override public String toString() { return "Account{" + "id=" + id + ", name='" + name + '\'' + ", money=" + money + '}'; } }
public static void main(String[] args) { List<Account> all = findAll(); System.out.println(all); } public static List<Account> findAll(){ /* 查询所有Account对象*/ Connection connection=null; Statement statement =null; ArrayList<Account> accounts = new ArrayList<>(); ResultSet resultSet=null; try { // 1.注册驱动 Class.forName("com.mysql.jdbc.Driver"); // 2.获取连接 connection = DriverManager.getConnection("jdbc:mysql:///db2", "root", "root"); // 3.定义sql语句 String sql="select * from account"; // 4.获取执行sql的对象 statement = connection.createStatement(); // 5.执行sql语句 resultSet = statement.executeQuery(sql); // 6.遍历结果集,封装对象,装载 while (resultSet.next()){ int id=resultSet.getInt(1); String name=resultSet.getString(2); double money=resultSet.getDouble(3); accounts.add(new Account(id,name,money)); } } catch (Exception e) { e.printStackTrace(); }finally { if(resultSet!=null){ try { resultSet.close(); } catch (SQLException e) { e.printStackTrace(); } } if(statement!=null){ try { statement.close(); } catch (SQLException e) { e.printStackTrace(); } } if(connection!=null){ try { connection.close(); } catch (SQLException e) { e.printStackTrace(); } } } return accounts; }