JDBC与MySQL数据库
写博客是一个好习惯,可以方便自己查阅遗忘的知识,还是希望自己能够坚持下去。前段时间因为兴趣原因把郭大神的第二行代码看完了,现在觉得java有必要重新拾起来了。这一次我来聊聊JDBC与MySQL入门的那些事吧,为自己的学习打个卡!
注:这里并非讲解数据库原理,而是讲解如何在java程序中使用JDBC提供的API和数据库进行信息交互。
MySQL数据库管理系统
简称MySQL,是世界上最流行的开源数据库管理系统之一。
1.下载
MySQL是开源项目,这里可以选择的下载地址是MySQL
点击Products,然后点击MySQL CommunityEdition。
2.安装,就不赘述了。
启动MySQL数据库服务器
1 启动
MySQL是一个网络数据库管理系统,可以使远程的计算机访问它所管理的数据库。安装了MySQL后,需要启动MySQL提供的数据库服务器,以便使远程的计算机可以访问它所管理的数据库。
注意:这里的数据库启动之前必须进行安全初始化,在命令行进入MySQL安装目录的bin子目录,输入“mysqld–initialize-insecure”命令。
作用是初始化data目录。并授权一个无密码的root用户,执行成功以后,mysql安装目录下多出一个data子目录。初始化后,在mysql安装目录的bin子目录下输入“mysqld”启动数据库服务器,3306是该数据库服务器默认的使用端口号,启动成功后,该数据库服务器将占有当前MS-DOS窗口。还有就是启动后无任何提示。
需要注意的是,,直接关闭mysql数据库服务器所占用的命令行窗口不能直接关闭MySQL数据库服务器,可以使用操作系统的任务管理器(按下ctrl+shift+esc组合键)来关闭数据库服务器。之后才能在命令行窗口重新启动MySQL数据库服务器。
2.root用户
数据库服务器启动后,MySQL默认授权可以访问该服务器的用户只有一个,名字是root,密码是空,应用程序以及mysql客户端管理工具软件都必须借助mysql授权的用户来访问数据库服务器。可以建立多个用户。
mysql数据库服务器的root用户默认没有密码,如何修改呢?
需要使用mysqladmin命令,使用格式如下:
进入mysql的bin子目录下执行命令,将提示输入用户的当前密码,由于初始密码是无,,所以按下Enter建即可。在命令行里直接按Enter表示无密码。默认是无密码。。
这里吧,我想插一点。就是关于下载数据库以及建立连接遇到的问提。因为我吧。很久以前有接触过一点点mysql,所在在我的电脑上有存在使用mysql的记录(没卸干净)。这也导致我在重装时遇到不少困难。
mysql服务有建立过,但是之前的Service没有删除。导致我重安装后,命令行里始终无法启动MySQL数据库服务器。后来查了资料,发现是mysql服务的可执行文件路径还是之前的路径。这就需要修改。如何修改?
这里有链接。修改mysql可执行文件路径mysql曾经没有用过,电脑上没有安装过mysql服务。可以参考下面的连接。安装mysql服务
还有就是我曾经遇到过的问题,3306默认的端口被别的服务占用了。可以参考下面的。解决端口占用问题
注册表和计算机管理都可以在自己的电脑上搜索到。。
注册表:我们直接按快捷键【WIN+R】打开【运行】弹出窗,在输入框输入【regedit】命令,然后点击【确定】或者按【Enter】回车键
计算机管理:运行compmgmt.msc也可以打开计算机管理或使用快捷键windows+R打开‘运行’程序,输入compmgmt.msc就可以打开计算机管理
MySQL客户端管理工具
就是在MySQL数据库服务器上建立数据库的软件,可以下载GUI的mysql管理工具,
并使用该工具在mysql服务器上创建数据库,和表。
可以在搜索引擎中,寻找客户端管理工具,,可以登录 下载适用版本,笔者用的是Navicat for MySQL。
注意这里的数据库管理工具必须和数据库服务器建立连接才能操作。
1建立连接
启动Navicat for MySQL后,单击界面的“连接”,出现对话框。
在对话框输入如下信息。
-
连接名:super-csdner
-
主机名:localhost
-
端口:3306
-
用户名:root
-
密码:有就填写,没有就不需要。
输入完成,然后确认就可以了。数据库服务器就建立起了super-csdner的连接。新建连接后,主界面的左侧就会出现新建立的名字。
在新建立的连接上右击,选择“打开连接命令”就okk!
2.建立数据库
在主界面上选择一个连接,例如super-csdner,右击,选择“打开连接命令”,在super-csdner右击,选择新建数据库,,填入信息。
3.创建表(也可以使用SQL语句创建)
右击数据库,右击表选项,选择“创建表”,弹出表的对话框,在对话框中输入表的列名,数据类型。其中number是主键,数据库原理有介绍,并将该表存为mess的表。
单击表,可以展开表,就可以对表进行操作了。JDBC
JDBC是一种用于执行SQL语句的java API,JDBC API提供了一个标准接口,用于与任何关系数据库管理系统进行交互。
为了使java编写的程序不依赖具体的数据库,java提供了专门操作数据库的API,即是JDBC。JDBC操作不同的数据库仅仅是连接方式上的差异而已。使用JDBC的应用程序一旦和数据库建立连接,就可以使用JDBC提供的API操作数据库。
操作如下:
-
与一个数据库建立连接。
-
向一个连接的数据库发送SQL语句。
-
处理SQL语句返回的结果。
连接数据库
MySQL数据库服务器启动后,应用程序为了可以和数据库交互信息,要先和MySQL数据库服务器上的数据库建立连接。
连接数据库的 方式是:加载JDBC-数据库驱动(即就是用JAVA语言编写的数据库驱动) 即就是JDBC调用本地的JDBC-数据库驱动和相应的数据库建立连接。
java运行环境将JDBC-数据库驱动转换为DBMS所使用的专用协议来实现和特定的DBMS交互信息。
使用JDBC-数据库驱动方式和数据库建立连接需要两个步骤:
- 加载JDBC-数据库驱动
windows版本
下载安装即可。将解压后的文件复制到JDK的拓展目录中,例如E:\jdk1.8\jre\lib\ext。
在下载JDK时,一般也会有一个JRE,最好也将该驱动复制到jre\lib\ext中去,保证即使启动该环境运行程序,也会有需要的驱动。 - 和指定的数据库建立连接
应用程序负责加载的JDBC-MySQL数据库驱动的代码:
在命令行输入ipconfig可以获得本机的ip地址。
try{
Class.forName(com.mysql.jdbc.Driver);
}
catch{ Exception e){
}
- 连接数据库
java.sql包中的DriverManager类有两个用于建立连接的类方法。
Connection getConnection(java.lang.String,java.lang.String ,java.lang.String )
Connection getConnection(java.lang.String )
返回一个Connection对象。应用程序要和MySQL数据库服务器管理的数据库students建立连接,而有权力访问数据库students的用户的id和密码是root,密码是自己设置的。使用第二种方式的代码如下:
Connection con;
String url=
“jdbc:mysql:localhost:3306/students?user=root&password=****&useSSL=true";
try{
con=DriverManager.getConnection(url);
}
catch(Exception e)
{
}
密码是自己设置的。
第一种方式:
Connection con;
String url=
“jdbc:mysql:localhost:3306/students? useSSL=true";
String user="root";
String password="***";
try{
con=DriverManager.getConnection(url,user,password);
}
catch(Exception e)
{
}
一旦和数据库建立连接,就可以通过SQL语句和该数据库的表交互信息。
- 注意汉字问题,如果数据库中有汉字,在建立连接时需要额外多加一个参数characterEncoding 取值gb2312或者utf-8;
String url=
“jdbc:mysql:localhost:3306/students? useSSL=true&charaterEncoding=utf-8";
查询操作
1.向数据库发送SQL查询语句。
首先使用Statement声明一个SQL语句对象,让已经创建的con对象调用方法createStatement()创建这个SQL语句对象。
代码:
try{
Statement sql=con.createStatement();
{
catch(){
}
2.处理查询结果
ResultSet rs=new sql.executeQuery("select * from students");
ResultSet对象由按列组织的数据行构成。例如
内存的结果集对象 rs的列数是4列,刚好与表的列数一样。
而对于
ResultSet rs=new sql.executeQuery("select name,height from students");
内存的结果集对象 rs的列数是2列。name和height列。
ResultSet对象一次只能看到一个数据行,使用next()方法移到下一个数据行,获得一行数据后,ResultSet对象可以调用getXXX方法获得字段值,列值,将位置索引传给getXXX方法的参数。
无论字段是什么属性,总可以使用getString(int columnIndex)返回字段值的串表示。
3.关闭连接
con.close()
接下来一个实例体验体验
顺序查询:是指ResultSet对象一次只能看到一个数据行,使用next()方法移动到下一个数据行,next()方法最初的位置,就是游标位置,位于第一行的前面,next()方法向下移动游标。移动成功返回true。
package 顺序查询;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Date;
public class Example11_1 {
public static void main(String [] args)
{
Connection con=null;
Statement sql;
ResultSet rs;
try{
Class.forName("com.mysql.cj.jdbc.Driver");
}
catch(Exception e)
{}
String uri="jdbc:mysql://localhost:3306/students?useSSL=true&serverTimezone=UTC";
String user="root";
String password="123456";
try{
con=DriverManager.getConnection(uri,user,password);
}
catch(SQLException e)
{
e.printStackTrace();
}
try{
sql=con.createStatement();
rs=sql.executeQuery("select * from students");
while(rs.next())
{
String number=rs.getString(1);
String name=rs.getString(2);
Date date=rs.getDate(3);
float height=rs.getFloat(4);
System.out.printf("%s\t",number);
System.out.printf("%s\t",name);
System.out.printf("%s\t",date);
System.out.printf("%.2f\n",height);
}
con.close();
}
catch(Exception e1)
{
System.out.println(e1);
}
}
}
运行结果:
在数据库里的表是
感想:我的天啊!做这个实例的时候!我真的要爆炸了。之前一直在报错java.lang.NullPointerException,我找了半个小时错误。鬼知道是什么。。。最后调试着找出错误:java.sql.SQLException: The server time zone value ‘?й???’ is unrecognized or represents more than one time zone。百度才知道这是MySQL最新版驱动必须设置的时区。还有就是新版驱动的名称也改了。
总结一下:
1.新版驱动的名字是:com.mysql.cj.jdbc.Driver
2.设置时区问题
- 解决办法1
String uri="jdbc:mysql://localhost:3306/students?useSSL=true&serverTimezone=UTC";
同时可以参考链接新版加载驱动修改处
好啦,就写到这吧。再见。