IDEA使用JDBC连接MySQL数据库,看完就懂

Posted 极具浪漫主义色彩的菜鸟学习之路

tags:

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

要好好的

都会好起来的。

JDBC连接mysql数据库

1.使用MySQL jdbc连接器mysql-connector-java.jar。

1.首先从mysql官网下载mysql-connector-java.jar包到本地。
这里注意要和你本地的mysql数据库版本相匹配!

创建java项目,导入mysql-connector-java-8.0.13.jar包

2.加载驱动

有两种写法:

  1. 利用java.sql.DriverManager.registerDriver( )方法加载驱动。
DriverManager.registerDriver(new com.mysql.jdbc.Driver());

该方式不但强烈依赖数据库的驱动jar而且会导致驱动被重复注册2次。故,不建议使用

所以我们使用第二种,通过反射加载。

2.通过反射加载

 Class.forName("com.mysql.cj.jdbc.Driver");
  Class.forName("com.mysql.jdbc.Driver");

为什么会有两种呢?

这里请看这位博主的:
com.mysql.jdbc.Driver 和 com.mysql.cj.jdbc.Driver 的区别

3.创建链接

利用java.sql.Drivermanager类中的getConnection()方法与数据库建立连接。
语法如下:

DriverManager.getConnection(“jdbc:mysql://数据库地址:端口号/数据库名”,”用户名”, “密码”);

示例如下:

Connection connection = DriverManager.getConnection(“jdbc:mysql://localhost:3306/mydb”,”root”,123456);
String url="jdbc:mysql://localhost:3306/mydb";
String user="root";
String password="123456";
Connection connection=DriverManager.getConnection(url, user, password);
        

在该语法及其示例中,jdbc表示协议,mysql表示子协议,localhost代表数据库地址,3306表示端口号,
mydb表示要连接的数据库;第一个root表示用户名,第二个123456表示密码

DriverManager.getConnection()方法返回的是java.sql.Connection类型的对象。

4.创建statement对象

利用java.sql.Connection创建用于执行SQL语句的Statement。

示例如下:

Statement statement = connection.createStatement();

Connection的createStatement()方法返回的是实现java.sql.Statement接口的对象。java.sql.Statement接口用于操作SQL语句并返回相应的结果集

5.执行SQL语句

利用java.sql.Statement执行SQL语句,其常用方法如下:

execute(String sql )
该方法可以执行任意SQL语句。当且仅当执行select语句且有返回结果时该方法返回true, 其他情况下该方法返回false

executeUpdate(String sql )
该方法常用于执行DML( INSERT、UPDATE或DELETE)和DDL语句。执行DML语句时返回受SQL语句影响的行数,执行DDL语句时返回0

executeQuery( String sql)
该方法通常执行査询语句,执行后返回代表结果集的ResultSet对象
示例如下:

ResultSet  resultSet = statement.executeQuery(sql);

在该示例中statement.executeQuery( )方法返回的是实现java.sql.ResultSet接口的对象。

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

Connection connection = null;
Statement statement=null;
ResultSet resultSet=null;

connection = DriverManager.getConnection(url, user, pwd);
            //3.获取数据库操作对象
            statement = connection.createStatement();
            //4.执行SQl语句
            String sql = "insert into t_user(no,name,pwd) values (5,'iah','123')";
            //5.获取结果集 
            ResultSet  resultSet= statement.executeUpdate(sql);
            System.out.println(resultSet);
//释放资源
resultSet.close();
statement.close();
connection.close();

6.关闭资源

数据库资源非常宝贵,数据库允许的并发访问连接数量有限。因此,当数据库资源用完后切记释放资源。为了保证资源的释放,常在finally代码块中关闭与数据库操作相关的资源。

完整代码实列:

public class Student 
    private int studentID;
    private String studentName;

    public Student() 
    

    public Student(int studentID, String studentName) 
        this.studentID = studentID;
        this.studentName = studentName;
    

    public int getStudentID() 
        return studentID;
    

    public void setStudentID(int studentID) 
        this.studentID = studentID;
    

    public String getStudentName() 
        return studentName;
    

    public void setStudentName(String studentName) 
        this.studentName = studentName;
    

    @Override
    public String toString() 
        return "Student" +
                "studentID=" + studentID +
                ", studentName='" + studentName + '\\'' +
                '';
    


public class TestJDBC 
    public static void main(String[] args) 
        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;
        try 
            //加载驱动
            Class.forName("com.mysql.jdbc.Driver");
            //建立连接
            connection= DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb" , "root", "123456");
            //创建statement
            statement = connection.createStatement();
            String sql = "select * from student";
            //执行SQL
            resultSet = statement.executeQuery(sql);
            //处理结果
            while (resultSet.next()) 
                Student student = new Student();
                int id = resultSet.getInt("studentid");
                String name = resultSet.getString("studentname");
                student.setStudentID(id);
                student.setStudentName(name);
                System.out.println(student);
            

         catch (ClassNotFoundException e) 
            e.printStackTrace();
         catch (SQLException throwables) 
            throwables.printStackTrace();
            //关闭资源
        finally 
            if (resultSet != null) 
                try 
                    resultSet.close();
                 catch (SQLException e) 
                    e.printStackTrace();
                
                resultSet = null;
            

            if (statement != null) 
                try 
                    statement.close();
                 catch (SQLException e) 
                    e.printStackTrace();
                
                statement = null;
            

            if (connection != null) 
                try 
                    connection.close();
                 catch (SQLException e) 
                    e.printStackTrace();
                
                connection = null;
            

        

    




从现在做起,坚持下去,一天进步一小点,不久的将来,你会感谢曾经努力的你!

如果又出错的,请各位友友指正。

新人报到,各位友友们,给我个三联(点赞,关注,收藏)

看完就懂GD32替代STM32全过程记录

文章目录

【看完就懂】GD32替代STM32全过程记录

读完这一篇文章,你能获得的知识点:

  • GD32与STM32基本区别
  • STM32CubeMX程序修改后如何下载到GD32
  • GD32移植后一些外设的测试

一、前言

最近半导体行业出现的缺货浪潮,各种芯片价格飙升,像一些常用芯片如STM32F103C8T6,从去年的5块一片涨价到现在的65一片,涨幅17倍!!!在这种情况下,大家纷纷在找一些国产芯片来替代ST的芯片,而在国产中做的比较好的芯片就是兆易创新的GD32芯片了,我最近也本着学习的心态研究了一下GD32快速替换STM32的方式,使用GD32F303VCT6替换STM32F103VCT6,以此为例做一些记录分享给大家

二、GD32与STM32

  • 什么是GD32

GD32是由北京兆易创新开发的国产32位MCU,基于Arm Cortex- M3/M23/M4内核以及RISC-V内核的32位通用微控制器,与STM32相比,CPU主频更高,内存更多,外设更丰富。其众多产品是以STM32芯片为模板,基于STM32的底层寄存器地址进行正向研发,部分产品可以直接PIN TO PIN替代STM32的芯片,部分型号可以直接以STM32的程序做部分修改后直接烧入进GD32中运行,例如GD32E103、GD32F10x、GD32F30x都是和STM32F10x系列是完全PIN TO PIN兼容的,内部地址寄存器完全兼容,唯一区别只是内核不同,但在使用外设时影响不会很大,下面的文章我也围绕GD32替代STM32F10x系列的芯片展开叙述

  • GD32F10x/F30x和STM32F10x资源对比

选项GD32F10x系列特性GD32F30x系列特性STM32F10x系列特性
CPU及Flash特性高达108MHz主频 高达3M Flash 前256K Flash零等待高达120MHz主频 高达3M Flash 前256K Flash零等待72M主频,512KFlash
片内外设特性高达3个12位ADC; 高达2个12位DAC; 高达10个通用16位定时器,2个基本定时器和2个增强型定时器; 高达3个SPI、2个I2C、5个USART/UART、2个I2S、2个CAN、1个全速USBD、1个全速USBFS、1个以太网MAC高达3个12位ADC; 高达2个12位DAC; 高达10个通用16位定时器,2个基本定时器和2个增强型定时器; 高达3个SPI、2个I2C、5个USART/UART、2个I2S、2个CAN、1个全速USBD、1个全速USBFS、1个以太网MAC3个ADC,2个DAC,4个通用TIM,2个高级TIM,2个基本TIM,3个SPI,2个I2C,5个USART,1个USB,1个CAN,1个SDIO
其他特性36~144 PIN;具有SDIO模块;36~144 PIN 具有SDIO模块;36~144 PIN 具有SDIO模块;
  • GD32F10x/F30x与STM32F10x软硬件设计对比

相同点

  1. 芯片的型号命名方式相同,而且相同信号的引脚定义基本相同,具体命名规范如下

  1. 函数库文件基本相同:因为GD32正向研发,对于PIN TO PIN的芯片,内部寄存器地址和STM32完全相同,所以STM32的库文件编译后的文件可以直接下载

  2. 编译工具相同如keil、IAR都相同

不同点

  1. 工作电压有所不同,STM32的工作电压在2.0~ 3.6V或1.65~ 3.6V,GD32的工作电压在 2.6~3.6V,工作范围相对要窄。

  2. GD32F303/F103主频比STM32F103主频要高,适合一些更快的计算中

  3. GD32提高了相同工作频率下的代码执行速度,所以GD32的_NOP()时间比STM32更加短,所以不使用定时器做延时时要注意修改

  4. GD32的flash擦除时间要比STM32更长

  5. 功耗上GD32的功耗要相对高一点

  6. GD32的BOOT0必须接10K下拉或接GND,ST可悬空,这点很重要。

  7. RC复位电路必须要有,否则MCU可能不能正常工作,ST的有时候可以不要。

  8. GD的swd接口驱动能力比ST弱,可以有如下几种方式解决:
    a、线尽可能短一些;
    b、降低SWD通讯速率;
    c、SWDIO接10k上拉,SWCLK接10k下拉。

  9. GD对时序要求严格,配置外设需要先打开时钟,在进行外设配置,否则可能导致外设无法配置成功;ST的可以先配置在开时钟。

  10. 修改外部晶振起振超时时间,不用外部晶振可跳过这步。
    原因:GD与ST的启动时间存在差异,为了让GD MCU更准确复位(不修改可能无法复位)。

三、程序下载方法

在使用GD的标准库开发时,可以使用J-Link、DAP在编译器内可以进行下载程序和在线仿真

在使用STM32的库进行开发时,因为芯片不对应,无法进行仿真,但在程序验证之后可以直接移植到对于芯片PIN TO PIN的GD芯片之中,具体下载方式有通过J-LinkFlash或者GD-Link下载hex,或者跳过FlyMCU经过USB转TTL和串口1连接下载程序,还有一种跳过DFU下载这个我没有尝试过,下面我就具体讲一下J-Link下载和FlyMCU串口下载到GD32 (该下载方法对ST和GD都有效)

  • J-Link下载

准备条件:

  1. 首先我们有一个STM32F103VCT6的点灯工程hex,通过CubeMX配置,具体教程看我之前的文章:点灯链接,这里因为要移植到GD32,需要修改工程里面的HSE超时时间,具体位置在生成代码的如下位置,把值改大就行,不改大会影响复位正常运行!!!改完生成新的hex文件

  1. JFlashARM.exe软件

  1. J-Link连接电脑与GD32F303

操作步骤:

  1. 打开软件,点击设置,进入工程设置

  1. 设置下载模式,这里我用的SWD下载

  1. 设置下载的目标对象-STM32F103VCT6

  1. 设置Auto下载时的操作

  1. 设置完成回到主界面,点击open打开hex文件

  1. 点击连接,连接jlink和芯片

  1. 点击auto进行下载程序

  1. 下载后可能出现ERROR: Could not start CPU core. (ErrorCode: -1)报错,但是不影响,只要出现下面框选的内容就代表程序下载完成,出现报错可能的原因是因为我使用的M3内核程序下载到M4内核单片机,软件复位启动后会报错,但实际上已经自动复位完成了,如果不想出现报错,把auto里面最好一个选项取消勾选,就不会有报错了,但这样需要自己硬件复位程序。还有一个注意点,每次hex重新生成后需要重新再打开一次hex文件,可能是JFlash版本问题。

  • FlyMcu下载

准备条件:

  1. USB转TTL模块连接GD32单片机

  1. FlyMcu下载软件

  1. 一个STM32F103VCT6的点灯工程hex和上面的相同

操作步骤:

  1. 将USB转TTL与单片机串口1连接,同时保证两边共地,及USB转TTL的TX接PA10,RX接PA9,GND与GND连接VCC可接可不接,但如果接了电压要接到相同的,不要接错,接完将USB转TTL插到电脑上
  2. 打开FlyMcu,选择串口连接,波特率设置为115200,过高不稳定,过低下载慢,根据自己需求来

  1. 选择打开hex文件

  1. 选择STMISP,同时配置模式为不使用RTS和DTR,因为我的USB转TTL是直接连接到单片机串口1的,其他的模式需要配合一些电路设计,具体可以百度

  1. 将单片机的Boot0拉高Boot1拉低,原因(参考百度):这样设置启动方式为系统存储器启动方式,从系统存储器启动,该模式的启动程序功能是由厂家设置的。一般来说,这样的启动方式用的比较少。系统存储器是芯片内部一块特定的区域,GD32在出厂时,由GD在这个区域内部预置了一段BootLoader,也就是我们常说的ISP程序,这是一块ROM,出厂后无法改动。一般来说,我们选用这样的启动模式时,是为了从串口下载程序,由于在厂家提供的BootLoader中,提供了串口下载程序的固件,能够通过这个BootLoader将程序下载到系统的Flash中。该下载方式须要下面步骤:

    1. 将BOOT0设置为1,BOOT1设置为0,然后按下复位键,这样才干从系统存储器启动BootLoader

    2. 最后在BootLoader的帮助下,通过串口下载程序到Flash中

6.在FlyMcu中点击下载,之后按下开发板复位按键,程序显示下载,下载完成如下

  1. 将boot0插回低电平,复位芯片运行程序

GD32直接下载STM32 Hal库开发的程序运行完成

四、使用CubeMX开发GD32测试

这一栏是我用STM32CubeMX进行开发,并下载到GD32F303VCT6的芯片上运行,观察移植效果的一些记录,测试会一直更新,并且将我遇到的反馈效果记录下来,给后面同学做参考

  • HAL库开发测试GPIO输出,1S灯的电平反转一次

测试效果:完美运行,示波器看了电平变化间隔,精度挺高

  • HAL库开发测试串口1输出数据,1S发送一次信息

测试效果:时间戳观察,符合预期现象,下次使用逻辑分析仪看一下具体波形和STM32做对比!

因为笔者水平原因,文章有错误或者改进之处希望大佬可以在评论区提出来,或者私信我,万分感谢!!!

以上是关于IDEA使用JDBC连接MySQL数据库,看完就懂的主要内容,如果未能解决你的问题,请参考以下文章

看完就懂GD32替代STM32全过程记录

git merge 详细操作,看完就懂

C static关键字解析,看完就懂,不迷糊

看完就懂系列之正则表达式(值得收藏)

idea springboot中整合jdbc连接MySQL中,Schemas中无mybatis怎么解决?

[JavaWeb-JDBC]JDBC_快速入门_idea jdbc连接Mysql数据库