测试JDBC的新的连接方式与MySQL解压版安装过程

1. 问题背景

在学习Linux的过程中为了锻炼英文水平, 我看了JDBC(Java DataBase Connectivity)的文档, 发现一个很有意思的现象里面的连接方式有一种我没有用过也没有见过, 但是用起来感觉很方便. 因为很直白

jdbc:mysql://address=(host=localhost)(port=3306)(user=username)(password=yourpassword)/databse

# Or you can use 127.0.0.1 replace localhost
jdbc:mysql://address=(host=127.0.0.1)(port=3306)(user=username)(password=yourpassword)/databse

# And it is 
jdbc:mysql://address=(key0=value0)(key1=value1)...(keyn=valuen)


# and there are more method to connect
# you can also use the following
jdbc:mysql://(host=127.0.0.1, port=3306, user=root, password=1324012)/database
jdbc:mysql://(key0=value0, key1=value1,...,keyN=valueN)/database

我感到非常有意思, 而且这种很方便, 通俗易懂, 于是我赶紧试了试

2. 测试链接

  1. 首先下载了mysql-connector-java-8.0.17

  2. 将jar加入到项目路径Build Path

  3. 依然是使用类加载创建对象

  4. 进行了测试, 都成功了

  5. 测试代码如下

  	public static void main(String[] args) {
   		List<Stock> listStocks = new ArrayList<Stock>();
   		try {
   			Class.forName("com.mysql.cj.jdbc.Driver").newInstance();
               // both of this two method can connect mysql successfully 
   //			Connection conn = DriverManager.getConnection("jdbc:mysql://address=(host=127.0.0.1)(port=3306)(user=root)(password=123456)/practiceonly");
   			Connection conn = DriverManager.getConnection("jdbc:mysql://(host=127.0.0.1, port=3306, user=root, password=123456)/practiceonly");
   			System.out.println(conn);
   			PreparedStatement statement = conn.prepareStatement("SELECT * FROM stock");
   			ResultSet resultSet = statement.executeQuery();
   			while (resultSet.next()) {
   				String code = resultSet.getString(1);
   				String year = resultSet.getString(2);
   				String province = resultSet.getString(3);
   				String social = resultSet.getString(4);
   				String trust = resultSet.getString(5);
   				listStocks.add(new Stock(code, year, province, social, trust));
   			}
   			for (Stock stock : listStocks) {
   				System.out.println(stock);
   			}
   		} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | SQLException e) {
   			e.printStackTrace();
   		}
   
   	}
## 其中Stock是我的测试数据库对象类

测试完成之后教java的娄老师让我试一下之前的版本(mysql5.x, 和JDBC5.x)可不可以

3. 切换mysql与MySQL-connector

3.1 mysql5 和 JDBC8

将我的MySQL换成了MySQL5版本, 然后使用刚刚的方式进行测试, 完全没有问题,成功的进行了

3.2 MySQL5 和 JDBC5

JDBC8换成JDBC5之后代码在加载类的时候略有改动

ClassForname("com.mysql.jdbc.Driver").newInstance();

测试之后就出现了下面的错误

当我使用Connection conn = DriverManager.getConnection(“jdbc:mysql://address=(host=127.0.0.1)(port=3306)(user=root)(password=1324012)/pricticeonly”); 时, 错误是下面这种

com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server.
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
	at java.lang.reflect.Constructor.newInstance(Unknown Source)
	at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
	at com.mysql.jdbc.Util.getInstance(Util.java:408)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:919)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:898)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:887)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:861)
	at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2266)
	at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2015)
	at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:768)
	at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
	at java.lang.reflect.Constructor.newInstance(Unknown Source)
	at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
	at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:385)
	at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:323)
	at java.sql.DriverManager.getConnection(Unknown Source)
	at java.sql.DriverManager.getConnection(Unknown Source)
	at practice.test.mysql.TestMysqlJDBC.main(TestMysqlJDBC.java:18)
Caused by: java.lang.NullPointerException
	at com.mysql.jdbc.NonRegisteringDriver.parseHostPortPair(NonRegisteringDriver.java:199)
	at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2167)
	at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2220)
	... 13 more

