JDBC+MySQL入门增删改查案例(上)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: hello我是bigsai,今天咱们进行JDBC+MySQL实战,非常适合初入门的小伙伴打开新的世界。实现一个增删改查(curd)的例子。有用的话先点赞再观看、帅哥靓女养成好习惯!没用再把小赞赞回收也不迟嘿嘿

前言



hello我是bigsai,今天咱们进行JDBC+MySQL实战,非常适合初入门的小伙伴打开新的世界。实现一个增删改查(curd)的例子。有用的话先点赞再观看、帅哥靓女养成好习惯!没用再把小赞赞回收也不迟嘿嘿


在这个案例进行之前,你要确保自己电脑上拥有MySQL和IDEA编译器,另外还要安装MySQL数据库连接管理工具Navicat。方能进行以下的操作。


如果以前没见过或者使用过也不要紧,本课程提供傻瓜式教学你只需跟着我的要求来包成功包会。


通过本翩你可以掌握以下内容:


  • MySQL数据库的创建
  • JDBC+MySQL项目的创建
  • JDBC成功对MySQL增删改查


案例分析



本次案例到底是个什么结果呢?本案例实现一个学生信息的管理,即学生个人信息的增删改查。


核心思路拆解


我们该如何设计这个项目呢?


别急别急,听我慢慢说道。对于本案例的实战,旨在实现用Java语言(JDBC)操作MySQL,核心的主轴是MySQL的数据,所以我们从MySQL为起始点入手,整个案例实现的流程大致可以分为:


  • 分析设计需求、创建MySQL数据库和表
  • 创建Java项目,添加JDBC以及Junit单元测试的依赖
  • 编写项目代码,实现JDBC增删改查案例
  • 单元测试


而对于JDBC编程来说,它需要与MySQL进行连接交互,它也有一定流程顺序需要遵守,通常为以下6个流程:


  • 1:注册驱动 (仅仅做一次)
  • 2:建立连接(Connection)
  • 3:创建运行SQL的语句(Statement)
  • 4:运行语句
  • 5:处理运行结果(ResultSet)
  • 6:释放资源


案例涉及知识点


本案例主要涉及的知识点为MySQL和JDBC。而这两个知识点是Java Web开发非常常用的技术,下面我就给你介绍一番。


MySQL


MySQL是当前非常流行的数据库之一,且免费开源,数据库是用来储存数据的,就数据格式而言,有关系型数据和非关系型数据,MySQL是一种关系型数据库。就web方面,MySQL是最好的RDBMS**(关系数据库管理系统:Relational Database Management System)**之一:MySQL的sql语句是常用关系数据库的标准之一,具有速度快、体积小、成本低等优势,是中小企业以及学习使用的最好方式之一。


在Java中利用JDBC可以快速在应用中使用MySQL。除了DDL**(数据库模式定义语言:Data Definition Language)和DML(数据操纵语言:Data Manipulation Language)**等传统操作外,你可以通过JDBC使用MySQL的大部分功能。并且MySQL提供索引优化查询速度,利用B+树或哈希方式的索引满足不同场景查询性能的要求。还提供视图、函数、约束、触发器等功能能够使得数据库满足更多的场景使用。而MySQL提供的事务、回滚等机制能够使得数据在安全性一致性方面有更大的保证。


20200805005706336.png


JDBC


Java数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口(位于jdk的java.sql中)。我们通常说的JDBC是面向关系型数据库的,提供了诸如查询、更新、删除、增加数据库中数据的方法。在使用时候需要导入具体的jar包,不同数据库需要导入的jar包不同。


20200805111357270.png


而JDBC主要有以下API:


  • DriverManager:负责加载不同驱动程序(Driver),并根据不同的请求,向调用者返回相应的数据库连接(Connection)。
  • Driver:驱动程序,会将自身加载到DriverManager中去,并处理相应的请求并返回相应的数据库连接(Connection)。
  • Connection:数据库连接,负责与数据库进行通讯,SQL执行以及事务处理都是在某个特定Connection环境中进行的。可以产生用以执行SQL的Statement、PreparedStatement等。
  • **Statement:**用以执行SQL查询和更新(针对静态SQL语句和单次执行)。
  • PreparedStatement:用以执行包含动态参数的SQL查询和更新(在服务器端编译,允许重复执行以提高效率)继承Statement,本案例使用PreparedStatement。
  • **CallableStatement:**用以调用数据库中的存储过程。
  • **SQLException:**代表在数据库连接的建立和关闭和SQL语句的执行过程中发生了例外情况(即错误)。


