目录
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. 测试链接
-
首先下载了mysql-connector-java-8.0.17
-
将jar加入到项目路径Build Path中
-
依然是使用类加载创建对象
-
进行了测试, 都成功了
-
测试代码如下
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压缩包
-
首先下载好我们要使用的MySQL压缩版, 建议去官方下载, 安全
- 只需要打开浏览器, 键入mysql.com回车就来到mysql官方网站
- 点击Download, 往下拉, 点击下载社区版
- 然后下载社区版服务器
- 然后下载zip
- 下载完成之后解压, 放在你喜欢的位置, 打开后如下图
- 只需要打开浏览器, 键入mysql.com回车就来到mysql官方网站
4.2 编写配置文件
此时这个mysql并没有初始化, 也就没有数据存放位置所以我们需要写一个mysql的配置文件来使得mysql了解我们设置的需要的参数
-
新建一个文件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 使用命令进行安装
-
配置完了之后我们使用管理员命令来到这个bin目录下, 比如我的就是F:/mysql8/bin,(为了方便将解压后的文件命名为mysql8)
-
然后执行mysqld --install命令安装mysql8
-
然后执行mysqld --initialize 以初始化mysql8(需要等待一段时间)
然后我们就会发现安装的文件夹下出现了一个data文件夹, 里面有一些文件
-
启动mysql 服务使用net start mysql命令
-
此时我们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. 总结
学编程是一个需要动手和动脑的过程, 我们必须将理论知识结合到实践中去.