jdbc认识上手

一、 认识jdbc

jdbc是什么能?能够做什么
JDBC简介- JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序

对于我来说,jdbc就是一种封装好在一个架包中的工具箱

常用工具

在这一个工具箱中有许多常用的工具:

1. DriverManager – 类:用来获取Connection
2. Connection – 接口;用来获取Statement或者 PreparedStatement对象的
3. Statement – 接口;用来执行sql语句方法1
4. PreparedStatement接口:用来执行sql语句方法2
5. ResultSet – 接口: 得到执行查询语句返回的结果集


这些工具有什么用?

首先我们要清楚这个jdbc是一个工具,连接java与数据库,通过在java程序上直接操作数据库

-1、

这是没有jdbc的

应用程序
MysQL
数据库
oracle
数据库.
其它数据库.........
.............

第一种:假设没有jdbc这一种APL提供一套统一的操作语言,那么应用程序在操作MySql数据库的时候就用到MySQL专门的驱动语言,用操作Oracle时候就用到Oracle数据库操作语言,何况还有其他数据库的存在,对于一个程序员来说,用过多的时间去学习其它应用程序操作数据库库的语言,无疑浪费精力,而且,容易混淆,其中代码容易耦合,沉积


-2、

这是有jdbc的

应用程序
jdbc驱动
orcle
数据库.
mysql
数据库
其它数据库......
数据库............

第二种来说,中间加上了一个Jdbc驱动,在这一套驱动里有一套专门完善的语言以及接口去管理各种数据库,为此,程序员学号一套就够了,且解放应用程序与数据库直接接触,这样大大降低应用程序与数据库的耦合性,即使应用程序与其它数据库相互对接的时候,也不会改动太多,直接修改jdbc就好

而我们要学习的就是第二种


二首先要下载mysql驱动包

  1. 打开cmd 输入:mysql -V
          查看mysql版本,这里的’V’是大写的V

在这里插入图片描述


  1. 1,在maven仓库下载:dbc网址: https://mvnrepository.com/artifact/mysql/mysql-connector-java
    然后下载相应版本的架包

    在这里插入图片描述–>进去之后在这里插入图片描述
    2.在官方网址里下载的另一种方法步骤:官网下载
    在把下载好的架包导入
    新建一个空包,随意取个名,lib在这里插入图片描述导入架包
    在这里插入图片描述右键点击lib文件夹,然后在点击add as library…在这里插入图片描述跳出这个来点击OK在这里插入图片描述

这样jdbc的环境算是初次完成了


三、数据库连接的步骤

用jdbc操作数据路就相当于把可视化操作变成一行行整理好的代码进行操作

1. 加载驱动

A1、加载驱动的在mysql6.0以下版本用以下驱动语句

Class.forName("com.mysql.jdbc.Driver");

A2、在更新之后mysql6.0以上用

Class.forName("com.mysql.cj.jdbc.Driver");

原先的写法是:

DriverManager.registerDriver(new com.mysql.jdbc.Driver())

因为在Driver里面封装的是静态代码块,一旦调用就会执行,如果这样创建就会执行两次,所以不提倡

上面这行代码相当于打开加载数据库>

2. 用户信息与地址

 	    String url = "jdbc:mysql://localhost:3306/school?useUnicode=true&characterEncoding=utf8&usrSSL=true&serverTimezone=Asia/Shanghai";
        String username = "root";
        String userpassword = "123456"; 

对于地址url而言有许多讲究:url一些介绍

jdbc:mysql://localhost:3306/school?useUnicode=true&characterEncoding=utf8&usrSSL=true&serverTimezone=Asia/Shanghai
jdbc:mysql:// : 协议
localhost: IP地址
3306: 端口号
school: 数据库实例名
useUnicode=true&characterEncoding=utf8介绍:

usrSSL=true: 就是使用JDBC跟你的数据库连接的时候,你的JDBC版本与MySQL版本不兼容,MySQL的版本更高一些,在连接语句后加上“useSSL=‘true’” ,就可以连接到数据库了。更高版本。

serverTimezone=Asia/Shanghai:设置时区,为上海

”:相当于一个拼接字符
&”:相当于and

格式:
url=“协议://本机IP地址:端口号/数据库名”

