jdbc(B站动力节点老杜)学习笔记复习使用

jdbc概述

什么是jdbc?

java语言连接数据库的一套接口,jdbc是SUN公司定制的一套接口

为什么要SUN公司要制定一套接口?

每个数据库的底层实现原理不同,程序员要想使用java连接某一个数据库就需要遵循哪一个数据库的规范。设想,我们程序员如果想用另一个数据库,就要遵循另一个数据库的规范,这样非常的繁琐。

所以SUN公司制定一套接口,每个数据库厂家负责编写JDBC的实现类,这些实现类存储在jar包,这些jar包就是驱动。我们程序员面向JDBC接口写代码。

引用B站老杜的一张图来描述JDBC的本质:

jdbc(B站动力节点老杜)学习笔记复习使用_第1张图片

用代码来解释JDBC本质

SUN公司制定的一套接口

public interface JDBC{
    
    void getConnection();//SUN公司制定的JDBC接口
}


//Mysql数据库公司实现JDBC接口
public class MySql implements JDBC{

    public void getConnection(){
        System.out.println("连接Mysql数据库成功");
    }
}

//程序员面向JDBC接口编程
public class JavaProgrammer{
    public static void main(String[] args){
        JDBC jdbc = new Mysql();//多态
        jdbc.getConnection;
    }
}

JDBC开发前的准备工作

先从数据库官网下载对应的驱动jar包,以上的配置是针对于文本编辑器的方式开发,使用IDEA工具的时候,不需要配置以上的环境变量。 IDEA有自己的配置方式。

eclipse引入jar包

新建项目,在项目下新建lib文件,lib文件下引入jar包,右键jar包,点击build path 点击 add to build path,在Web App Libraries下看到奶瓶形状的jar包就表示引入成功了

jdbc(B站动力节点老杜)学习笔记复习使用_第2张图片

idea引入驱动

 1.点击File,点击Project  Structure

jdbc(B站动力节点老杜)学习笔记复习使用_第3张图片

 2.找到Libraires  点击+号 选择java

jdbc(B站动力节点老杜)学习笔记复习使用_第4张图片

3.找到jar包路径选中即可

 jdbc(B站动力节点老杜)学习笔记复习使用_第5张图片

JDBC编程六步:

1.注册驱动(要连哪个品牌的数据库)

2.获取连接(使用完之后一定要关闭通道)

3.获取数据库操作对象(专门执行sql语句的对象)

4.执行sql语句

5.处理查询结果集(只有sql是select语句,才有这一步)

6.释放资源(必要)        

代码演示:

package com.atdongli.java;
import java.sql.*;
public class JdbcTest {
	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://localhost:3306/db01","root", "2020");
				//3.获取数据库操作对象
				stmt = conn.createStatement();
				//4.执行sql语句
				String sql = "select name,address from users where id = 2 or id = 3";
				//5.处理查询结果集
				// int executeUpdate(insert/delete/update)   //增删改返回处理的数量
				// ResultSet executeQuery(select)	
				rs = stmt.executeQuery(sql);  //专门执行查询语句
				while(rs.next()) {         //jdbc下标从1开始           //如果rs.next()为true  光标会指向结果集的下一行  来完成对结果集的遍历
					String name = rs.getString("name");  //获取结果集的数据用rs.getString()方法:不论数据库中数据是什么类型
					String address = rs.getString("address");//都以String类型形式取出    同理getInt()
					System.out.println(name + "," + address);
				}
			}catch(Exception e) {
				e.printStackTrace();			
			}finally {
				//6.释放资源
				if(rs != null) {
					try {
						rs.close();
					}catch(Exception e){
						e.printStackTrace();
					}
				}
				if(stmt != null) {
					try {
						stmt.close();
					}catch(Exception e) {
						e.printStackTrace();
					}
				}
				if(conn != null) {
					try {
						conn.close();
					}catch(Exception e) {
						e.printStackTrace();
					}
				}
			}
			
		} 
		

		
	}

/*
 * 使用PreparedStatement代替Statement,实现对数据库的增删改查
 * */
public class PrepareStatementTest {
	public static void main(String[] args) {
		Connection conn = null;
		PreparedStatement ps = null;
		
		try{
			//1.注册驱动
			Class.forName("com.mysql.jdbc.Driver");
			//2.获取连接
			conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db01","root", "2020");
			System.out.println(conn);
			//3.编写sql语句返回preparedStatement的实例
			String sql = "insert into users(name,address) values(?,?)";  //?:表示占位符
			ps =  conn.prepareStatement(sql);
			//4.填充占位符
			ps.setString(1,"诸葛亮");
			ps.setString(2, "三国");
			//5.执行sql语句
			ps.execute();
		}catch(Exception e) {
			e.printStackTrace();			
		}finally {
			//6.释放资源
			if(ps != null) {
				try {
					ps.close();
				}catch(Exception e){
					e.printStackTrace();
				}
			}
			if(conn != null) {
				try {
					conn.close();
				}catch(Exception e) {
					e.printStackTrace();
				}
			}
		}
	}

}

sql注入问题及解决

1.sql注入是什么?

用户输入的信息包含sql语句的关键字,并且这些关键字参与sql语句的编译过程,导致sql语句的意愿被扭曲,进而达到sql注入。
Statement有sql注入问题,才引出PreparedStatement。

2.sql注入问题的解决

只要用户提供的信息不参与sql语句的编译过程,问题解决。既是用户提供的信息含sql语句的关键字,但没有参与编译,不起作用。要想解决sql注入,必须使用java.sql.PreparedStatement。PreparedStatement接口继承Statement,是属于预编译的数据库操作对象。原理是:预先对sql语句的框架进行编译,然后给sql语句传值。

关键是:用户提供的信息含sql语句的关键字,但没有参与编译,不起作用

对比Statement和PreparedStatement

Statement存在sql语句注入问题,PreparedStatement解决了此问题
Statement编译一次执行一次,PreparedStatement是编译一次可执行n次(前提是sql语句不变),PreparedStatement效率更高
PreparedStatement编译阶段做类型的安全检测
综上:PreparedStatement使用较多,只有极少数情况用Statement(必须使用sql语句拼接的,要用Statement)

你可能感兴趣的:(jdbc,java)