Java连接MySQL

2023-11-08

目录​​​​​​​

1 JDBC简介

2 使用 JDBC 连接数据库

2.1 使用流程

3 详细操作

3.1 导入 jar 包

4 通过 java 语言操作数据库

4.1 连接 Mysql 数据库

4.2 增、删、改、查操作

5 部分问题

5.1 数据库中文乱码问题

5.2 时区问题

5.3 数据库中存在空用户名情况

1 JDBC简介

JDBC:Java Database Connectivity 是一个独立于特定数据库管理系统,通用的 SQL 数据库存取和操作的公共接口,定义了一组标准,为访问不同的数据库提供了统一的途径。

JDBC 支持多种数据库,连通 Java 程序和数据库

2 使用 JDBC 连接数据库

2.1 使用流程

1、加载驱动,也就是数据库厂商提供的 jar 包,Java 程序和数据库的桥梁

2、创建 Connection 对象,连接 Mysql 数据库

3、创建 Statement 对象,由 Connection 产生,执行 SQL 语句

4、创建 ResultSet 对象,用来保存 Statement 执行后所产生的结果,将数据库记录映射成 Java 对象

3 详细操作

3.1 导入 jar 包

在项目中创建文件夹 libs (文件夹名字可以随意,并且也不一定需要创建文件夹,只是习惯而且比较规范),将 jar 包复制到文件夹中

 然后右键 jar 包,选择 ”添加为库“。

 或者选择 ”文件“ -> ”项目结构“ 

 选择 ”库“,点击 ”+“ 号,选择 ”java“,然后导入刚刚复制到项目的 jar 包

 然后点击确定即可。

4 通过 java 语言操作数据库

4.1 连接 Mysql 数据库

具体代码如下:

其中:serverTimezone=GMT%2B8 是用来消除时差。characterEncoding=utf8 是用来修改 java 程序与数据库数据连接时候的编码格式。
package com.mingfa.util;

import java.sql.*;

public class JDBCUtil {

    /**
    * 创建连接
    * return 连接实例
    */
    public static Connection getConnection(){
        //加载驱动
        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            //创建连接
            String url = "jdbc:mysql://localhost:3306/test1?serverTimezone=GMT%2B8&characterEncoding=utf8";
            String user = "root";
            String pwd = "000914";
            connection = DriverManager.getConnection(url, user, pwd);
        } catch (Exception e){
            e.printStackTrace();
        }
        return connection;
    }

    /**
    * 释放资源
    */
    public static void release(Connection connection,Statement statement,ResultSet resultSet){
        try {
            if(connection != null) connection.close();
            if(statement != null) statement.close();
            if(resultSet != null) resultSet.close();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }

}

4.2 增、删、改、查操作

package com.mingfa.test;

import com.mingfa.entity.Account;
import com.mingfa.util.JDBCUtil;

import java.sql.*;

public class Test {
    public static void main(String[] args) {
        delete(123);//删除
        update(123, "JDBC");//修改
        add("MySQL");//增加
        query();//查询
    }

    //删除
    public static void delete(Integer id){
        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;
        try {
            connection = JDBCUtil.getConnection();//得到数据库的连接
            //定义SQL语句
            String sql = "delete from account where id = "+id;
            //执行SQL
            statement = connection.createStatement();
            int i = statement.executeUpdate(sql);//受影响行数
            System.out.println(i);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //释放资源
            JDBCUtil.release(connection, statement, resultSet);
        }
    }

    //修改
    public static void update(Integer id,String name){
        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;
        try {
            connection = JDBCUtil.getConnection();//得到数据库的连接
            //定义SQL语句
            String sql = "update account set name = '"+ name +"' where id = "+id;
            //执行SQL
            statement = connection.createStatement();
            int i = statement.executeUpdate(sql);//受影响行数
            System.out.println(i);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //释放资源
            JDBCUtil.release(connection, statement, resultSet);
        }
    }

