JDBC

JDBC

JDBC

Java DateBase Connectivity 是一个独立于特定数据库的管理系统,通用的SQL数据库存取和操作的公共接口。

定义了一组标准,为访问不同的数据库提供了统一的途径。

image-20201121150742349


JDBC体系结构

JDBC接口包括两个层面:

​ 面向应用的API,供程序员调用。

​ 面向数据库的API,供厂商开发数据库的驱动程序。

image-20201121151518046

image-20201121152415396

JDBC API:

​ 提供者:java官方。

​ 内容:供开发者调用的接口。

​ java.sql javax.sql

DriverManager类

Connection接口

Statement接口

ResultSet接口

DriverManager

​ 提供者:java官方。

​ 作用:管理不同的JDBC驱动。

JDBC驱动

​ 提供者:数据库厂商。

​ 作用:连接不同的数据库。


JDBC的使用

1.加载数据库驱动。数据库驱动是java程序和数据库之间的桥梁。

2.获取Connection。Connection是java程序与数据库的一次连接。

3.创建Statement对象,由Connection产生。执行SQL语句。

4.如果需要接受返回值,创建ResultSet对象,保存Statement执行之后所查询到的结果。


JDBC简易示例:增删改查

示例:

1.创建java项目。

2.在项目中新建lib文件夹。

3.在文件夹中加入mysql-connector-java-8.0.16.jar。这个是跟MySql的版本对应的,是向下兼容的,如果你使用的是Mysql8.0,你没有办法使用mysql-connector-java-5.0.jar,但是如果你使用mysql-connector-java-8.0.16.jar,MySQL5.0和8.0都能使用。

4.添加jar包到Libraries中。

package com.wildfire.jdbc;

import java.sql.*;

public class Jdbc1 {
    public static void main(String []args){
        try {
            //加载驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            //获取连接
            String url="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai";
            //jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8
            //jdbc:数据库类型://url:端口号/数据库名?属性  useUnicode=true&characterEncoding=UTF-8处理中文乱码问题
            String user="root";
            String password="xjmwan1314";
            Connection connection= DriverManager.getConnection(url,user,password);
//            String sql="insert into student(name,score,birthday) values('边信哲',20,'2000-03-18')";
//            String sql="update student set name='张志流' where score=20";
//            String sql="delete from student where name='张三'";
//            Statement statement=connection.createStatement();
//            int result=statement.executeUpdate(sql);
//            System.out.println(result);

            String sql="select * from student";
            Statement statement =connection.createStatement();
            ResultSet resultSet=statement.executeQuery(sql);
            while(resultSet.next()){
                //resultSet.next()返回值是一个布尔型,如果下一行不存在,就返回false,即跳出循环。
                String name=resultSet.getString(1);
                Integer score=resultSet.getInt(2);
                String birthday=resultSet.getString(3);
                System.out.println(name+":"+score+":"+birthday);
            }

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }   catch (SQLException e) {
            e.printStackTrace();
        }


    }
}

注意:增删改使用的是executeUpdate方法,返回的是int类型,影响了几行就返回几。

​ 查使用的是executeQuery方法,返回的是ResultSet类型,是查询的结果集。

使用IDEA提供的简单的数据库可视化工具:

1.右边DateBase--》+--》Data Source(数据来源)--》MySQL

2.

3.点击Test Connection,返回success则返回成功。

PreparedStatement

实际开发中,我们常用Statement的子类PreparedStatement来完成增删改查的操作。

使用Statement进行开发有两个问题:

​ 1.需要频繁拼接String字符串,出错率较高。

​ 例如:

String username="夜雨声烦";
String pwd="xjmwan1314";
String sql="select * from user where username="+username+"and password ="+password;
System.out.println(sql);

​ 运行的结果是:

​ select * from user where username=夜雨声烦and password =xjmwan1314

​ 很明显不是我们想要的结果。

​ 2.存在SQL注入的风险。

​ SQL 注⼊:利⽤某些系统没有对⽤户输⼊的信息进⾏充分检测,在⽤户输⼊的数据中注⼊⾮法的 SQL 语句,从⽽利⽤系统的 SQL 引擎完成恶意⾏为的做法。

​ 例如:在输入框拼接SQL语句。

​ 使用PreparedStatement能很好的避免以上问题。

package com.wildfire.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class jdbc2 {
    public static void main(String []args){
        try {
            //加载驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            //获取连接
            String url="jdbc:mysql:localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai";
            String user="root";
            String password="xjmwan1314";
            Connection connection= DriverManager.getConnection(url,user,password);
            
            String username="夜雨声烦";
            String userpassword="123";
            //问号就是占位符
            String sql="select * from user where username = ? and userpassword = ?";
            //在这里就输入了sql语句,后面调用方法却没有用。
            PreparedStatement preparedStatement=connection.prepareStatement(sql);
            //第一个问号赋值为username    不进行字符串拼接  直接使用字符串进行判断
            preparedStatement.setString(1,username);
            preparedStatement.setString(2,userpassword);
            ResultSet resultSet=preparedStatement.executeQuery();
            if(resultSet.next()){
                System.out.print("登录成功!");
            }else{
                System.out.println("登陆失败!");
            }
            


        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }   catch (Exception e) {
            e.printStackTrace();
        }
    }
}

注意:PreparedStatement preparedStatement = connection.prepareStatement(sql);
ResultSet resultSet = preparedStatement.executeQuery();

这里是创建对象的时候就传入了SQL语句,而不是使用方法的时候传入sql语句。

posted @ 2020-11-21 23:30  Mr_WildFire  阅读(176)  评论(0编辑  收藏  举报