Java 的 JDBC 编程

通过 Java 代码来操作数据库

实际开发中,绝大部分时候都是用代码来操作数据库的,代码操作数据库的时候还是依赖 SQL 语句

一个成熟的数据库一般会提供一些 api 供程序员使用

api (application programing interface) 应用程序编程接口 (广义的概念)

interface 也是接口,特指 java 语法中的一种特殊语法格式(狭义的概念),Java 中的 interface 也是一种提供 api 的方式

所以我们可以认为 api 的概念更广泛,它不仅仅局限于一种编程语言或者某一种库某一种框架,很多很多地方都会涉及到 api.

写好一个程序,你这个程序要给别人提供哪些功能,这些功能往往是通过一些 函数/类 这样的方式来提供的

举个例子:

以前学过的 Random ,Scanner ,ArrayList ,String 都可以认为是 Java 标准库给我们提供的api

成熟的数据库会提供一些 api 让程序员使用(api就是一些类/方法)

从此 Java 程序员只需要掌握一套 api 就可以操作各种数据库了

JDBC 是提供了一套统一的 api

但是数据库本身也有自己的 api ,所以每个数据库厂商提供了一些代码把 api 进行转化(这里数据库提供的代码就是数据库的驱动包,类似于翻译官)

Java 代码操作 Mysql

1.创建个项目

2.引入 Mysql 的驱动包,作为项目的依赖,把驱动包下载下来,导入到项目中

以下是下载驱动包的几个途径,我们目前用中央仓库就足够了

 a) oracle 官方网站(有点难用)

 b) github

 c) 中央仓库(圈子里有一些活佛,把一些知名的第三方库都给收集在一起了,只要你去这个仓库找,一般都能找到) 中央仓库也有很多,我们这里用 : https://mvnrepository.com/

然后我们打开网站搜索 Mysql ,打开下图的连接

进去之后会看到很多版本,此处数据库驱动包的版本要和数据库服务器的版本一致

下面是查看 Mysql 版本的方法,看到几开头就选择几开头的驱动包,我这边选了个 5.1.49(48,47 之类的也可以)

.jar 类似于 .rar 这样的压缩包,是java 定义的一种压缩格式.

.jar 中主要是包含了很多的 .class 文件

.java 会编译生成 .class,要想发布程序给别人,就需要把 .class 给拷贝过去

如果 .class 文件特别多,比较麻烦,更好的做法就是把 .class 打成压缩包(.jar 包),然后以压缩包的形式进行发送.

.jar 包是java 中发布程序的一种典型方式

接下来我们要将刚刚下载的 jar 包导入到项目中去

先在 jdbc 中创建一个directory 名字为 lib(库,library的缩写)

然后打开 jar 包的文件目录,将其复制粘贴到 lib 里面

然后右键 lib 这个目录

然后弹出来一个框点击 OK 就行

此时准备工作完成了,就可以编写代码了

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class JDBCDemo1 {
    public static void main(String[] args) throws SQLException {
        //假定数据库中有一个 student 表(id,name),往里面插入一个数据

        //1.创建"数据源",就是数据的来源 => 数据库服务器在哪
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java?characterEncoding=utf-8&useSSL=false");//向下转型又转回来了
        //设置了URL之后,还需要设置用户名和密码
        ((MysqlDataSource) dataSource).setUser("root");//大家都是root
        ((MysqlDataSource) dataSource).setPassword("123456");//安装数据库的时候设置的密码
        //2.和数据库服务器建立连接
        Connection connection = dataSource.getConnection();
        //3.构造SQL语句
        String sql = "insert into student values(1,'张三')";
        PreparedStatement statement = connection.prepareStatement(sql);
        //4.执行sql语句,返回值 n 就是这次操作影响到的行数
        int n = statement.executeUpdate();
        System.out.println("n = "+n);
        //5.释放必要的资源,关闭连接
        statement.close();
        connection.close();//创建的语句对象和连接对象.都会持有一些计算机的硬件/软件上的资源,这些资源不用了就应该及时释放
        //java 中虽然有"垃圾回收"机制,可以自动释放内存,但是有的时候占用的资源不仅仅是内存
        //这些其他资源就需要用close手动释放
        //还要注意关闭顺序,先创建的对象后关闭
    }
}

运行结果如下,受影响的行数为1,插入成功

IP地址就是网络上的一个设备地址是通过这一串数字来表示的,这一串数字通常是四个部分,每个部分取值范围是 0~255 ,四个部分之间使用" . "分割(点分十进制)  ,  127.0.0.1 其实是一个特殊的 IP 地址,特指自己的主机(环回IP).