    //添加
    public static void add(String name){
        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;
        try {
            connection = JDBCUtil.getConnection();//得到数据库的连接
            //定义SQL语句
            String sql = "insert into account(name) values ('"+ name +"')";
            //执行SQL
            statement = connection.createStatement();
            int i = statement.executeUpdate(sql);//受影响行数
            System.out.println(i);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //释放资源
            JDBCUtil.release(connection, statement, resultSet);
        }
    }

    //查询
    public static void query(){
        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;
        try {
            connection = JDBCUtil.getConnection();//得到数据库的连接
            //定义SQL语句
            String sql = "select * from account;";
            //执行SQL
            statement = connection.createStatement();
            resultSet = statement.executeQuery(sql);
            //遍历集合
            while (resultSet.next()) {
                int anInt = resultSet.getInt("id");//这里的信息需要与数据库中对应列的信息一致,包括数据类型,列名。例如 int 类型,列名为 id。
                String string = resultSet.getString("name");//这里的信息需要与数据库中对应列的信息一致,包括数据类型,列名。例如 varchar 类型,列名为 name。
                Account account = new Account(anInt, string);
                System.out.println(account);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //释放资源
            JDBCUtil.release(connection, statement, resultSet);
        }
    }
}

利用 PreparedStatement 进行数据库语言的建立,可以提高程序与数据库交互时候的安全性,防止发生 sql 注入 

eq:数据库的查询操作,其他操作是类似的,读者可以自己模仿

public static void login(String name,String pwd){
    Connection connection = null;
    PreparedStatement statement = null;
    ResultSet resultSet = null;
    try {
        connection = JDBCUtil.getConnection();
        //定义SQL语句
        String sql = "select * from user where name = ? and pwd = ?";
        //执行SQL
        statement = connection.prepareStatement(sql);
        //其中 1 代表 上述 sql 语句的第一个 ? ,同理,2代表第二个
        statement.setString(1, name);//name 为我们输入的参数,代表我们想要找到的数据
        statement.setString(2, pwd);//pwd 同上
        resultSet = statement.executeQuery();
        if (resultSet.next()) System.out.println("登录成功");
        else System.out.println("登录失败");
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        JDBCUtil.release(connection, statement, resultSet);
    }
}

5 部分问题

5.1 数据库中文乱码问题

报错提示为:报错Incorrect string value: ‘\xE5\xAD\x99\xE4\xBD\xB3...‘ for column ‘name‘ at row 1

或者数据库中中文显示 ??

原因可能是:

1、java 连接数据库的时候连接方式的编码格式问题。

解决方法:在url中加入 characterEncoding=utf8 即可。

eq:"jdbc:mysql://localhost:3306/test1?characterEncoding=utf8"。

2、在创建数据库或者数据表的时候选择了默认的编码格式,没有设置utf8。

解决方法:

若数据表还没有创建,则创建的时候加上 default charset = utf8;

eq:

若数据库还没有创建,则创建的时候也同样加上 default charset = utf8; 即可。

 若已经创建,则通过如下代码进行修改编码格式:

alter database test character set utf8;
alter table account2 character set utf8;
alter table account2 change name name varchar(10) character set utf8;

 其中 test 为数据库名、account2 为数据表名、name 为数据表中的列名。

5.2 时区问题

报错提示为:java.sql.SQLException: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized

解决方法:在url中加入 serverTimezone=GMT%2B8 

eq:"jdbc:mysql://localhost:3306/test1?serverTimezone=GMT%2B8"

5.3 数据库中存在空用户名情况

使用错误的密码,或者不适用账号密码也同样可以登录数据库或者连接数据库。

解决方法:

1、进入 mysql 的 bin 目录,在搜索框中输入 cmd 。或者通过 cmd 的 cd 指令跳转到 mysql 的 bin 目录也可以。

2、登录 mysql

3、输入 select * from mysql.user where user=' '; 进行查询,查看当前的数据

4、删除空用户名:use mysql;  delete from user where user = ' ';

5、重载权限表 flush privileges;­

6、重启服务 service mysqld restart

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java连接MySQL 的相关文章

  • 如何在Sequelize中设置查询超时?

