【JavaWeb】 JDBC详细介绍


一、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语句混为一体,引号配对等,从而使得错误的信息登录成功!)


猜你喜欢

转载自blog.csdn.net/weixin_45260385/article/details/109301754