如果数据库和 java 代码都在一台主机上运行,这个 IP 就写作环回 IP 即可,但是如果 java 代码和数据库服务器在不同的主机上,就需要写对应数据库服务器的 IP 地址了,这个地址可以在 cmd 中查看,敲下 ipconfig 就行,冒号后面的就是这台设备的地址

有个问题就是此处插入的数据是写死的,怎么样实现动态变化呢,比如通过用户输入,或是通过硬盘获取

public class JDBCDemo1 {
    public static void main(String[] args) throws SQLException {
        //假定数据库中有一个 student 表(id,name),往里面插入一个数据
        //让用户通过控制台来输入学号和姓名
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入学号");
        int id = scanner.nextInt();
        System.out.println("请输入姓名");
        String name = scanner.next();

        //1.创建"数据源",就是数据的来源 => 数据库服务器在哪
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java?characterEncoding=utf-8&useSSL=false");//向下转型又转回来了
        //设置了URL之后,还需要设置用户名和密码
        ((MysqlDataSource) dataSource).setUser("root");//大家都是root
        ((MysqlDataSource) dataSource).setPassword("123456");//安装数据库的时候设置的密码
        //2.和数据库服务器建立连接
        Connection connection = dataSource.getConnection();
        //3.构造SQL语句
        String sql = "insert into student values(?,?)";//? 是一个占位符,占据一个位置,后续PreparedStatement 会把变量的数值带入到 ? 中
        PreparedStatement statement = connection.prepareStatement(sql);
        statement.setInt(1,id);
        statement.setString(2,name);
        //4.执行sql语句,返回值 n 就是这次操作影响到的行数
        int n = statement.executeUpdate();
        System.out.println("n = "+n);
        //5.释放必要的资源,关闭连接
        statement.close();
        connection.close();//创建的语句对象和连接对象.都会持有一些计算机的硬件/软件上的资源,这些资源不用了就应该及时释放
        //java 中虽然有"垃圾回收"机制,可以自动释放内存,但是有的时候占用的资源不仅仅是内存
        //这些其他资源就需要用close手动释放
        //还要注意关闭顺序,先创建的对象后关闭
    }
}

这样就能动态插入数据了

删除操作和修改操作与上面的插入操作,代码完全相同,只不过构造的sql不一样

插入删除修改,返回值都是一个简单的整数,但是对于查询来说,返回值是一个简单的"临时表"

public class JDBCDemo2 {
    public static void main(String[] args) throws SQLException {
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java?characterEncoding=utf-8&useSSL=false");
        ((MysqlDataSource) dataSource).setUser("root");
        ((MysqlDataSource) dataSource).setPassword("123456");
        Connection connection = dataSource.getConnection();
        String sql = "select * from student";
        PreparedStatement statement = connection.prepareStatement(sql);

        //执行查询操作,要使用 executeQuery,返回值是一个 ResultSet 类型的对象,表示了一个"表格"
        ResultSet resultSet = statement.executeQuery();
        //遍历结果集合
        while(resultSet.next()){
            //获取到这一行的学号列
            int id = resultSet.getInt("id");
            //获取到这一行的姓名列
            String name = resultSet.getString("name");
            System.out.println("id = "+id+", name = "+name);
        }
        resultSet.close();
        statement.close();
        connection.close();

    }
}

实现动态查找

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

import javax.sql.DataSource;
import javax.xml.transform.Result;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;

public class JDBCDemo2 {
    public static void main(String[] args) throws SQLException {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入要查询学号 :");
        int studentid = scanner.nextInt();
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java?characterEncoding=utf-8&useSSL=false");
        ((MysqlDataSource) dataSource).setUser("root");
        ((MysqlDataSource) dataSource).setPassword("123456");
        Connection connection = dataSource.getConnection();
        String sql = "select * from student where id=?";
        PreparedStatement statement = connection.prepareStatement(sql);
        statement.setInt(1,studentid);

        //执行查询操作,要使用 executeQuery,返回值是一个 ResultSet 类型的对象,表示了一个"表格"
        ResultSet resultSet = statement.executeQuery();
        //遍历结果集合
        while(resultSet.next()){
            //获取到这一行的学号列
            int id = resultSet.getInt("id");
            //获取到这一行的姓名列
            String name = resultSet.getString("name");
            System.out.println("id = "+id+", name = "+name);
        }
        resultSet.close();
        statement.close();
        connection.close();

    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值