    我想看看如何在 Sequelize 中设置查询的超时时间 我查看了 Sequelize 文档以获取一些信息 但我找不到我要找的东西 我发现的最接近的是 pools acquire 选项 但我不想设置传入连接的超时 而是设置正在进行的查询的超
  • Mysql 中 UNION 子句的替代方案

    我有两张桌子 表 a 表 b table a ID 1 2 3 4 5 7 table b ID 2 3 4 5 6 我必须得到这样的输出而无需UNION命令 ID 1 2 3 4 5 6 7 注意 我有一个联合解决方案 select fr
  • JAVA - Xuggler - 组合 MP3 音频文件和 MP4 电影时播放视频

    使用 JAVA 和 Xuggler 以下代码组合 MP3 音频文件和 MP4 电影文件并输出组合的 mp4 文件 我希望在合并音频和视频文件时应自动播放输出视频文件 String inputVideoFilePath in mp4 Stri
  • 如何模拟从抽象类继承的受保护子类方法?

    如何使用 Mockito 或 PowerMock 模拟由子类实现但从抽象超类继承的受保护方法 换句话说 我想在模拟 doSomethingElse 的同时测试 doSomething 方法 抽象超类 public abstract clas
  • 在 Netbeans 8 上配置 JBoss EAP 的问题

    我已经下载了 JBoss EAP 7 并正在 Netbeans 8 上配置它 我已经到达向导 实例属性 其中要求从选择框中选择 域 当我打开选择框时 它是空的 没有什么可以选择的 因此 完成 按钮也处于非活动状态 这使得无法完成配置 我通过
  • Java 中的“Lambdifying”scala 函数

    使用Java和Apache Spark 已用Scala重写 面对旧的API方法 org apache spark rdd JdbcRDD构造函数 其参数为 AbstractFunction1 abstract class AbstractF
  • 将古吉拉特语文本插入 MySQL 表会产生垃圾字符和不可读的文本

    我有三个 MySQL 表 我正在向其中插入古吉拉特语内容 当我插入两个表时 它们插入得很好并且可读 但在一个表中 它显示垃圾字符 不可读的文本 我怎样才能解决这个问题 MySQL 有每个表的字符集设置 http dev mysql com
  • Javafx过滤表视图

    我正在尝试使用文本字段来过滤表视图 我想要一个文本字段 txtSearch 来搜索 nhs 号码 名字 姓氏 和 分类类别 我尝试过在线实施各种解决方案 但没有运气 我对这一切仍然很陌生 所以如果问得不好 我深表歉意 任何帮助将不胜感激 我
  • IntelliJ - 调试模式 - 在程序内存中搜索文本

    我正在与无证的第三方库合作 我知道有一定的String存储在库深处的某个字段中的某处 我可以预测的动态值 但我想从库的 API 中获取它 有没有一种方法可以通过以下方式进行搜索 类似于全文搜索 full程序内存处于调试模式并在某个断点处停止
  • 有没有一种快速方法可以从 Jar/war 中删除文件,而无需提取 jar 并重新创建它?

    所以我需要从 jar war 文件中删除一个文件 我希望有类似 jar d myjar jar file I donot need txt 的内容 但现在我能看到从 Linux 命令行执行此操作的唯一方法 不使用 WinRAR Winzip
  • Jersey 客户端请求中未设置 Content-Length-Header

    我正在使用 Jersey Client 访问网络服务 如下所示 response r accept MediaType TEXT PLAIN TYPE header content length 0 post String class 其中
  • 将 Azure AD 高级自定义角色与 Spring Security 结合使用以进行基于角色的访问

    我创建了一个演示 Spring Boot 应用程序 我想在其中使用 AD 身份验证和授权 并使用 AD 和 Spring Security 查看 Azure 文档 我执行了以下操作 package com myapp contactdb c
  • Java中的Object类是什么?

    什么是或什么类型private Object obj Object http download oracle com javase 6 docs api java lang Object html是Java继承层次结构中每个类的最终祖先 从
  • javafx android 中的文本字段和组合框问题

    我在简单的 javafx android 应用程序中遇到问题 问题是我使用 gradle javafxmobile plugin 在 netbeans ide 中构建了非常简单的应用程序 其中包含一些文本字段和组合框 我在 android
  • FileOutputStream.close() 中的设备 ioctl 不合适