相当于数据库应用程序连接的基本信息在这里插入图片描述
当然数据库一般都是自己在mysql里面建好了,连哪一个数据库是取决与自己

3. 获得数据库连接

 Connection connection = DriverManager.getConnection(url, username, userpassword);

在这里插入图片描述

4. 创建执行sql语句的statement对象

Statement statement = connection.createStatement();

在这里插入图片描述

5. 用statement对象执行sql语句

注意:
-1.有statement执行sql对象
-2.有PreparedStatement执行sql对象
共两种方式两种相关介绍

1 、 先要有执行语句

	String sql= "SELECT * FROM grade";

2 、用创建的statement对象执行

 ResultSet resultSet = statement.executeQuery(sql);	

  1. statement.excuteQuery() : (查询)执行之后会返回一个resultset
  2. statement.excute() : 可以执行任何sql语句,判断第一个结果是否为 ResultSet 对象,如果是,则 返回 true,否则返回 false
  3. statement.excuteUpdate() : (插入,更新。删除)都用这一个执行,会返回一个受影响的行数

6. 释放资源

	resultSet.close();
    statement.close();
    connection.close();

按照顺序关闭资源,相当于按照顺序退出mysql操作的可视化界面


四、jdbc的增删改查

用statement完成增、删、改、查
下面是没有用封装工具简化的增删改查

1、查select语句

package Zer.demo.util;

import java.sql.*;
//我的第一个jdbc程序
public class Select {

    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //1.加载驱动
        //DriverManager.registerDriver(new com.mysql.jdbc.Driver());//实现了两次注册
        Class.forName("com.mysql.cj.dbc.Driver");

        //2.用具信息和地址
        String url = "jdbc:mysql://localhost:3306/school?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=Asia/Shanghai";
        String username = "root";
        String userpassword = "123456";
        //3.连接成功,创建数据库对象
        Connection connection = DriverManager.getConnection(url, username, userpassword);
        //4.数据库对象创建执行sq的对象,编写失去了语句

        Statement statement = connection.createStatement();

        String sql= "SELECT * FROM grade";
        //5、用创建的statement对象执行sql语句,
        ResultSet resultSet = statement.executeQuery(sql);//用executeQuery()方法执行操作,会返回一个结果集

        while (resultSet.next()){
            System.out.println("gradeid="+resultSet.getInt("gradeid"));
            System.out.println("gradename="+resultSet.getString("gradename"));
            System.out.println("………………………………………………………………………………………………………………………………………");
        }
       // System.out.println(i);
        //6.释放连接
        resultSet.close();
        statement.close();
        connection.close();
    }

}




2、增insert语句

package Zer.demo.util;

import java.sql.*;
//我的第一个jdbc程序
public class Insert {

    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //1.加载驱动
        //DriverManager.registerDriver(new com.mysql.jdbc.Driver());//实现了两次注册
        Class.forName("com.mysql.cj.jdbc.Driver");

        //2.用具信息和地址
        String url = "jdbc:mysql://localhost:3306/school?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=Asia/Shanghai";
        String username = "root";
        String userpassword = "123456";
        //3.连接成功,创建数据库对象
        Connection connection = DriverManager.getConnection(url, username, userpassword);
        //4.数据库对象创建执行sq的对象,编写失去了语句

        Statement statement = connection.createStatement();

        String sql= "insert into grade values(25,'这好吗')";
        //5、用创建的statement对象执行sql语句,


        int i = statement.executeUpdate(sql);//对于增、删、改,用executeUpdate()方法执行,会返回一个影响行数
        if (i>0){
            System.out.println("插入成功");
        }else {
            System.out.println("插入失败");
        }

        // System.out.println(i);
        //6.释放连接

        statement.close();
        connection.close();
    }

}


3、改update语句

package Zer.demo.util;

import java.sql.*;
//我的第一个jdbc程序
public class Update {

    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //1.加载驱动
        //DriverManager.registerDriver(new com.mysql.jdbc.Driver());//实现了两次注册
        Class.forName("com.mysql.cj.jdbc.Driver");

