JDBC
Java Database Connectivity;
Java 语言操作数据库,本质是一套操作所有关系型数据库的规则,即接口;
JDBC 是 Java 访问数据库的标准规范,真正怎么操作数据库还需要具体的实现类,也就是数据库驱动。每个 数据库厂商根据自家数据库的通信格式编写好自己数据库的驱动。所以我们只需要会调用 JDBC 接口中的方法即 可,数据库驱动由数据库厂商提供
快速入门
1、导入驱动jar 包
从官方下载mysql-connector-java-8.0.22文件夹,将其中的文件:mysql-connector-java-8.0.22.jar导入,方法是
2、注册驱动(告诉驱动该使用哪个驱动jar包,在mysql5版本后已经自动注册驱动,可以省略此步骤)
Class.forName(“com.mysql.jdbc.Driver”);
3、获取数据库的连接对象connection
4、定义sql
5、获取执行sql语句的对象statement
6、执行sql,接收返回结果
7、处理结果
8、释放资源
JDBC各个类详解
DriverManager:驱动管理对象
1、注册驱动(告诉程序该使用哪个驱动jar包)
2、获取数据库连接
static Connection getConnection(String url)
尝试建立与给定数据库URL的连接。
static Connection getConnection(String url, String user, String password)
尝试建立与给定数据库URL的连接。
static Connection getConnection(String url, Properties info)
尝试建立与给定数据库URL的连接
参数:URL:指定连接的路径;不同的数据库有些差异;
mysql的语法是:
jdbc:mysql://ip地址(域名):端口号/数据库名称
如果连接的是本机,同时端口号是默认的3306,就可以省略“ip地址(域名):端口号”
Connection:数据库连接对象
1、功能:获取执行sql的对象
Statement createStatement()
创建一个 Statement对象,用于将SQL语句发送到数据库。
PreparedStatement prepareStatement(String sql)
创建一个 PreparedStatement对象,用于将参数化的SQL语句发送到数据库。
2、管理事务:
*开启事务:void setAutoCommit(boolean autoCommit)
将此连接的自动提交模式设置为给定状态。调用该方法参数为false,即开启事务;
*提交事务:void commit()
使上次提交/回滚之后所做的所有更改都将永久性,并释放此 Connection对象当前持有的任何数据库锁。
*回滚事务:void rollback()
撤消在当前事务中所做的所有更改,并释放此 Connection对象当前持有的任何数据库锁。
Statement:执行sql的对象
用于执行静态SQL语句并返回其生成的结果的对象。
1、执行sql
boolean execute(String sql)
执行给定的SQL语句,这可能会返回多个结果。执行任意的sql
int executeUpdate(String sql) 执行增、删、改
执行给定的SQL语句,这可能是 INSERT , UPDATE ,或 DELETE声明,或者不返回任何内容,如SQL DDL语句的SQL语句。返回影响的行数
ResultSet executeQuery(String sql) 执行查询语句
执行给定的SQL语句,返回一个 ResultSet对象。
附上代码实例:
public class JDBCDemo {
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
try {
//1. 注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接对象
conn = DriverManager.getConnection("jdbc:mysql:///db3", "root", "root");
//conn = JDBCUtils.getConnection("jdbc:mysql:///db3", "root", "root");
//3.定义sql
String sql = "delete from account where id = 3";
//4.获取执行sql对象
stmt = conn.createStatement();
//5.执行sql
int count = stmt.executeUpdate(sql);
//6.处理结果
System.out.println(count);
if(count > 0){
System.out.println("删除成功!");
}else{
System.out.println("删除失败");
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
//7.释放资源
if(stmt != null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
ResultSet:结果集对象
封装数据库查询的结果集,对结果集进行遍历,取出每一条记录。
方法:1、boolean next()
1)游标向下移动 1 行
2) 返回 boolean 类型,如果还有下一条记录,返回 true,否则返回 false
数据类型
2、getXxx()
1)通过字段名,参数是 String 类型。返回不同的类型
2) 通过列号,参数是int,从 1 开始。返回不同的类型
释放资源按照资源打开的反向顺序,使用完毕以后要关闭结果集 ResultSet,再关闭 Statement,再关闭 Connection
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
//1. 注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接对象
conn = DriverManager.getConnection("jdbc:mysql:///db1", "root", "password");
//3.定义sql
String sql = "select * from tab_category";
//4.获取执行sql对象
stmt = conn.createStatement();
//5.执行sql
rs = stmt.executeQuery(sql);
//6.处理结果,用遍历的方法获取这个表的所有数据
while(rs.next()){ // 让游标向下移动一行
//获取数据
int id = rs.getInt(1);
String name = rs.getString("cname");
boolean gender = rs.getBoolean("gender");
Date birthday = rs.getDate("birthday");
System.out.println(id + "---" + name + "---" + gender "---" + birthday );
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
//7.释放资源
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();
}
}
}
}
}
PreparedStatement:执行带参数的预编译的SQL语句对象
SQL注入问题:我们让用户输入的密码和 SQL 语句进行字符串拼接。用户输入的内容作为了 SQL 语句语法的一部分,改变了 原有 SQL 真正的意义。要解决 SQL 注入就不能让用户输入的密码和我们的 SQL 语句进 行简单的字符串拼接。
PreparedStatement 是 Statement 接口的子接口,继承于父接口中所有的方法。它是一个预编译的 SQL 语句。
- 因为有预先编译的功能,提高 SQL 的执行效率。
- 可以有效的防止 SQL 注入的问题,安全性更高。