    我有一些代码可以使用以下命令将一些首选项保存到文件中FileOutputStream 这是我已经写了一千遍的标准代码 FileOutputStream out new FileOutputStream file try BufferedOu
  • 调整添加的绘制组件的大小和奇怪的摆动行为

    这个问题困扰了我好几天 我正在制作一个特殊的绘画程序 我制作了一个 JPanel 并添加了使用 Paint 方法绘制的自定义 jComponent 问题是 每当我调整窗口大小时 所有添加的组件都会 消失 或者只是不绘制 因此我最终会得到一个
  • 在 RESTful Web 服务中实现注销

    我正在开发一个需要注销服务的移动应用程序 登录服务是通过数据库验证来完成的 现在我陷入了注销状态 退一步 您没有提供有关如何在应用程序中执行身份验证的详细信息 并且很难猜测您在做什么 但是 需要注意的是 在 REST 应用程序中 不能有会话
  • 将第三个表链接到多对多关联中的桥接表

    设计这个数据库的正确方法是什么 这是我设置表格的方式 我在名为 教师 的表和名为 仪器 的表之间存在多对多关系 然后我有一个连接两者的桥接表 我想将另一个表与 BRIDGE 表关联起来 意思是乐器 老师的组合 该表有 3 行 指定老师可以教
  • GUI Java 程序 - 绘图程序

    我一直试图找出我的代码有什么问题 这个想法是创建一个小的 Paint 程序并具有红色 绿色 蓝色和透明按钮 我拥有我能想到的让它工作的一切 但无法弄清楚代码有什么问题 该程序打开 然后立即关闭 import java awt import
  • 如何修复:“无法解析类型 java.lang.CharSequence。它是从所需的 .class 文件间接引用的”消息? [复制]

    这个问题在这里已经有答案了 我正在尝试使用这个字符串 amountStr amountStr replace replace replace 但我收到一条错误消息 我知道我收到的错误消息是因为我刚刚发布的字符串已过时 所以我想知道该字符串的

随机推荐

  • switch语句

    switch语句格式 格式 switch 表达式 case值1 语句体1 break case值2 语句体2 break default 语句体n 1 break 执行流程 首先计算表达式的值 依次和case后面的值进行比较 如果有对应的值
  • RabbitMQ 队列消息的条数限制、队列字节长度限制、队列溢出行为方式

    目录 队列长度限制 默认最大队列长度限制行为 队列溢出行为 使用配置定义最大队列长度 在声明队列期间使用 x arguments 定义最大队列长度 重点阅读即可 队列长度限制 概述 队列的最大长度可以限制为一组消息数或一组字节数 忽略消息属
  • (C语言)使用函数输出指定范围内的Fibonacci数 (20分)

    本题要求实现一个计算Fibonacci数的简单函数 并利用其实现另一个函数 输出两正整数m和n 0
  • 程序员幸福感拉满:一键为代码自动生成注释的工具,拿走不谢!

    提升程序员幸福感的CodeGeeX代码解释功能上线了 一个 古老的传说 程序员最讨厌的2件事 一是编写程序时要写注释 二是看别人编写的程序里没写注释 可见 手动为代码添加注释 需要投入大量的时间和精力 但是 学会注释又是编码过程中不可或缺的
  • vue富文本编辑器vue-quill-editor安装及使用

    一 vue项目中 npm安装依赖 npm install vue quill editor save 二 两种引用方法 全局引用和局部引用 1 全局引用 项目入口文件中 main js 注册 Author pcf pcf Date 2022
  • 去除 QListWidget的selected item的长方形边框focus rectangle--委托

    QListWidget change color of selected item focus rectangle 视图中元素的绘制是通过代理实现的 在显示QListWidget的时候 如果我们在iconMode或者listMode显示QL
  • 前端Css@media设备媒体查询大全

    移动端设备 media max width 575px 移动端设备 横屏 低分辨率 media min width 576px and max width 767px iPad 平板设备 and 移动端设备 横屏 高分辨率 media mi
  • utf8转gb2312精简版