        //2.用具信息和地址
        String url = "jdbc:mysql://localhost:3306/school?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=Asia/Shanghai";
        String username = "root";
        String userpassword = "123456";
        //3.连接成功,创建数据库对象
        Connection connection = DriverManager.getConnection(url, username, userpassword);
        //4.数据库对象创建执行sq的对象,编写失去了语句

        Statement statement = connection.createStatement();//执行查询的操作

        String sql= "update grade set gradename='大家都一样,即使不一样,累一点也无妨' where gradeid= 22";
        //5、用创建的statement对象执行sql语句,
        
        
        int i = statement.executeUpdate(sql);//对于增、删、改,用executeUpdate()方法执行,会返回一个影响行数
        if (i>0){
            System.out.println("更新成功");
        }else {
            System.out.println("更新失败");
        }

        // System.out.println(i);
        //6.释放连接
        
        statement.close();
        connection.close();
    }

}

4、删delete语句

package Zer.demo.util;

import java.sql.*;
//我的第一个jdbc程序
public class Delete {

    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //1.加载驱动
        //DriverManager.registerDriver(new com.mysql.jdbc.Driver());//实现了两次注册
        Class.forName("com.mysql.cj.jdbc.Driver");

        //2.用具信息和地址
        String url = "jdbc:mysql://localhost:3306/school?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=Asia/Shanghai";
        String username = "root";
        String userpassword = "123456";
        //3.连接成功,创建数据库对象
        Connection connection = DriverManager.getConnection(url, username, userpassword);
        //4.数据库对象创建执行sq的对象,编写失去了语句

        Statement statement = connection.createStatement();
        
        String sql= "delete from grade where gradeid =22";
        //5、用创建的statement对象执行sql语句,


        int i = statement.executeUpdate(sql);//对于增、删、改,用executeUpdate()方法执行,会返回一个影响行数
        if (i>0){
            System.out.println("删除成功");
        }else {
            System.out.println("删除失败");
        }

        // System.out.println(i);
        //6.释放连接

        statement.close();
        connection.close();
    }

}


图片参照改

在这里插入图片描述


工具做的连接

如果也发现了其中的规律,
只有:
1.sql语句变
2.执行时,查询与增删改的不一样:(1)一个是executeQuery()返回一个结果集,可用while循环展示
                  (2)一个是executeUpdate()返回一个受影响行数,可以用于判断是否执行成功

为此可以建一个工具类
https://blog.csdn.net/qq_45898383/article/details/118399812


五、SQL注入问题

SQL注入简单介绍
使用statement存在SQL注入问题,有安全隐患,为此,想要专门了解的可以自己去系统学习下


计算机有两种语言:
1、解释性语言:计算机运行时,由一个运行组件解释运行代码,并执行其中包含的指令(边解析边执行)
2、编译性语言:代码生成时就转化为机械语言,在运行时直接用该语言执行其中指令(直接执行)

在解释型语言中:如果程序与用户进行交互。用户就可以构造特殊的输入来拼接到程序中执行,从而使得程序依据用户输入的信息执行就有可能存在恶意行为的代码.

列如下面这个列子

在这里插入图片描述SQL注入后在这里插入图片描述

1、SQL注入得到了更多信息
2、SQL注入问题就会导致更多信息容易泄露
’or 1=1 – :其中一个单引号是为了拼接前面的用户输入信息,双杠“”空一格后面可以跟注释。不要注释,双杠可以不写


六 PreparedStatemen对象

可以防止SQL注入并且效率更高,

对于preparedstatement对象来说:

  1. 多了个占位符,把原有数据换成问号“?”,用问号去占位
  2. 手动进行赋值,按照问号的顺序,从第一个开始逐个赋值

1、查

package Zer.demo.util1;

import java.sql.*;

public class Select1 {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //1.加载驱动
        Class.forName("com.mysql.cj.jdbc.Driver");
        //2.用户信息
        String url="jdbc:mysql://localhost:3306/school?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=Asia/Shanghai";
        String username = "root";
        String userpassword = "123456";
        //3.连接成功,创建数据库对象
        Connection connection = DriverManager.getConnection(url, username, userpassword);