当我使用Connection conn = DriverManager.getConnection(“jdbc:mysql://(host=127.0.0.1, port=3306, user=root, password=1324012)/pricticeonly”); 这种方式时, 错误则是

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
	at sun.reflect.GeneratedConstructorAccessor5.newInstance(Unknown Source)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
	at java.lang.reflect.Constructor.newInstance(Unknown Source)
	at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
	at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:990)
	at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:335)
	at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2187)
	at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2220)
	at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2015)
	at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:768)
	at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47)
	at sun.reflect.GeneratedConstructorAccessor2.newInstance(Unknown Source)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
	at java.lang.reflect.Constructor.newInstance(Unknown Source)
	at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
	at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:385)
	at com.mysql.jdbc.MultiHostConnectionProxy.createConnectionForHost(MultiHostConnectionProxy.java:345)
	at com.mysql.jdbc.FailoverConnectionProxy.createConnectionForHostIndex(FailoverConnectionProxy.java:215)
	at com.mysql.jdbc.FailoverConnectionProxy.connectTo(FailoverConnectionProxy.java:226)
	at com.mysql.jdbc.FailoverConnectionProxy.failOver(FailoverConnectionProxy.java:292)
	at com.mysql.jdbc.FailoverConnectionProxy.pickNewConnection(FailoverConnectionProxy.java:199)
	at com.mysql.jdbc.FailoverConnectionProxy.<init>(FailoverConnectionProxy.java:133)
	at com.mysql.jdbc.FailoverConnectionProxy.createProxyInstance(FailoverConnectionProxy.java:107)
	at com.mysql.jdbc.NonRegisteringDriver.connectFailover(NonRegisteringDriver.java:384)
	at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:319)
	at java.sql.DriverManager.getConnection(Unknown Source)
	at java.sql.DriverManager.getConnection(Unknown Source)
	at practice.test.mysql.TestMysqlJDBC.main(TestMysqlJDBC.java:18)
Caused by: java.net.UnknownHostException: (host=127.0.0.1
	at java.net.InetAddress.getAllByName0(Unknown Source)
	at java.net.InetAddress.getAllByName(Unknown Source)
	at java.net.InetAddress.getAllByName(Unknown Source)
	at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:188)
	at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:299)
	... 22 more

## 咦, 两个错误不一样, 先占坑, 有时间再解决.....

4. MySQL的解压版安装

我作为一名Windows使用人员, 我以前喜欢安装版, 因为省事, 不想写很多配置文件. 然而现在我变了, 我变得喜欢zip解压版的所有软件. 因为这下命运全部掌握在自己手中, 下面就写一下MySQL的解压版安装.

4.1 下载MySQL压缩包

  1. 首先下载好我们要使用的MySQL压缩版, 建议去官方下载, 安全

    1. 只需要打开浏览器, 键入mysql.com回车就来到mysql官方网站
      在这里插入图片描述
    2. 点击Download, 往下拉, 点击下载社区版
      在这里插入图片描述
    3. 然后下载社区版服务器
      在这里插入图片描述
    4. 然后下载zip
      在这里插入图片描述
    5. 下载完成之后解压, 放在你喜欢的位置, 打开后如下图
      在这里插入图片描述

4.2 编写配置文件

此时这个mysql并没有初始化, 也就没有数据存放位置所以我们需要写一个mysql的配置文件来使得mysql了解我们设置的需要的参数

  1. 新建一个文件my.ini然后用文本编辑软件打开键入以下内容

    [mysqld]
    # set port number
    port=3306
    
    # set basedir for your installation path
    basedir=F:/mysql8
    # set datadir for mysql data directory
    datadir=F:/mysql8/data
    
    # set the character for our server
    character_set_server=UTF8MB4
    
    # set sql mode 
    sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
    
    # set the max connections
    max_connections=200
    
    # set the storage engine = innodb
    default-storage-engine=INNODB
    
    [client]
    # set client character
    default-character-set=UTF8MB4
    
    [mysql]
    # set mysql character
    default-character-set=UTF8MB4
    
    ## 注意: basedir后面跟的是你的mysql安装目录
    ## datadir 后面是你的数据存放的目录, 为了方便将这个目录放在安装目录下
    

4.3 使用命令进行安装

  1. 配置完了之后我们使用管理员命令来到这个bin目录下, 比如我的就是F:/mysql8/bin,(为了方便将解压后的文件命名为mysql8)
    在这里插入图片描述

  2. 然后执行mysqld --install命令安装mysql8
    在这里插入图片描述

  3. 然后执行mysql --initialize 以初始化mysql8(需要等待一段时间)

    然后我们就会发现安装的文件夹下出现了一个data文件夹, 里面有一些文件
    在这里插入图片描述

  4. 启动mysql 服务使用net start mysql命令
    在这里插入图片描述

  5. 此时我们mysql就已经安装完成了, 但是还没有完全安装好

4.4 命令登陆MySQL

安装完成之后我们进行测试连接
在这里插入图片描述
那么问题来了? 密码呢?

密码就在刚刚的data文件中有一个后缀名为err的文件中, 是一个临时密码

使用文本编辑工具打开后我们可以看到

在这里插入图片描述
将这个密码输入进去就登陆成功了

在这里插入图片描述

连接成功

4.5 重置用户密码

然后试一试show databases命令
在这里插入图片描述

然后我们可以看到提示我们使用ALTER USER 命令进行重置密码

于是我们可以使用这样的命令来进行重置

alter user 'root'@'localhost' identified by '123456';

那么我们的mysql到此就正式安装完成了
在这里插入图片描述

4.6 配置环境变量

此时我们的MySQL只能在bin目录下进行连接, 为了是我们的所有位置均可以进行连接, 我们配置环境变量, 将bin目录加入到我们的path路径中(配置路径略)

5. 总结

学编程是一个需要动手和动脑的过程, 我们必须将理论知识结合到实践中去.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章