我想现在你对MySQL和JDBC有了更清楚的认识吧,MySQL就是一个数据库供我们使用,而JDBC就是Java使用MySQL的一个工具和桥梁,结合上面知识,下面我们就开始实战吧!


第一关 创建数据库和项目



在实战之前,需要把数据库和项目创建好才能进行JDBC的增删改查。


创建数据库


我们使用Navicat创建数据库,你可能好奇Navicat到底是个什么样的工具,有何作用?


其实Navicat是一个数据库管理工具,它并不能直接修改MySQL的数据和结构,而是经过你的可视化界面操作它帮你执行sql代码,因为考虑到如果直接让你用sql操作数据库,可能不太直观并且上手难度挺大的,通过Navicat管理数据库可以清晰看到数据库结构、数据、设置情况也能够很容易的进行更改,大大提升开发效率一定程度减少错误。可以参考下图:


20200731121907437.png



打开Navicat连接数据库,连接成功的数据库右击创建数据库,数据库名称为:boxuegu,字符集和排序规则使用其默认即可。


20200730005952742.png


然后打开boxuegu数据库,在表的栏目右击新建表,设置id,name,age,high四个字段,其中id设为主键且自增。


20200730011246391.png


保存时候把这张表命名为student,代指学生表。这样,学生表就添加完成了。其中id为自增主键,插入的时候不插入id会自动递增插入,name就是学生的姓名,age表示学生年龄。high表示学生身高,我们用这几个字段表示一个学生信息情况。


当然,如果你不喜欢使用数据库管理工具进行这样操作,更喜欢控制台或者命令行创建数据库以及表格,当然也是可以的:


SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for students
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `students` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `age` int(11) NOT NULL,
  `high` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


这样我们数据库以及表就创建完成啦,我们下面就要用JDBC对MySQL的这张表进行增删改查实战。让你动手操作数据。


创建项目


我们创建java项目要引入JDBC的依赖,这里我为了更简单不让你去自己找JDBC的jar包,使用Maven的方式引入jar包,所以我们使用IDEA创建Maven项目。

首先打开IDEA,创建Maven项目,点击next。


20200731140107716.png


接着填写GroupId和ArtifactId可以自行填写,本案例填写com和JDBCTest,点击next。


20200731141253319.png


紧接着选择磁盘中一个文件夹作为项目的路径,点击finish项目即创建成功。接着我们需要添加MySQL的JDBC依赖以及Junit单元测试依赖,在项目pom.xml文件中添加以下内容:


<dependencies>
   <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
   <dependency>
       <groupId>mysql</groupId>
       <artifactId>mysql-connector-java</artifactId>
       <version>5.1.49</version>
   </dependency>
   <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
</dependencies>


然后项目就成功创建啦,紧接着创建以下类:


  • main的java目录下:sqlmanage类,用于编写sql相关语句
  • main的java目录下:student类,表示student实体与MySQL的student
  • test的java目录下:test类,用于编写单元测试。


有了JDBC的环境只需编写正确的代码即可运行!对于项目最终的目录是这样的:


20200805201321928.png


第二关 JDBC插入和查询



我们上面有讲过进行JDBC操作的6个步骤,但有些步骤不需要重复进行,比如加载驱动、建立连接、关闭等可以复用。此外,我们在项目中将MySQL中的数据和Java中的对象进行映射(即MySQL表中每一条记录可以生成一个Java对象),项目中函数的设计基于Java对象而非MySQL中数据字段,降低项目中各模块的耦合性。


预备工作


首先在student 类中编写以下内容,该类与MySQL数据库的student表对应。


public class student {
    private int id;//与student表得id对应
    private  String name;//与student表得name对应
    private int age;//年龄与student表得age对应
    private  int high;//身高与student表high对应
    //带id构造方法(查询时使用)
    public student(int id, String name, int age, int high) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.high = high;
    }
    //不带id得构造方法(插入时候使用)
    public student(String name, int age, int high) {
        this.name = name;
        this.age = age;
        this.high = high;
    }
    //toString()方法,控制台打印测试使用 
      @Override
    public String toString() {
        return "student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", high=" + high +
                "}\n";
    }
    //get set 方法,设置值,取值使用
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public int getHigh() {
        return high;
    }
    public void setHigh(int high) {
        this.high = high;
    }
}


紧接着处理sqlmanage类,我们将JDBC的一些操作封装到这里面。在初始化函数中进行注册驱动、建立连接的操作。在sqlmanage中编写以下内容:


import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class sqlmanage {
    private Connection con=null;//数据库连接,从DriverManager的方法获得,用以产生执行sql的PreparedStatement
    public sqlmanage() throws SQLException, ClassNotFoundException {
        //step1 加载数据库驱动
        Class.forName("com.mysql.jdbc.Driver");
        System.out.println("数据库驱动加载成功");
        //step2 连接数据库
        this.con =  DriverManager.getConnection("jdbc:mysql://localhost:3306/boxuegu?useSSL=false","root","bigsai66");
        System.out.println("数据库连接成功");
    }
    public void close() throws SQLException {
        this.con.close();;
    }
}


其中通过Connection建立连接,Connection是一个接口类。其功能是与数据库进行连接(会话)。建立Connection接口类对象:


Connection conn =DriverManager.getConnection(url, user, password);


其中url的格式要求为:


  • jdbc:mysql://<host>:<port>/<database_name>?property1=value1&property2=value2…
  • host为主机地址或者域名,本地可以用localhost或127.0.0.1.
  • database_name为MySQL中创建数据库名,本案例中数据库名为boxuegu。
  • property用来配置一些例如编码、时区等属性。


其中user为MySQL登录用户名,password为MySQL登录密码。


单个插入


MySQL插入的sql语句很简单:


insert into  表名
( 字段1, 字段2,...字段n)
value
( 值1, 值2,...值n );


我们JDBC中进行插入操作使用的sql满足上述规范,在sqlmanage中编写**insertStudent(student student)**函数用来插入单个学生记录,具体函数如下:


 public  void insertStudent(student student) throws SQLException {
        //创建sql语句
        String sql="insert into student(name,age,high)value(?,?,?)";
        //PreparedStatement能够对SQL语句进行预编译,这样防止了   SQL注入 提高了安全性。
        PreparedStatement ps = con.prepareStatement(sql);
        ps.setString(1,student.getName());
        ps.setInt(2,student.getAge());
        ps.setInt(3,student.getHigh());
        //执行 sql 因为这里插入操作就不对结处理
        ps.executeUpdate();
        ps.close();
    }



在test类中的编写**insertTest()**函数,用来测试插入三条学生的记录:


@Test
public void insertTest() throws SQLException, ClassNotFoundException {
      sqlmanage sqlmanage=new sqlmanage();
      sqlmanage.insertStudent(new student("bigsai",22,180));
      sqlmanage.insertStudent(new student("bigpian",21,165));
      sqlmanage.insertStudent(new student("doudou",20,160));
  }



执行完毕刷新navicat中student表你会发现数据被成功插入了:


20200802172355965.png


批量插入


如果同时有100组数据或者更多若干组数据让你插入你会怎么操作?


20200802215352409.png

批处理一次插入多个


20200802215700678.png

  • 批量处理相比循环的单个单个处理起来省了很多时间,提高了系统效率。所以当遇到较多数据时可以选择多个插入。


批量插入实现也很容易,在sqlmanage中编写**insertStudents(student students[])**函数用来批量插入学生记录:


 public void insertStudents(student students[]) throws SQLException {
        this.con.setAutoCommit(false);//不自动提交
        String sql="insert into student(name,age,high)value(?,?,?)";
        PreparedStatement ps =con.prepareStatement(sql);
        for(int i=0;i<students.length;i++)
        {
            ps.setString(1,students[i].getName());
            ps.setInt(2,students[i].getAge());
            ps.setInt(3,students[i].getHigh());
            ps.addBatch();
            if(i%1000==0)
            {
                ps.executeBatch();
            }
        }
        ps.executeBatch();
        con.commit();
        ps.close();
    }


其中:

  • con.setAutoCommit(false)意为不自动提交,因为我们在批量处理的时候一般手动提交提高效率。
  • 主要通过PreparedStatement对象的addBatch()进行多组插入而未提交。
  • 如果为设置不自动提交当执行executeBatch()时就会提交,但为了减小提交次数已经设置不自动提交。当且仅当con.commit()执行才会真的提交到MySQL中。


接着在test单元测试中编写insertStudentsTest()函数进行测试批量插入:


@Test
public void insertStudentsTest() throws SQLException, ClassNotFoundException {
    sqlmanage sqlmanage=new sqlmanage();
    student students[]=new student[5];
    for(int i=0;i<students.length;i++)
    {
        students[i]=new student("路人"+i,12,156);
    }
    sqlmanage.insertStudents(students);
}


执行完毕后你可以看到数据被成功插入MySQL中:


20200803003534315.png


查询数据


查询的使用频率要远比其他的操作多,虽然有些复杂表的查询可能会让人比较头疼,但基础的sql查询还是比较简单,其语法格式为:


select 字段1,字段2,…… from 表名 [where 条件] //方式1
select * from 表名 [where 条件] //方式2


其中如果没有where条件那么就默认查询整张表的内容,我们在这里根据此条件查询所有记录:查询返回年龄小于21岁的所有学生。


首先在sqlmanage中编写**getallstudent()**函数,用来查询student表中所有age小于21的记录,并把查询的数据最终以List<studnet>类型返回:


 public List<student> getallstudent() throws SQLException {
        List<student>list=new ArrayList<student>();//返回的结果
        String sql = "select * from student  where age < 21";
        PreparedStatement ps = con.prepareStatement(sql);
        ResultSet resultSet=ps.executeQuery();//结果集
        while(resultSet.next())//遍历
        {
            int id=resultSet.getInt(1);
            String name=resultSet.getString(2);
            int age=resultSet.getInt(3);
            int high=resultSet.getInt(4);
           list.add(new student(id,name,age,high));
        }
        ps.close();
        return list;
    }


在前面讲的插入的过程返回值其实不需要特别处理,因为返回是插入成功与否的消息,而在查询的步骤就要严格的跟着JDBC的6个步骤来—因为需要对返回的数据进行处理。我们主要通过ResultSet处理返回的数据。


在对ResultSet进行迭代遍历取值的过程中,通过getXXX(int index)的方法取值并自动转换为java对应的数据类型。而index为MySQL数据库表格列的编号,也是数据在ResultSet中的对应序列号。


通过上面的函数在test单元测试中编写selectTest() 测试函数在控制台打印从数据库中查询所有age小于21的记录:


@Test
public  void selectTest() throws SQLException, ClassNotFoundException {
    sqlmanage sqlmanage=new sqlmanage();
    List<student>list=sqlmanage.getallstudent();
    System.out.println(list.toString());
}


可以看到数据被成功查询:


20200805205151418.png

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
22天前
|
关系型数据库 MySQL Java
Servlet+MySQL增删改查 原文出自[易百教程] 转载请保留原文链接: https://www.yiibai.com/geek/1391
对于任何项目开发,创建,读取,更新和删除(CRUD)记录操作是应用程序的一个最重要部分。
62 20
|
2月前
|
Java 关系型数据库 MySQL
mysql5.7 jdbc驱动
遵循上述步骤,即可在Java项目中高效地集成MySQL 5.7 JDBC驱动,实现数据库的访问与管理。
422 1
|
2月前
|
关系型数据库 MySQL 数据库
Mysql学习笔记(四):Python与Mysql交互--实现增删改查
如何使用Python与MySQL数据库进行交互,实现增删改查等基本操作的教程。
73 1
|
2月前
|
关系型数据库 MySQL
MySQL表的增删改查(基础篇详细详解)
MySQL表的增删改查(基础篇详细详解)
50 5
|
2月前
|
SQL 分布式计算 关系型数据库
Hadoop-24 Sqoop迁移 MySQL到Hive 与 Hive到MySQL SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
Hadoop-24 Sqoop迁移 MySQL到Hive 与 Hive到MySQL SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
104 0
|
2月前
|
SQL 分布式计算 关系型数据库
Hadoop-23 Sqoop 数据MySQL到HDFS(部分) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
Hadoop-23 Sqoop 数据MySQL到HDFS(部分) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
48 0
|
2月前
|
SQL 分布式计算 关系型数据库
Hadoop-22 Sqoop 数据MySQL到HDFS(全量) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
Hadoop-22 Sqoop 数据MySQL到HDFS(全量) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
57 0
|
12天前
|
关系型数据库 MySQL 数据库
Python处理数据库:MySQL与SQLite详解 | python小知识
本文详细介绍了如何使用Python操作MySQL和SQLite数据库,包括安装必要的库、连接数据库、执行增删改查等基本操作,适合初学者快速上手。
82 15
|
6天前
|
SQL 关系型数据库 MySQL
数据库数据恢复—Mysql数据库表记录丢失的数据恢复方案
Mysql数据库故障: Mysql数据库表记录丢失。 Mysql数据库故障表现: 1、Mysql数据库表中无任何数据或只有部分数据。 2、客户端无法查询到完整的信息。
|
13天前
|
关系型数据库 MySQL 数据库
数据库数据恢复—MYSQL数据库文件损坏的数据恢复案例
mysql数据库文件ibdata1、MYI、MYD损坏。 故障表现:1、数据库无法进行查询等操作;2、使用mysqlcheck和myisamchk无法修复数据库。

推荐镜像

更多
下一篇
DataWorks