        //4、编写sql语句
        String sql= "select * from grade where gradeid = ? ";
        //String sql= "select * from grade ";如果没有占位符,就不用赋值,直接执行就好
        //5.进行预编译,预编译却不会执行
        PreparedStatement preparedStatement = connection.prepareStatement(sql);//进行预编译不执行
        //进行手动赋值之后,才会执行
        preparedStatement.setInt(1,24);

        //6.执行手动赋值好的语句
        ResultSet resultSet = preparedStatement.executeQuery();
        while (resultSet.next()){
            System.out.println(resultSet.getInt("gradeid"));
            System.out.println(resultSet.getString("gradename"));
        }




        //7.释放资源
        resultSet.close();
        preparedStatement.close();
        connection.close();



    }
}

2、增


package Zer.demo.util1;

import java.sql.*;

public class Insert {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //1.加载驱动
        Class.forName("com.mysql.cj.jdbc.Driver");
        //2.用户信息
        String url="jdbc:mysql://localhost:3306/school?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=Asia/Shanghai";
        String username = "root";
        String userpassword = "123456";
        //3.连接成功,创建数据库对象
        Connection connection = DriverManager.getConnection(url, username, userpassword);



        //4、编写sql语句
        String sql= "insert into grade(gradeid,gradename) values(?,?)";
        //5.进行预编译,预编译却不会执行
        PreparedStatement preparedStatement = connection.prepareStatement(sql);//进行预编译不执行
        //进行手动赋值之后,才会执行
        preparedStatement.setInt(1,27);
        preparedStatement.setString(2,"你还想不想学习");

        //6.执行手动赋值好的语句
        int i = preparedStatement.executeUpdate();//返回一个执行的影响行数

        if (i>0) {
            System.out.println("插入成功");
        }else {
            System.out.println("插入失败");
        }




        //7.释放资源

        preparedStatement.close();
        connection.close();



    }
}


3、改

package Zer.demo.util1;

import java.sql.*;

public class Update1 {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //1.加载驱动
        Class.forName("com.mysql.cj.jdbc.Driver");
        //2.用户信息
        String url = "jdbc:mysql://localhost:3306/school?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=Asia/Shanghai";
        String username = "root";
        String userpassword = "123456";
        //3.连接成功,创建数据库对象
        Connection connection = DriverManager.getConnection(url, username, userpassword);


        //4、编写sql语句
        String sql = "update grade set  gradename = ? where gradeid = ? ";
        //5.进行预编译,预编译却不会执行
        PreparedStatement preparedStatement = connection.prepareStatement(sql);//进行预编译不执行
        //进行手动赋值之后,才会执行
        preparedStatement.setString(1, "想学当然想学");
        preparedStatement.setInt(2, 27);

        //6.执行手动赋值好的语句
        int i = preparedStatement.executeUpdate();//返回一个执行的影响行数
        
        if (i > 0) {
            System.out.println("更新成功");
        } else {
            System.out.println("更新失败");
        }


        //7.释放资源

        preparedStatement.close();
        connection.close();


    }
}


4、删

package Zer.demo.util1;

import java.sql.*;

public class Delete1 {

    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //1.加载驱动
        Class.forName("com.mysql.cj.jdbc.Driver");
        //2.用户信息
        String url = "jdbc:mysql://localhost:3306/school?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=Asia/Shanghai";
        String username = "root";
        String userpassword = "123456";
        //3.连接成功,创建数据库对象
        Connection connection = DriverManager.getConnection(url, username, userpassword);


        //4、编写sql语句
        String sql = "delete from grade where gradeid = ?";
        //5.进行预编译,预编译却不会执行
        PreparedStatement preparedStatement = connection.prepareStatement(sql);//进行预编译不执行
        //进行手动赋值之后,才会执行
        preparedStatement.setInt(1,27);


        //6.执行手动赋值好的语句
        int i = preparedStatement.executeUpdate();//返回一个执行的影响行数,这个行数大于0,自然是成功

        if (i > 0) {
            System.out.println("删除成功");
        } else {
            System.out.println("删除失败");
        }


        //7.释放资源

        preparedStatement.close();
        connection.close();


    }
}

工具类的连接

preparedstatement的工具类简化连接

工具类:https://blog.csdn.net/qq_45898383/article/details/118399812

这些纯属个人随意写来玩玩,诸位大佬随意看看就好

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值