    var strGB 啊阿埃挨哎唉哀皑癌蔼矮艾碍爱隘鞍氨安俺按暗岸胺案肮昂盎凹敖熬翱袄傲奥懊澳芭捌扒叭吧笆八疤巴拔跋靶把耙坝霸罢爸白柏百摆佰败拜稗斑班搬扳般颁板版扮拌伴瓣半办绊邦帮梆榜膀绑棒磅蚌镑傍谤苞胞包褒剥薄雹保堡饱宝抱报暴豹鲍爆杯碑悲卑
  • linux强制安装rpm包的命令

    rpm ivh rpm nodeps force 强制安装会忽略掉所有依赖关系 强制进行安装 转载于 https www cnblogs com Noul p 10523090 html
  • 机器学习实战——第四章(分类):朴素贝叶斯

    前言 首先感谢博主 Jack Cui 主页 http blog csdn net c406495762 朴素贝叶斯博文地址 https blog csdn net c406495762 article details 77341116 ht
  • 在Ubuntu上用命令行安装Chrome浏览器

    1 下载谷歌浏览器 通过使用Ctrl Alt T键盘快捷键或单击终端图标来打开终端 使用wget下载最新的Chrome deb软件包 wget https dl google com linux direct google chrome s
  • 小程序自动化测试框架Minium——框架介绍和环境搭建

    一 Minium 简介 minium 是微信团队为小程序专门开发的自动化框架 我们可以用它来做小程序的UI自动化测试 但是它的能力却不仅仅在于UI自动化 正是得益于官方订制打造 所以对于小程序很多原生内容和特性的支持自然也是非常独到的 比如
  • 重点必考题:区块链百万年薪人才招聘,必会这58个知识点

    2018年区块链行业热度不减 投资人青睐 创业者追捧 而区块链人才成了稀缺性物种 拉勾网发布的 2018年区块链高薪清单 中 腾讯 阿里等大厂将区块链岗位的月薪最高开到了100K 有相关数据统计 2月份北京区块链岗位增加了3万多个 技术类2
  • ovirt简介

    Ovirt 调研 简介 架构 功能模块和列表 虚拟化所用的技术 kvm 是否支持分布式存储以及所用的技术 支持 gluster 虚拟网络能够实现哪些功能 VLAN 在虚拟机上最小化部署一套 简介 oVirt是一种开源分布式虚拟化解决方案 旨
  • wang_ys121账号停用及博客迁移至wonyoungsen的说明!

    从今天起 本账号wang ys121停止使用 不再更新博文 并将此账号博文逐步迁移到新的账号wonyoungsen中去 请喜欢我的同学继续关注我 谢谢
  • 远程链接redis遇到的坑

    1 安装redis参考 https cloud tencent com developer article 1653709 安装完后一直无法启动redis Dec 28 13 12 05 hecs 22391 systemd 1 Start
  • 【可视化开发】echarts点击事件

    echarts提供了点击事件方法 首先需要确定点击的范围 以横向柱状图为例 若不设置属性 添加点击事件后默认为柱型 设置可点击属性 需添加以下配置 yAxis 其余属性 silent false 坐标轴是否是静态无法交互 triggerEv
  • linux 中 安装 redis

    cd usr mkdir redis cd redis wget http download redis io releases redis 3 2 4 tar gz tar xzf redis 3 2 4 tar gz cd redis
  • PyTorch 矩阵乘法的方法总结 & 问题解答

    在机器学习和深度学习中时 矩阵运算是最常见 有效提高计算效率的方法 因为特征和权重都以向量储存 矩阵运算就显得尤为重要 诸如梯度下降 反向传播 矩阵因子分解等重要的机器学习方法 都需要基于矩阵运算 在深度学习中 神经网络将权重储存在矩阵当中
  • Java连接MySQL

    目录 1 JDBC简介 2 使用 JDBC 连接数据库 2 1 使用流程 3 详细操作 3 1 导入 jar 包 4 通过 java 语言操作数据库 4 1 连接 Mysql 数据库 4 2 增 删 改 查操作 5 部分问题 5 1 数据库