Ubuntu Java连接mysql数据库

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hunt_er/article/details/82871397

最近准备着手写一个类似‘QQ’的聊天软件玩玩,在登录问题上想到用数据库来存储数据,在学习Java连接数据库时碰到不少问题,所幸,都解决了。下面说说我的学习过程。全程是在Ubuntu16.04下进行操作。不过应该和Window下的区别不大。可以参考。

第一步:准备工作,需要安装好mysql数据库(教程),eclipse编程工具(非必须),Java 连接 MySQL 需要驱动包,最新版下载地址为:http://dev.mysql.com/downloads/connector/j/,选择Ubuntu下载,下载后得到一个deb文件,用归档管理器打开,找到名为mysql-connector-java-8.0.12.jar的文件(版本可能不一样,但大致是这个样子),然后在对应(需要连接数据库的)的项目中创建一个名为lib的文件夹,将找到的文件放入该文件夹下。打开eclipse,找到刚才放到lib文件夹下的文件,右键单击,选择 Build Path,Add To Build Path。这样准备工作就做好了,最后,放个图。

第二步: 写代码,直接看代码,注释很清楚,若不能运行,看下方解决方法。

package testone;

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

public class ConnSql {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String driver = "com.mysql.cj.jdbc.Driver";	//驱动名,默认
		String url = "jdbc:mysql://localhost:3306/testone?serverTimezone=GMT&useSSL=false";	//将要访问的数据库名称testone
		String user = "root";	//mysql数据库用户名
		String password = "root";	//mysql数据库用户密码
		
		try {
			Class.forName(driver);	//加载驱动
			Connection conn = DriverManager.getConnection(url, user, password);	//创建connection对象,用来连接数据库
			if(!conn.isClosed())
				System.out.println("Succeed!");
			Statement state = conn.createStatement();	//创建statement对象,用来执行sql语句
			String sql = "select * from login;";	//执行的sql语句
			ResultSet rst = state.executeQuery(sql);	//创建resultset对象,用来存放查询结果
			while(rst.next()) {
				System.out.println(rst.getString("name"));	//输出表中列为‘name’的所有项
			}
			rst.close();
			state.close();
			conn.close();
			
		}catch(Exception e) {
			System.out.println("defeat!");
			System.out.println(e);
		}
	}

}

结果

附:数据库信息

数据库名称:testone

使用的数据库表:login

数据库用户:root

用户密码:root

遇到的问题

说说我遇到的问题,首先,驱动名为"com.mysql.cj.jdbc.Drive",在网上看到都是"com.mysql.jdbc.Drive"这个,经测试,我的是不能用的,出现 :

Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.

然后就是url的问题,"jdbc:mysql://localhost:3306/testone?serverTimezone=GMT&useSSL=false",网上的为"jdbc:mysql://localhost:3306/testone",这个是无法运行的,出现警告:

Thu Sep 27 04:11:22 PDT 2018 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.

java.sql.SQLException: The server time zone value 'PDT' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.

上面一条是指Mysql数据库的SSL连接问题,提示警告不建议使用没有带服务器身份验证的SSL连接,是在MYSQL5.5.45+, 5.6.26+ and 5.7.6+版本中才有的这个问题。解决办法在警告中已经说明了:

    1.在数据库连接的url中添加useSSL=false;

    2.url中添加useSSL=true,并且提供服务器的验证证书。

如果只是做一个测试的话,没必要搞证书那么麻烦啦,在连接后添加一个useSSL=false即可。

下面一条是由于数据库和系统时区差异所造成的,在jdbc连接的url后面加上serverTimezone=GMT即可。

两点问题,都加在url的后面,所以url改为:"jdbc:mysql://localhost:3306/testone?serverTimezone=GMT&useSSL=false",两个参数间用&连接,自己测试得出。

小知识

SQL注入: 在执行sql语句时,由于sql语句的值是由用户输入的,所以是以变量接收的,如果以拼接字符串方式来执行SQL语句,一旦数据中有非法字符或者有关键字时,会导致语法错误,或者执行结果不正确的情况,这称为SQL注入。
Statement和PreparedStatement的区别

Statement是PreparedStatement 的父接口。在执行SQL语句时,只能以拼接字符串方式,拼接值。会引起SQL注入。而且效率低。

PreparedStatement,是预编译SQL语句执行对象,支持占位符方式,无论数据是什么值,都当字符串处理,不会引起SQL注入。而且效率高。

Statement和PreparedStatement的基本用法

Connection conn = DriverManager.getConnection(url, user, password);
String sql = "select * from login;";	//执行的sql语句

Statement state = conn.createStatement();
//PreparedStatement sta = conn.prepareStatement(sql);

ResultSet rst;
int count;

count = state.executeUpdate("增删改的sql语句");    //返回更改的结果数
rst = state.executeQuery("查询的sql语句");    //返回结果集
//count = sta.executeUpdate("增删改的sql语句");    //返回更改的结果数
//rst = sta.executeQuery("查询的sql语句");    //返回结果集

参考博客:

https://blog.csdn.net/u010429286/article/details/77750177  (SSL连接问题)

https://blog.csdn.net/oppo5630/article/details/52162783 (时区问题)

猜你喜欢

转载自blog.csdn.net/hunt_er/article/details/82871397
今日推荐