1.JDBC概念
- 概念:JAVA Database Connectivity,Java数据库连接
2.JDBC本质
官方sun公司定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包(比如MySQL数据库的驱动jar包mysql-connector-java-8.0.26.jar)。我们可以使用这套接口(JDBC)编程,真正执行的代码是jar包中的实现类。JDBC是sun公司定义的一套接口,只有一个。数据库驱动则有很多个。
3.快速入门
- 导入数据库驱动jar包
1. 在项目下新建一个目录,将mysql-connector-java-8.0.26.jar这个驱动jar包复制到里面。
2. 右键将上一步新建的目录Add as library
- 注册驱动:forName方法,调用此方法将会导致xxx.class类初始化
- 获取数据库连接对象(Connection):getConnection方法,建立一个到给定的数据库URL的连接
- 定义sql语句
- 获取执行sql语句的对象Statement或者PreparedStatement
1.使用Connection对象的createStatement方法
2. 使用Connection对象的PreparedStatement方法
- 执行sql,接受返回结果
- 处理结果
- 释放资源
Connection con = null;
Statement s = null;
try {
// 1.导入驱动包
// 2.注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
// 3.获取数据库连接对象,localhost表示回环地址
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/oa", "root", "123456");
// 4.定义一个sql语句
String sql = "update t_car set mileage = 800 where send = 0";
// 5.获取执行sql的对象Statement
s = con.createStatement();
// 6.执行sql
int rs = s.executeUpdate(sql);
// 7.处理结果
System.out.println(rs); // 返回影响的行数 1
} finally {
// 8.释放资源
if (s != null) {
try {
s.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (con != null) {
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
4.常用的类
1.DriverManager:驱动管理
- 注册驱动:告诉程序使用哪一个数据库驱动
public static void registerDriver(Driver driver)
在静态代码块中调用上述函数
static {
try {
DriverManager.registerDriver(new Driver());
} catch (SQLException var1) {
throw new RuntimeException("Can't register driver!");
}
}
注意:MySQL5之后的驱动jar包可以省略注册驱动的步骤。即Class.forName(驱动类名)这一语句。但是建议使用
2. 获取数据库连接
public static Connection getConnection(String url,String user,String password):
参数:
url:指定连接的路径。对于MySQL,jdbc:mysql://IP地址(或者域名):端口号/数据库名称
2.Connection:数据库连接
- 获取执行sql的对象
1.Statement createStatement()
2.PreparedStatement prepareStatement(String sql)
- 管理事务
1. 开启事务:setAutoCommit,调用该方法设置参数为false,即开启事务
2. 提交事务:commit
3. 回滚事务:rollback
3.Statement:执行静态sql
- 执行sql
execute方法:可以执行任意的sql语句
long executeUpdate:执行DML(insert,update,delete),返回值为影响的行数。DDL(create,drop,drop)语句,返回值为0
ResultSet executeQuery:执行DQL(select)语句
4.ResultSet:结果集对象,封装查询结果的
- 常用方法:
1、 next():将游标移动到下一行,将下一行作为当前行,判断当前行是否是最后一行末尾(是否有数据),如果是则返回false
2. getXxx():Xxx代表数据类型,比如getInt
3. getXxx(参数):参数有两种,参数比如int类型的代表列的编号,从1开始;参数如String传递列的名称。getXxx方法表示获取当前行中指定列的数据
// 示例
// ResultSet的使用:读取一个数据库表中的数据
Connection con = null;
Statement s = null;
ResultSet rs = null;
try {
// 注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
// 获取数据库连接对象
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/secs", "root", "123456");
// 获取执行sql的对象
s = con.createStatement();
// 定义sql
String sql = "select * from noticeboard";
// 执行sql
rs = s.executeQuery(sql);
// 处理结果
while (rs.next()) {
// 注意列标从1开始
String number = rs.getString(1);
String time = rs.getString("time");
String content = rs.getString("content");
System.out.println(number + "," + time + "," + content);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// 释放资源
if (rs != null) {
rs.close();
}
if (s != null) {
s.close();
}
if(con != null) {
con.close();
}
}
- ResultSet的使用步骤:
1. 游标向下移动一行(有数据的一行,而不是表头)
2. 判断是否有数据(12同时进行)
3. 获取数据
// 示例
ResultSet rs = new PreparedStatement().executeQuery();
while (rs.next() {
通过getXxx方法获取当前行中的每一列的数据
}
5.PreparedStatement:执行预编译带有参数的的sql。预编译的sql使用占位符。不要使用Statement对象,而是使用PreparedStatement对象执行sql语句,该对象防止sql注入,并且效率高。
步骤:
1. 导入驱动jar包
2. 注册驱动
3. 获取数据库连接对象
4. 定义sql,注意sql的参数使用?作为占位符。例如:
select * from stu where name = ? and age = ?;
5. 获取执行sql语句的对象PreparedStatement
6. 给?赋值:使用setXxx方法(参数1,参数2),参数1为参数?的位置编号,从1开始。参数2为?的值
7. 执行sql,接受返回结果,不需要传递sql语句
8. 处理结果
9. 释放资源
// 1.注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
// 2.获取数据库连接对象
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/secs","root","123456");
// 3.定义sql
String sql = "select * from admin where AdminUser = ? and AdminPwd = ?";
// 4. 获取执行sql的PreparedStatement对象
PreparedStatement preparedStatement = con.prepareStatement(sql);
// 5.给?赋值
preparedStatement.setString(1,"20170201818");
preparedStatement.setString(2,"123456");
// 6.执行sql
ResultSet rs = preparedStatement.executeQuery();
// 7.处理结果
rs.next(); // 第一行才有数据
String ip = rs.getString("AdminIP");
System.out.println(ip);
// 8.释放资源
rs.close();
preparedStatement.close();
con.close();
5.jdbc管理事务
- 事务:一个包含多个步骤的业务操作。如果这个业务操作被事务管理,则这多个步骤要么同时成功,要么同时失败。
- 操作:
1. 开启事务:在执行sql之前开启事务
2. 提交事务:当所有sql执行完提交事务
3. 回滚事务:在catch中回滚事务
- 使用Connection对象来管理事务
1. 开启事务:setAutoCommit(boolean autoCommit)调用该方法设置参数为false,即开启事务
2. 提交事务:ccommit
3. 回滚事务:rollback
案例:
// 注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
Connection con = null;
PreparedStatement preparedStatement1 = null;
PreparedStatement preparedStatement2 = null;
try {
// 获取数据库连接对象
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/secs", "root", "123456");
// 开启事务
con.setAutoCommit(false);
// 定义sql
String sql1 = "update admin set AdminPwd = ? where id = ?";
String sql2 = "update admin set AdminPwd = ? where id = ?";
// 获取执行sql的PreparedStatement对象
preparedStatement1 = con.prepareStatement(sql1);
preparedStatement2 = con.prepareStatement(sql2);
// 为占位符设置值
preparedStatement1.setString(1,"111");
preparedStatement1.setInt(2,1);
preparedStatement2.setString(1,"222");
preparedStatement2.setInt(2,2);
// 执行sql
preparedStatement1.executeUpdate();
preparedStatement2.executeUpdate();
// 提交事务
con.commit();
} catch (Exception e) {
// 回滚事务
try {
con.rollback();
} catch (SQLException ex) {
ex.printStackTrace();
}
e.printStackTrace();
} finally {
// 释放资源
preparedStatement1.close();
preparedStatement2.close();
con.close();
}