目录
一.简介
1.概念
2.本质
3.优点
4.步骤
二.API详解
1.DriverManager(驱动管理类)
2.Connection
3.Statement
4.ResultSet
5.PreparedStatement
一.简介
1.概念
JDBC就是使用Java语言操作关系型数据库的一套API(Java DataBase Connectivity)Java 数据库连接
2.本质
官方定义的一套操作所有关系型数据库的规则,即接口各个数据库厂商去实现这套接口,提供数据库驱动jar包
我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类3.优点
(1)各数据库厂商使用相同的接口,Java代码不需要针对不同数据库分别开发
(2)可随时替换底层数据库,访问数据库的Java代码基本不变4.步骤
1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
2.获取连接
Connection conn = DriverManager.getConnection(url, username, password);(三个参数最好自己设置为变量, 方便修改)
3.定义SQL语句
String sql = "......";
获取执行SQL对象
Statement stmt = conn.createStatement();
5.执行SQL
stmt.executeUpdate(sql);
6.处理返回结果
7.释放资源代码示范:
import java.sql.Connection; import java.sql.DriverManager; import java.sql.Statement; public class JDBCDemo1 { public static void main(String[] args) throws Exception { //1.注册驱动 Class.forName("com.mysql.jdbc.Driver"); //2.获取连接 String url = "jdbc:mysql://127.0.0.1:3306/db2"; String username = "root"; String password = "1234"; Connection conn = DriverManager.getConnection(url,username,password); //3.定义SQL语句 String sql = "update account set money = 0 where name = '李四'"; //4.获取SQL对象 Statement sta = conn.createStatement(); //5.执行SQL long long1 = sta.executeLargeUpdate(sql); //6.打印返回结果 //long1是受影响的行数 System.out.println(long1); //7.释放资源 sta.close(); conn.close(); } }
数据库中表的原本数据
修改后的数据
二.API详解
1.DriverManager(驱动管理类)
(1)作用
注册驱动
获取数据库连接(2)获取连接
static Connection getConnection(string url,string user, string password)
(3)参数
url: 连接路径
语法: jdbc:mysql://ip地址(域名):端口号/数据库名称?参数键值对1&参数键值对2...
示例: idbc:mysgl://127.0.0.1:3306/db1
细节:
如果连接的是本机mysql服务器,并且mysql服务默认端口是3306,则ur可以简写为: jdbc:mysql:/数据库名称?参数键值对
配置 useSSL=false 参数,禁用安全连接方式,解决警告提示
user: 用户名
password: 密码简化和修改后
2.Connection
(1)作用
获取执行SQL的对象
管理事务
(2)获取执行SQL的对象
普通执行SQL对象
Statement createStatement( )
预编译SQL的执行SQL对象: 防止SQL注入
PreparedStatement prepareStatement (sql)
执行存储过程的对象
CallableStatement prepareCall (sql)(3)事务管理
MySQL 事务管理
开启事务: BEGIN;/ START TRANSACTION;
提交事务:COMMIT;
回滚事务: ROLLBACK;
MySQL默认自动提交事务
JDBC 事务管理: Connection接口中定义了3个对应的方法
开启事务: setAutoCommit(boolean autoCommit): true为自动提交事务; false为手动提交事务,即为开启事务
提交事务: commit()
回滚事务: rollback()代码示范:
import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; public class JDBCDemo2 { public static void main(String[] args) throws Exception { //1.注册驱动 //Class.forName("com.mysql.jdbc.Driver");jar5以上才可以不用写这行 //2.获取连接 String url = "jdbc:mysql:///db2?useSSL=false"; String username = "root"; String password = "1234"; Connection conn = DriverManager.getConnection(url,username,password); Statement sta = conn.createStatement(); try { conn.setAutoCommit(false);//开启事务 //3.定义SQL语句 String sql1 = "update account set money = 0 where name = '李四'"; String sql2 = "update account set money = 999 where name = '张三'"; //5.执行SQL long long1 = sta.executeLargeUpdate(sql1); long long2 = sta.executeLargeUpdate(sql2); //6.打印返回结果 //long1是受影响的行数 System.out.println(long1); System.out.println(long2); conn.commit();//提交事务 } catch (Exception e) { conn.rollback();//回滚事务 throw new RuntimeException(e); } //7.释放资源 sta.close(); conn.close(); } }
开启事务前
开启事务后:
3.Statement
作用: 执行SQL语句
int executeUpdate(sql): 执行DML、DDL语句
返回值: (1) DML语影响的行数 (2) DDL语执行后,执行成功也可能返回 0
ResultSet executeQuery(sql): 执行DQL 语句返回值:ResultSet 结果集对象
4.ResultSet
作用: 封装了DQL查询语句的结果
ResultSet stmt.executeQuery(sql): 执行DQL 语句,返回 ResultSet 对象
获取查询结果
boolean next(): (1)将光标从当前位置向前移动一行 (2)判断当前行是否为有效行返回值:
true: 有效行,当前行有数据
false: 无效行,当前行没有数据
getXxx(参数): 获取数据XXXxxx: 数据类型;如: int getlnt(参数);String getString(参数)
参数:
可以是列的编号, 从1开始; 也可以是列的名称代码示范:
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; public class Test1 { public static void main(String[] args) throws Exception { //注册驱动 Class.forName("com.mysql.jdbc.Driver"); //获取连接 String url = "jdbc:mysql:///db2?useSSL=false"; String username = "root"; String password = "1234"; Connection conn = DriverManager.getConnection(url,username,password); //定义sql String sql = "select * from account"; //获取statement对象 Statement sta = conn.createStatement(); //执行sql ResultSet result1 = sta.executeQuery(sql); while(result1.next()){ int id = result1.getInt(1); //也可以写成int id = result1.getInt("id"); String name = result1.getString(2); //String name = result1.getString("name"); double money = result1.getDouble(3); //double money = result1.getDouble("money"); System.out.println(id); System.out.println(name); System.out.println(money); System.out.println("============="); } //释放资源 conn.close(); result1.close(); sta.close(); } }
结果展示:
将查询到的数据收藏到集合中(重点)
代码示范:
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import java.util.ArrayList; public class Test1 { public static void main(String[] args) throws Exception { //注册驱动 Class.forName("com.mysql.jdbc.Driver"); //获取连接 String url = "jdbc:mysql:///db2?useSSL=false"; String username = "root"; String password = "1234"; Connection conn = DriverManager.getConnection(url,username,password); //定义sql String sql = "select * from account"; //获取statement对象 Statement sta = conn.createStatement(); //执行sql ArrayList<Account> list = new ArrayList<>();//创建一个集合来存储数据 ResultSet result1 = sta.executeQuery(sql); while(result1.next()){ Account acc = new Account();//创建一个对象 int id = result1.getInt(1); //也可以写成int id = result1.getInt("id"); String name = result1.getString(2); //String name = result1.getString("name"); double money = result1.getDouble(3); //double money = result1.getDouble("money"); acc.setId(id); acc.setName(name); acc.setMoney(money); list.add(acc);//将数据存到集合中 } System.out.println(list); //释放资源 conn.close(); result1.close(); sta.close(); } }
结果展示:
5.PreparedStatement
作用:
(1)预编译SQL,性能更高(预编译功能开启: useServerPrepStmts=true)并执行SQL语句(2)可以防止SQL注入
(3)获取 PreparedStatement 对象
SQL语句中的参数值,使用? 占位符替代String sql = "select * from user where username = ? and password = ?";
通过Connection对象获取,并传入对应的sql语句PreparedStatement pstmt = conn.prepareStatement(sql);
(4)设置参数值
PreparedStatement对象: setXxx(参数1,参数2): 给 ? 赋值Xxx: 数据类型 ;如 setlnt(参数1,参数2)参数:
参数1: ?的位置编号,从1 开始
参数2: ?的值
(5)执行SQL
executeUpdate(); executeQuery(); : 不需要再传递sql预编译功能的开启: