文章目录
- 一、JDBC原理
- 二、JDBC API主要功能:
- 三、JDBC执行流程:
- 四、Statement
- 代码实现:
- 五、PreparedStatement
- 代码实现:
- 运行结果:
- 六、Statement 和 PrepareStatement 的区别
- 1 使用上的区别:
- 2 推荐使用PreparedStatement的原因:
一、JDBC原理
JDBC ( Java Database Connectivity ):为多种关系型数据库DBMS提供统一的访问方式,实现用java操作数据库。
二、JDBC API主要功能:
DriverManager: 管理JDBC驱动
Connection : 连接数据库( 通过DriverManager产生)
Statement :对数据库进行增删改查。(通过Connection产生)
PreparedStatement:用以执行包含动态参数的SQL查询和更新(通过Connection产生)
CallableStatement: 调用数据库中的存储过程/存储函数(通过Connection产生)
ResultSet : 返回的结果集 (通过各种statement产生)
三、JDBC执行流程:
1:连接数据源,如:数据库。
2:为数据库传递查询和更新指令。
3:处理数据库响应并返回的结果。
四、Statement
Statement操作数据库:
增删改 : executeUpdate();
查询:executeQuery();
getString(Int等) : 通过字段名获取具体的值
代码实现:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
public class JDBCDemo {
private static final String URL = "jdbc:mysql://127.0.0.1:3306/jdbc?serverTimezone=UTC&characterEncoding=UTF-8";
private static final String name = "root"; //账号
private static final String pwd = "123456"; //密码
public static void update() { //增删改操作
try{
//导入驱动,加载具体的驱动类(新的要加cj)
Class.forName("com.mysql.cj.jdbc.Driver");
//与数据库建立连接
Connection conn = DriverManager.getConnection(URL,name,pwd);
//发送sql语句
Statement stmt = conn.createStatement();
String sql = "insert into info values('zhangsan',20)";
//执行sql语句
int count = stmt.executeUpdate(sql); //返回值为修改的行数
if(count>0){
System.out.println("操作成功!");
}
//关闭连接
if(stmt!=null) stmt.close();
if(conn!=null) conn.close();
}catch(Exception e){
e.printStackTrace();
}
}
public static void query(){ //查询操作
try{
//导入驱动,加载具体的驱动类
Class.forName("com.mysql.cj.jdbc.Driver");
//连接数据库
Connection conn = DriverManager.getConnection(URL,name,pwd);
//发送sql语句
Statement stmt = conn.createStatement();
String sql = "select * from info";
//执行查询,获取结果集
ResultSet st = stmt.executeQuery(sql);
//处理结果集
while(st.next()){
String name = st.getString("name");
int age = st.getInt("age");
System.out.println("姓名:" + name + " " + "年龄:" + age);
}
//关闭连接
if(st!=null) st.close();
if(stmt!=null) stmt.close();
if(conn!=null) conn.close();
}catch(Exception e){
e.printStackTrace();
}
}
public static void main(String[] args) {
//update();
query();
}
}
五、PreparedStatement
public interface PreparedStatement extends Statement
为Statement的子接口
PreparedStatement操作数据库:
增删改 : executeUpdate();
查询:executeQuery();
赋值操作: setString(Int等)
代码实现:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class JDBCPreparedStatementDemo {
private static final String URL = "jdbc:mysql://127.0.0.1:3306/jdbc?serverTimezone=UTC&characterEncoding=UTF-8";
private static final String name = "root"; //账号
private static final String pwd = "123456"; //密码
public static void update(){
try{
//加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//连接数据库
Connection conn = DriverManager.getConnection(URL,name,pwd);
String sql = "insert into info values(?,?)";
PreparedStatement pstmt = conn.prepareStatement(sql); ///预编译
pstmt.setString(1, "lisi"); //设置第一个?的值
pstmt.setInt(2, 18); //设置第二个?的值
//cnt表示增删改数据的条数
int cnt = pstmt.executeUpdate();
if(cnt>0){
System.out.println("操作成功!");
}
//关闭连接
if(pstmt!=null) pstmt.close();
if(conn!=null) conn.close();
}catch(Exception e){
e.printStackTrace();
}
}
public static void query(){
try{
//加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//数据库连接
Connection conn = DriverManager.getConnection(URL,name,pwd);
String sql = "select * from info";
PreparedStatement pstmt = conn.prepareStatement(sql);
//查询
ResultSet st = pstmt.executeQuery();
while(st.next()){
String name = st.getString("name");
int age = st.getInt("age");
System.out.println("姓名: " + name + " " + "年龄:" + age);
}
//关闭连接
if(st!=null) st.close();
if(pstmt!=null) pstmt.close();
if(conn!=null) conn.close();
}catch(Exception e){
e.printStackTrace();
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
//update();
query();
}
}
运行结果:
六、Statement 和 PrepareStatement 的区别
1 使用上的区别:
1.Statement:
(1) String sql = “”
(2) executeUpdate (sql)
2.PreparedStatement:
(1) String sql = “” (sql语句中可能存在占位符?)
(2) prepareStatement (sql) , 在创建PreparedStatement时,对sql语句进行预编译,
(3) setString(Int等) 替换占位符?
例如:setString(1,“zhangsan”) 将第一个占位符的位置替换为“zhangsan”
(4) executeUpdate()
2 推荐使用PreparedStatement的原因:
1: 编码更加简单,可以避免复杂的字符串拼接
2: 性能更好,通过预编译(只执行一次),比 statement 快
3: 使用占位符的方式,代码可读性高,便于后期维护
4; 更加安全, 有效防止sql注入, 而statement有被注入风险
(sql注入:用户输入的代码和sql语句混为一体,引号配对等,从而使得错误的信息登录成功!)