一.JDBC快速入门
1.1 准备数据
create table tab_user(
id int primary key auto_increment,
username varchar(20),
password varchar(20),
nickname varchar(20)
);
INSERT INTO tab_user
VALUES(null,'zhangsan','123456','张三');
INSERT INTO tab_user VALUES(null,'lisi','123456','李 四');
INSERT INTO tab_user
VALUES(null,'wangwu','123456','王五');
INSERT INTO tab_user
VALUES(null,'zhaoliu','123456','赵六');
1.2 代码实现
JDBC开发步骤 ,固定步骤 6个 (模版)
* 1.注册驱动
* 2.获得连接对象
* 3.获得执行sql语句的对象
* 4.执行SQL语句,获取结果集对象
* 5.处理结果集 (打印控制台)
* 6.释放资源
package Jdbc;
import com.mysql.cj.jdbc.Driver;
import java.sql.*;
public class Mysql {
public static void main(String[] args) throws Exception {
//注册驱动
DriverManager.registerDriver(new Driver());
//注册驱动 反射基础
//Class.forName("import com.mysql.cj.jdbc.Driver;");
//获取连接对象
String url = "jdbc:mysql://localhost:3306/day_0801?useUnicode=true&characterEncoding=utf8";
String username = "root";
String password = "123456";
Connection conn = DriverManager.getConnection(url, username, password);
//获取执行SQL语句的对象
Statement stat = conn.createStatement();
//执行SQL语句,获取对象结果集(insert) 增加数据
String sql = "insert into tab_user values(null,'tianqi','123456','田七')";
int i = stat.executeUpdate(sql);
//处理结果集
if (i>0){
System.out.println("添加成功");
}else{
System.out.println("添加失败");
}
stat.close();
conn.close();
}
}
二.JDBC API详解
3.1 DriverManager
DriverManager.registerDriver(new
com.mysql.cj.jdbc.Driver());
不建议使用,原因有2个:
导致驱动被注册2次
强烈依赖数据库的驱动jar
解决办法:
Class.forName("com.mysql.cj.jdbc.Driver");
3.2 Connection
接口的实现在数据库驱动中。所有与数据库交互都是基于连接对象
的。
在建立连接时,需要指定数据库
URL
、用户名、密码。
Connection
接口还负责管理事务
获取执行
SQL
的对象
普通执行SQL对象,Statement createStatement()
预编译SQL的执行SQL对象,PreparedStatement prepareStatement(sql)
3.3 Statement
接口的实现在数据库驱动中。
Statement
接口用于执行
SQL
语句并
与数据库进行交互。通过
Statement
对象,可以向数据库发送
SQL
语句并获取执行结果。
int executeUpdate():执行insert update delete语句
ResultSet executeQuery():执行select语句
3.4 PreparedStatement
PreparedStatement
是
Statement
接口的子接口,用于执行预编译
的
SQL
查询
预编译
SQL
语句:在创建
PreparedStatement
时,就会预编译
SQL
语句,也就是
SQL
语句已经固定。
防止
SQL
注入:将数据作为参数传递到
SQL
语句中,采用
?
占位符
的方式,有效防止传入关键字或值导致
SQL
注入问题。让参数就
是参数
性能提升:
PreparedStatement
是预编译
SQL
语句,同一
SQL
语
句多次执行的情况下,可以复用,不必每次重新编译和解析。
package Jdbc;
import com.mysql.cj.jdbc.Driver;
import java.sql.*;
public class Mysql {
public static void main(String[] args) throws Exception {
//注册驱动
DriverManager.registerDriver(new Driver());
//注册驱动 反射基础
//Class.forName("import com.mysql.cj.jdbc.Driver;");
//获取连接对象
String url = "jdbc:mysql://localhost:3306/day_0801?useUnicode=true&characterEncoding=utf8";
String username = "root";
String password = "123456";
Connection conn = DriverManager.getConnection(url, username, password);
//获取执行SQL语句的对象
Statement stat = conn.createStatement();
//执行SQL语句,获取对象结果集(insert) 查询数据
String name = "zhangsan";
String pwd = "123456";
String sql = "select * from tab_user where username='"+name+"'and password='"+pwd+"'";
ResultSet resultSet = stat.executeQuery(sql);
if (resultSet.next()){
System.out.println("登录成功");
}else{
System.out.println("登录失败");
}
stat.close();
conn.close();
}
}
通过
connection
对象创建
connection.prepareStatement(String sql) ;创建
prepareStatement对象
sql表示预编译的sql语句,如果sql语句有参数通过?来占位
SELECT * FROM user WHERE username = ? AND password =
?
设置参数
prepareStatement.set类型(int i,Object obj);
参数1:i 指的就是问号的索引(指第几个问号,从1开始)
参数2: 就是值 eg:setString(1,"zs");
setString(2,"123456");
sql
表示预编译的
sql
语句
,
如果
sql
语句有参数通过
?
来占位
package Jdbc;
import com.mysql.cj.jdbc.Driver;
import java.sql.*;
public class prepareStatementTest {
public static void main(String[] args) throws Exception {
//注册驱动
DriverManager.registerDriver(new Driver());
//2.获得连接对象
String url = "jdbc:mysql://localhost:3306/day_0801?useUnicode=true&characterEncoding=utf8";
String username= "root";
String password= "123456";
Connection conn = DriverManager.getConnection(url, username, password);
//3.获得执行sql语句的对象
String sql = "select * from tab_user where username=? and password=?";
PreparedStatement prep = conn.prepareStatement(sql);
//4.执行SQL语句,获取结果集对象 (select)
String name = "zhangsan";
String pwd = "123456";
prep.setString(1,name);
prep.setString(2,pwd);
//方法返回int类型的数据,表示操作成功的行数
ResultSet resultSet = prep.executeQuery();
//5.处理结果集 (打印控制台)
if (resultSet.next()){
System.out.println("登录成功");
}else{
System.out.println("登录失败");
}
//6.释放资源
resultSet.close();
prep.close();
conn.close();
}
}
3.5 ResultSet
封装了
SQL
查询语句的结果。
boolean next():调用next方法, ResultSet内部指针会移动到下一
行数据
rs.getString(“username”); 通过列名获取该列的值。
rs.getString(2);通过username列所在的第二个位置获取该列的
值。