JDBC连接MySQL数据库基本操作

Posted FingerDance

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JDBC连接MySQL数据库基本操作相关的知识,希望对你有一定的参考价值。

哈喽~大家好,我是wave,今天给大家带来一篇文章介绍如何使用JDBC连接mysql数据库,赶紧来看看吧~

为什么要用数据库

  • 不知道有没有人有这样一个疑惑,为什么要使用数据库保存数据呢?

首先我们开发的项目,如果数据没有存放在文件或者数据库中,仅仅是放在Map或者是某个集合中,那么程序重启之后这些数据就没有了。所有会有一个数据持久化的问题,也就是这些数据需要永久被保存在某个地方。

为什么不把数据放在文件中呢?文件也可以达到数据的持久化呀?

我们从数据库的发展历程来看一看,数据的管理一共经历了三个阶段:人工管理阶段,文件管理阶段,数据库管理阶段。所以使用数据库不使用文件是历史发展的必然。因为文件管理数据会有大量冗余数据、共享性差、独立性差的问题,所以文件管理的数据就逐渐被数据库管理数据取代了。

准备数据库

本次我们使用的是MySQL数据库,我电脑上的数据库版本是5.7的,目前可能也有很多人用的是8的,这两个版本在一些地方的配置会有所不同,不过我会在文中指出MySQL8需要的不同配置。

创建tb_person表

