Java的JDBC编程<-----用Java代码操作数据库(MySQL数据库)

小编学习的是MySQL数据库,是在客户端进行操作的,但是真正在企业/公司里面操作数据库的时候,99.99999% 的情况下都是通过代码来操作的,很少会在客户端里输入sql语句(你的系统执行了10W次,也不一定会手动敲一次sql),那么,接下来的本篇文章,Java的JDBC编程主要讲解的就是:用Java代码操作数据库~注意啦注意啦~

市场上常见的几个数据库,如:MySQL,Orcale,SQL Server 在开发的时候,就会提供一组编程接口(API),所谓的API就是指:给你一个软件/程序,你能对他干啥??(代码层次)基于他提供的这些功能,就可以写一些其他代码~

如:一个新妹子:

一个新妹子:

  1. 微信聊天
  2. 发自拍照
  3. 一起吃饭
  4. 一起喝咖啡

基于这些功能,写了一个程序,度过美好的一天

当妹子进化为女朋友以后~~

  1. 微信聊天
  2. 发自拍照
  3. 一起吃饭
  4. 一起喝咖啡
  5. 拉小手
  6. 抱抱
  7. ~~~~~

基于这些功能,有可以度过另一天~~

上述跟妹子在一块干的事情(吃饭,聊天,自拍照,喝咖啡,拉手,抱抱~~~~,就是API,所谓的API,对于程序员来说,API往往就是以“函数“,”方法“,”类“的形式来提供的(不是自己实现的,是人家哪些库(程序)提供的,基于函数,API对程序进行各种操作,来度过美好的一天~~

但是,这些数据库:MySQL,Orcale……所提供的API是不一样的(有人的地方就有江湖)总体的差别不大(细节有一定影响)

Java程序员要想进行数据库开发,就需要在你的项目中导入对于数据库的驱动包,才能编写代码~

那么,如何在数据库中导入驱动包呢??

  1. 创建个Java项目
  2. 驱动包从哪里来??(驱动包是厂商提供的)
  • MySQL的官方网站获取(下策)MySQL被Orcale收购了以后,官网也被合并了,难用~
  • GitHub(需要翻墙)
  • Maven的中央仓库获取

Maven相当于手机的应用商店,中央仓库相当于服务器,因此,在应用商店托管了各种软件程序包,通过应用商店,就可以访问到软件程序包,下载下来~~

https://mvnrepository.com

Maven官方网站:

需要注意的是:数据库服务器是5系列,此次的驱动包也得是5系列(大版本不要错,小版本无所谓)

.jar是Java发布程序的典型方式;

Java通过.java源文件编译成.class文件,JVM来解释执行.class

每一个.java都一一对应一个.class,如果代码里.java 非常多呢?

把一大堆的.class给打压缩包(类似于.rar,.zip),把.jar拷贝给对方,对方就可以之间使用JVM执行了~

此处MySQL驱动包的这个.jar不是单独运行的.jar,可以把他导入到咱们的项目;如何就可以调用其中的方法和类进行编程了~

操作过程:

  1. 把.jar复制到idea中(不需要解压缩,idea自动帮你解压缩)(每次创建项目都得这么干)
  2. 把这个目录(.jar放入的)标记成项目的库(右键,Add as library…,确定,通过这样,idea就能识别这个目录里的.jar包,从而就可以调用里面的类来写代码了~~)

下面我们来看一下最重要的部分:编写JDBC代码吧~~

JDBC需要通过一下步骤来完成开发~

  1. 创建并初始化一个数据源
  2. 和数据库服务器建立连接
  3. 构造sql语句
  4. 执行sql语句
  5. 释放必要的资源

在上面的五个步骤中,看起来很麻烦,但是实际上却是非常简单,主要还是在于刚刚接触这一块,会觉得有点饿麻烦,涉及到新的类,新的方法,新的概念……,但是多写几次就会发现,这里的代码满满的都是套路~~

正是因为套路多了,实际开发中就会使用一些框架来简化数据库操作代码(MyBatis这样的框架就是如此),但是不能光会框架,也得知道框架背后的操作,对原生JDBC有理解(框架一直在变,JDBC是不变的!!!)

1.创建并初始化一个数据源

数据源:数据的源头,指数据从哪里来!!(描述数据库服务器在哪里)

用DataSource接口

DataSource  dataSource =new MysqlDataSource();  //向上转型
               父类引用指向子类对象

明确数据库所在的位置(向下转型转回来)

((MysqlDataSource)dataSource).setUrl();

setUrl()这个方法是子类有的,父类没有的方法,要想使用,就需要把父类转回成子类引用(向下转型)

URL:计算机里的一个常见术语

唯一资源定位符,描述网络上的某个资源所在的位置(格式非常有特点)

"jdbc:mysql://127.0.0.1:3306/java12?characterEncoding=utf8&useSSL=false"
                                                          &注意区分
在后续HTTP会讲到:千万不要背,容易被错(放到电脑一个随手能找到的地方)

在上述的代码中:

jdbc是固定的

mysql看你用啥数据库

127.0.0.1:IP地址( 网络上确定主机的位置就是通过IP地址来确定的!!)

                MySQL数据库是一个”客户端服务器“结构的程序,客户端和服务器之间通过网络  来通信;都写作127.0.0.1叫做环回IP,表示你自己当前主机

咱们的数据库客户端(现在写的jdbc代码)和数据库服务器(之前装存数据的服务)是在一个主机上!(若是客户端和服务器在不同的主机上,IP就得变变了~)

3306:端口号

           端口来区分应用程序,数据库服务器默认端口就是3306

java12:数据库名

            create  database  数据库名;

characterEncoding = utf8:参数,字符集使用utf8

SSL:是一个加密协议(SSL=false:不加密)

上面的这个我们也可也理解为:

"jdbc:mysql://127.0.0.1:3306/java12?characterEncoding=utf8&useSSL=false"
山大 :18号窗口 / 熏肉大饼?口味=微辣&葱=少葱&香菜=要

简单的个人理解,仅供参考~

设置用户名:

((MysqlDataSource)dataSource).setUser("root");
用户名都是root(默认就是root)

设置密码:

((MysqlDataSource)dataSource).setPassword("123456");
此处的123456是指安装数据库的时候,自己设定的密码

这些代码只是设置数据源,描述数据库服务器在哪!!还没真正和数据库服务器连接~!!

2.和数据库服务器建立连接

dataSource.getConnection();
会抛异常(SQLException)

用变量接收返回的结果
Connection  connection = dataSource.getConnection();
(java.sql类下)

3.构造sql语句

String  sql ="insert into student value(1,"张三");

即使咱们使用代码来操作数据库,还是靠sql语句,只不过是换成用代码来构造sql,前面sql的各种语法仍然有效

当然,光有sql语句还不够,需要有准执行项来包裹sql语句

PreparedStatement  statement = connection.preparedStatement(sql);
使用PreparedStatement提前预编译一下SQL

4.执行sql语句

int ret =statment.exeuteUpdate();
返回类型为int,表示影响到的行数
System.out.println("ret = "= ret);

把sql语句(预编译过的)发送给数据库服务器,由服务器做出响应

insert
delete  ----->> executeUpdate------>>返回int,表示影响到的行数
update


select----->>executeQuery  有点饿复杂(后面怎请考虑)

5.释放必要的资源

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

经过上述的分析,我们来简单的看一下总体的代码:

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 JDBC_Insert {
    public static void main(String[] args) throws SQLException {
        //JDBC需要通过一下步骤来完成开发
        //1.创建并初始化一个数据源
        DataSource dataSource=new MysqlDataSource();
        ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java107?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("123456");
        //123456是自己设置的MySQL登录密码
        //2.和服务器建立联系
        Connection connection=dataSource.getConnection();
        //3.构造sql语句
        String sql="insert into student value(1,'张三')";
        PreparedStatement statement=connection.prepareStatement(sql);
        //4.执行sql语句
        int ret=statement.executeUpdate();
        System.out.println("ret = "+ ret);

        //5.释放必要的资源
        statement.close();//先释放语句
        connection.close();//后释放连接
        //先创建的后释放(顺序不能变)

    }
}

值得注意的是:在上述的代码中:3.构造SQL 语句给写死了~~不知道大家有没有注意到,反正小编倒是感觉出来不得劲了~

        //3.构造sql语句
        String sql="insert into student value(1,'张三')";
        PreparedStatement statement=connection.prepareStatement(sql);

在这个构造sql语句中,要插入的数据是写死的(硬编码)不好

其实更合适的做法是:把数据通过其他方式让用户输入(比如通过控制台)

做法1:我们可以在代码的开头部分创建一个输入:

        Scanner scanner=new Scanner(System.in);

从而由:3.从控制台中读取用户的输入内容(下策

        //3.从控制台读取用户的输入内容
        System.out.println("请输入学生姓名:");
        String name=scanner.next();
        System.out.println("请输入学号:");
        int id=scanner.nextInt();
        //3.构造SQL语句
        String sql="insert into student value("+ id+ ",'"+name+ "')";
        PreparedStatement statement=connection.prepareStatement(sql);

通过这种方式确实可以完成用户动态输入数据的效果,但是这种写法特别丑,可读性差,容易出错(不建议这样写,仅做了解即可

做法2:使用PreparedStatement的拼装功能来实现(更好的写法

        //3.从控制台读取用户的输入内容
        System.out.println("请输入学生姓名:");
        String name=scanner.next();
        System.out.println("请输入学号:");
        int id=scanner.nextInt();
        //4.构造SQL语句
        String sql="insert into student value(?,?)";
        // ? 问号:占位符
        PreparedStatement statement=connection.prepareStatement(sql);
        statement.setInt(1,id);//把第一个?(问号)替换为id
        statement.setString(2,name);//把第二个?(问号)替换为name
        //通过setInt , strString将占位符替换为指定的值
        System.out.println(statement);
        //打印,打印需要加到拼接数据之后
        

值得注意的是:打印需要加到拼接数据之后,如果在上述的过程中,执行的代码结构出错了,就可以把statement打印出来,看看哪里有语法错误或者也可以直接把这个sql拷贝到控制台中执行~~

那么,此时比较完整(合理)的代码如下:

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

import javax.sql.DataSource;
import java.awt.print.PrinterAbortException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;

public class JDBC_Insert {
    public static void main(String[] args) throws SQLException {

        Scanner scanner=new Scanner(System.in);

        //JDBC需要通过一下步骤来完成开发
        //1.创建并初始化一个数据源
        DataSource dataSource=new MysqlDataSource();
        ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java107?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("zhao05306910a");
        //2.和服务器建立联系
        Connection connection=dataSource.getConnection();

        //3.从控制台读取用户的输入内容
        System.out.println("请输入学生姓名:");
        String name=scanner.next();
        System.out.println("请输入学号:");
        int id=scanner.nextInt();
        
        //4.构造SQL语句
        String sql="insert into student value(?,?)";
        // ? 问号:占位符
        PreparedStatement statement=connection.prepareStatement(sql);
        statement.setInt(1,id);//把第一个?(问号)替换为id
        statement.setString(2,name);//把第二个?(问号)替换为name
        //通过setInt , strString将占位符替换为指定的值
        System.out.println(statement);
        //打印,打印需要加到拼接数据之后
        
        //5.执行sql语句
        int ret=statement.executeUpdate();
        System.out.println("ret = "+ ret);
        
        //6.释放必要的资源
        statement.close();//先释放语句
        connection.close();//后释放连接
        //先创建的后释放(顺序不能变)

    }
}

经过上述的一个简单讲解,想必老铁也能看懂如何插入数据了吧~

那么,我们来实现一个查询操作

对于查询来说,返回的结果不是单纯的int了,而是ResultSet对象

具体的过程如下:

  1. 创建并初始化数据源
  2. 建立连接
  3. 构造sql
  4. 执行sql
  5. 遍历结果集合
  6. 释放资源

那么我们来看一下具体的代码吧~

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

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

public class JDBC_Select {
    public static void main(String[] args)  throws SQLException {
        //1.创建并初始化数据源
        DataSource dataSource=new MysqlDataSource();
        ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java107?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("zhao05306910a");
        //2.建立连接
        Connection connection=dataSource.getConnection();
        //3.构造SQl
        String sql="select * from student";
        PreparedStatement statement=connection.prepareStatement(sql);
        //4.执行sql
        ResultSet resultSet=statement.executeQuery();
        //5.遍历结果集合
        while (resultSet.next()){
            //把resuletSet想象成一个表格,同时表格这里有光标
            //初始情况下光标指向最上面(表格最上面一行的上面~)
            //每次使用next,光标往下走一行,然后返回true(当光标已经将整个表都遍历完了,就会返回fales)
            //当光标指向某一行的时候,getXXX来获取当前这行里的数据
            int id=resultSet.getInt("id");
            String name=resultSet.getString("name");
            System.out.println("id = "+id +"name +"+name);
            //getXXX是取出这一行的指定列的值,使用的方法要和列的类型匹配
        }
        //释放必要的资源
        resultSet.close();
        statement.close();
        connection.close();
    }
}

关于:Java的JDBC编程<-----用Java代码操作数据库(MySQL数据库)大致就讲完了,那么有错误的地方,请各位老铁及时评论~~

猜你喜欢

转载自blog.csdn.net/weixin_64308540/article/details/132652383