CREATE TABLE `tb_person`  (
  `name` varchar(100CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `sex` varchar(5CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `age` int(11NULL DEFAULT NULL,
  `id` int(11NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`USING BTREE
ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

在这个表中先插入几条数据方便操作

数据库初始数据

准备jar包

  • MyS QL版本5.1+的使用版本号5.1+的就可以了,我这里使用的是mysql-connector-java-5.1.45-bin.jar
  • MyS QL8.0+的使用8.0+的jar包就可以了
  • Maven仓库链接,大家可以在这个链接里面自行选择版本下载
  • 我们这次会使用到四个jar包,一个是 MyS QL的jar包,还有一个是用于测试的Junit包。另外两个hamcrest包属于Junit里面的依赖包。我们在项目上创建一个lib文件夹,然后把四个jar包都拷贝进去
JDBC连接MySQL数据库基本操作
jar包文件图

然后我们还需要一些配置,File->Project Structure-> Libraries-> + -> Java;然后找到lib文件夹,导入即可

JDBC连接MySQL数据库基本操作
导入jar

准备写代码

JDBC连接MySQL数据库基本操作
代码文件结构
  • Person就是对应数据库创建的实体类
  • PersonDao里面写操作数据库的代码
  • TestJdbc里面写测试的代码

添加

Person类

//对应数据库创建相应实体类
public class Person {
    private Integer id;
    private String name;
    private String sex;
    private Integer age;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

PersonDao

package com.wave.dao;

import com.wave.entity.Person;

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

public class PersonDao {

    public void add(Person person){
        //这个url表示我使用jdbc连接mysql数据库,地址为localhost,端口为3306,数据库名为test
        //mysql8需要写成jdbc:mysql://localhost:3306/test?serverTimezone=UTC&characterEncoding=utf8&useUnicode=true&useSSL=false
        String URL = "jdbc:mysql://localhost:3306/test";
        String USER = "root";
        String PASS = "gt1010992686";
        //与mysql连接的连接对象
        Connection conn = null;
        try {
            //加载数据库驱动,这里就是一个类加载的操作
            //mysql8需要把类的全限定名改成这个com.mysql.cj.jdbc.Driver
            Class.forName("com.mysql.jdbc.Driver");
            //获取连接
            conn = DriverManager.getConnection(URL,USER, PASS);
            //写sql语句
            String sql = "insert into tb_person(name,sex,age) values(?,?,?) ";
            //准备执行sql语句,这一步需要把参数写入pstmt类
            PreparedStatement pstmt = conn.prepareStatement(sql);
            //第一个参数是代表sql语句中第一个?
            pstmt.setString(1,person.getName());
            pstmt.setString(2,person.getSex());
            pstmt.setInt(3,person.getAge());
            //真正执行sql
            pstmt.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

这个类非常详细的介绍了如何使用JDBC操作数据库的步骤

public class TestJdbc {

    @Test//有这个注解就可以作为一个测试方法运行了
    public void testAdd(){
        PersonDao personDao = new PersonDao();
        //创建一个人
        Person person = new Person();
        person.setName("fingerDance");
        person.setSex("man");
        person.setAge(0);
        //调用之前写的add方法
        personDao.add(person);
    }
}
JDBC连接MySQL数据库基本操作
add结果

可以看到数据库就多出了一条数据了

修改

PersonDao中的update方法

public void update(Person person,Integer id){
        //这个url表示我使用jdbc连接mysql数据库,地址为localhost,端口为3306,数据库名为test
        //mysql8需要写成jdbc:mysql://localhost:3306/test?serverTimezone=UTC&characterEncoding=utf8&useUnicode=true&useSSL=false
        String URL = "jdbc:mysql://localhost:3306/test";
        String USER = "root";
        String PASS = "gt1010992686";
        //与mysql连接的连接对象
        Connection conn = null;
        try {
            //加载数据库驱动,这里就是一个类加载的操作
            //mysql8需要把类的全限定名改成这个com.mysql.cj.jdbc.Driver
            Class.forName("com.mysql.jdbc.Driver");
            //获取连接
            conn = DriverManager.getConnection(URL,USER, PASS);
            //写sql语句
            String sql = "update tb_person set name = ?,sex = ?,age = ? where id = ?";
            //准备执行sql语句,这一步需要把参数写入pstmt类
            PreparedStatement pstmt = conn.prepareStatement(sql);
            //第一个参数是代表sql语句中第一个?
            pstmt.setString(1,person.getName());
            pstmt.setString(2,person.getSex());
            pstmt.setInt(3,person.getAge());
            pstmt.setInt(4,id);
            //真正执行sql
            pstmt.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                //关闭连接
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

Test中的testUpdate

 @Test
    public void testUpdate(){
        PersonDao personDao = new PersonDao();
        //创建一个人
        Person person = new Person();
        person.setName("fingerDance");
        person.setSex("woman");//与之前不同了
        person.setAge(1);//与之前不同了
        //修改id为5的数据
        personDao.update(person,5);
    }
JDBC连接MySQL数据库基本操作
update结果
  • 可以看到数据确实变化了,但是我们看这个JDBC的代码有没有发现有一大块是重复的,比如URL、USER、PASS这种固定的参数,完全就是一模一样的。每次操作都写一遍代码冗余非常高。
  • 为了解决这种冗余,我们可以把重复的代码抽取出来封装成一个工具类,就可以减少冗余了。
  • 我们可以分析一个JDBC连接数据库的操作,我们会发现其实最关键的一步就是获取到与数据库的连接,也就是创建出Connection这个类,因为有这个Connection了我们就可以对数据库进行操作了。所以我们可以把获取Connection的重复代码抽取出来,成为一个DBUtil类。

DBUtil代码

public class DBUtil {
    //如果是mysql8一样要记得后面加一串参数
    public static final String URL = "jdbc:mysql://localhost:3306/test";
    public static final String USER = "root";
    public static final String PASS = "gt1010992686";
    //我们的目的就是需要这个conn
    private static Connection conn = null;
    static {

        try {
            Class.forName("com.mysql.jdbc.Driver");
            try {
                conn = DriverManager.getConnection(URL,USER,PASS);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
    //可以通过这个静态方法获取Conn
    public static Connection getConnection() {

        return conn;

    }

}

那我们后面的删除与修改操作就用DBUtil进行操作了

删除

PersonDao的delete方法

 public void delete(Integer id){
        //获取连接,是不是代码清爽了很多~
        Connection conn = DBUtil.getConnection();
        String sql = "delete from tb_person where id = ?";
        try {
            PreparedStatement pstmt = conn.prepareStatement(sql);
            pstmt.setInt(1,id);
            pstmt.execute();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

    }
 @Test
    public void testDelete(){
        PersonDao personDao = new PersonDao();
        personDao.delete(5);//删除id为5的数据
    }
JDBC连接MySQL数据库基本操作
delete结果

可以看到id为5的数据被删除了,而且PersonDao里面的delete方法也简短了非常的多

查询

PersonDao中的Select方法

public List<Person> select(){
        //获取连接
        Connection conn = DBUtil.getConnection();
        //编写sql语句
        String sql = "select * from tb_person";
        //使用一个集合存储从数据库中查询出来的数据
        List<Person> lists = new ArrayList<>();
        try {
            PreparedStatement pstmt = conn.prepareStatement(sql);
            //调用executeQuery获取一个结果集
            ResultSet resultSet = pstmt.executeQuery();
            //使用循环遍历结果集。resultSet.next()如果还有数据就会返回true,并且自动往后移动
            while (resultSet.next()){
                Person person = new Person();
                person.setId(resultSet.getInt("id"));//从结果集中取出数据
                person.setName(resultSet.getString("name"));
                person.setAge(resultSet.getInt("age"));
                person.setSex(resultSet.getString("sex"));
                //查询出来的数据放入lists中
                lists.add(person);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return lists;
    }

Test中的testSelect方法

@Test
    public void testSelect(){
        PersonDao personDao = new PersonDao();
        List<Person> list = personDao.select();
        //for语句打印List
        for (Person item : list){
            //记得给Person加上toString方法
            System.out.println(item);
        }
    }
select结果

查询操作相比于其他操作多一个RestultSet类,从数据库查询出来的数据就会放入到这个类里面。

ENDING

看完这篇文章希望大家可以熟练的对数据库进行一个CRUD操作,虽然目前公司基本都是在用Mybatis框架进行对数据库的操作,但其实Mybatis底层的类最终对数据库操作的类就是PreparedStatement这个类,所以认真了解JDBC的基础操作还是有必要的,毕竟基础才是最重要的。

本次分享就到这里结束了,如果你喜欢就点个赞吧~


往期推荐


扫描二维码

获取更多精彩

FingerDance




以上是关于JDBC连接MySQL数据库基本操作的主要内容,如果未能解决你的问题,请参考以下文章

jdbc学习一半的代码

java中使用jdbc连接数据库操作

JDBC操作MySQL

Spring练习,使用Properties类型注入方式,注入MySQL数据库连接的基本信息,然后使用JDBC方式连接数据库,模拟执行业务代码后释放资源,最后在控制台输出打印结果。

JDBC连接MySQL操作事务

关于mysql驱动版本报错解决,Cause: com.mysql.jdbc.exceptions.jdbc4Unknown system variable ‘query_cache_size(代码片段