通过一次疫情,距离上一次学习大数据已经快过去半年了。。不能半途而废!!!!在前面已经学习了Mysql的基础了,接下来正好可以来学习用Java如何来操纵数据库,也就是JDBC技术,其实这块之前也用过,不过都忘得差不多了,为了打好地基从0开始学习。
快速入门:
什么是JDBC?
它的全称为“Java DataBase Connectivity”,既Java 数据库连接, Java语言操作数据库。嗯,这个是从字面意思来理解的,但是它本质其实是这样的:
JDBC 规范定义接口,具体的实现由各大数据库厂商来实现。JDBC 是 Java 访问数据库的标准规范,真正怎么操作数据库还需要具体的实现类,也就是数据库驱动。每个 数据库厂商根据自家数据库的通信格式编写好自己数据库的驱动。所以我们只需要会调用 JDBC 接口中的方法即 可,数据库驱动由数据库厂商提供。
也可以看到使用JDBC的好处如下:
- 程序员如果要开发访问数据库的程序,只需要会调用 JDBC 接口中的方法即可,不用关注类是如何实现的。
- 使用同一套 Java 代码,进行少量的修改就可以访问其他 JDBC 支持的数据库。
JDBC快速入门:
有了基本概念之后,接下来则尝试来用java操作一下mysql数据库,快速感受一下JDBC的魅力。
1、在MAC上安装Mysql:
安装Myql:
在之前的mysql学习是在windows平台上进行的,而对于一个习惯mac的程序员来说也有必要来搭建一下环境,所以这里重新装一下mac的mysql的环境,为之后的学习做好铺垫,这里借签一下之前https://www.cnblogs.com/webor2006/p/11770756.htmlwindows安装mysql的过程,首先到官网https://dev.mysql.com/downloads/mysql/先下载安装包:
然后安装方法就不多说了,可以参考:https://www.jianshu.com/p/2906abd8fd47,安装完之后,接下来则需要mysql配置到环境变量中,这样就可以在终端上来输入命令操纵Mysql了:
验证一下是否配置好:
命令是生效了,只是目前mysql服务器还没启,此时则需要进“系统偏好设置”启动一下它:
好,再来试一下mysql命令:
xiongweideMacBook-Pro:ZhiyiCloudScreenS1 xiongwei$ mysql -u root -p Enter password: Welcome to the MySQL monitor. Commands end with ; or g. Your MySQL connection id is 10 Server version: 8.0.20 MySQL Community Server - GPL Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or 'h' for help. Type 'c' to clear the current input statement. mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 4 rows in set (0.01 sec) mysql>
GUI工具:
对于平常使用肯定需要基于GUI,所以也提前把它给配置好,那在MAC上用哪款可视化的工具呢?这里用它--https://www.jetbrains.com/datagrip/,说到jetbrains就不用多说了,肯定不是太差,当然它不是免费的,只有30天的试用版,由于我买了正版的授权码所以肯定选它了,先来了解一下这个工具:
嗯,数据库一家统,具体是不是好用得之后再慢慢感受,接下来把它给下载下来,并打开,然后先激活一下:
接下来则创建数据库连接:
可以看到市面上的流行数据库都支持,还真是如官网所说:“Many databases, one tool”,咱们当然是创建Mysql的:
由于我的渣网,经过漫长的等待后,则就可以看到咱们配置的连接是否正确了,如果正确的话则会是如下所示:
然后点击ok之后,则就可以操作数据库了,比如:
呃,一定得要写sql才能展现么? 貌似没找到通过可视化的操作来不写SQL也能实现数据库的操作方法,不过,我觉得是好事,学习角度就得对SQL语句多敲,这样才能更加熟练的掌握SQL。关于MAC上的mysql安装就先到这,接下来则开始进入JDBC的学习之中。
2、 导入驱动jar包 mysql-connector-java-5.1.37-bin.jar
到Intellij IDEA中新建一个工程,先创建一个空的项目,里面用于JavaWeb的集中学习:
3、复制mysql-connector-java-bin.jar驱动jar包到项目的libs目录下
我们知道要想能操纵数据库,则需要下载数据库相印的驱动jar包,上官网:https://dev.mysql.com/downloads/connector/j/5.1.html
拷到工程中:
4、右键-->Add As Library
5、 注册驱动
接下来则可以撸码来操练Mysql数据库了,由于是快速入门,里面的细节先不用管,先按步骤能达到操作mysql的目的既可,之后再对其进行详细学习。
package com.jdbc.test; public class JdbcTest1 { public static void main(String[] args) throws Exception { Class.forName("com.mysql.jdbc.Driver"); } }
这个代码在当时学习JVM时提到过,它是属于类的主动使用的一种情况,回忆一下:https://www.cnblogs.com/webor2006/p/8835953.html
很显然就会导致类被初始化,不多解释了,学习知识得要相互串联,这样学习起来也会在大脑中形成比较好的印象。
6、 获取数据库连接对象 Connection
package com.jdbc.test; import java.sql.Connection; import java.sql.DriverManager; public class JdbcTest1 { public static void main(String[] args) throws Exception { //注册驱动 Class.forName("com.mysql.jdbc.Driver"); //获取数据库的连接对象 Connection root = DriverManager.getConnection("jdbc:mysql://localhost:3306/db3", "root", "12345678"); } }
其中“jdbc:mysql://localhost:3306/db3”是不是在我们的DataGrip连接Mysql配置时有看到过:
7、 定义sql
接下来则可以定义要执行的SQL语句了,这里咱们用一个更新语句,在库中有一个这个表:
package com.jdbc.test; import java.sql.Connection; import java.sql.DriverManager; public class JdbcTest1 { public static void main(String[] args) throws Exception { //注册驱动 Class.forName("com.mysql.jdbc.Driver"); //获取数据库的连接对象 Connection root = DriverManager.getConnection("jdbc:mysql://localhost:3306/db3", "root", "12345678"); //定义要执行的sql String sql = "UPDATE salarygrade SET losalary = 6000 WHERE grade = 1"; } }
8、 获取执行sql语句的对象 Statement
package com.jdbc.test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Statement; public class JdbcTest1 { public static void main(String[] args) throws Exception { //注册驱动 Class.forName("com.mysql.jdbc.Driver"); //获取数据库的连接对象 Connection root = DriverManager.getConnection("jdbc:mysql://localhost:3306/db3", "root", "12345678"); //定义要执行的sql String sql = "UPDATE salarygrade SET losalary = 6000 WHERE grade = 1"; //获得执行sql的对象 Statement statement = root.createStatement(); } }
9、 执行sql,接受返回结果
package com.jdbc.test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Statement; public class JdbcTest1 { public static void main(String[] args) throws Exception { //注册驱动 Class.forName("com.mysql.jdbc.Driver"); //获取数据库的连接对象 Connection root = DriverManager.getConnection("jdbc:mysql://localhost:3306/db3", "root", "12345678"); //定义要执行的sql String sql = "UPDATE salarygrade SET losalary = 6000 WHERE grade = 1"; //获得执行sql的对象 Statement statement = root.createStatement(); //执行sql,由于这个sql属于更新操作,所以调用更新相关的API int count = statement.executeUpdate(sql); } }
10、 处理结果
package com.jdbc.test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Statement; public class JdbcTest1 { public static void main(String[] args) throws Exception { //注册驱动 Class.forName("com.mysql.jdbc.Driver"); //获取数据库的连接对象 Connection root = DriverManager.getConnection("jdbc:mysql://localhost:3306/db3", "root", "12345678"); //定义要执行的sql String sql = "UPDATE salarygrade SET losalary = 6000 WHERE grade = 1"; //获得执行sql的对象 Statement statement = root.createStatement(); //执行sql,由于这个sql属于更新操作,所以调用更新相关的API int count = statement.executeUpdate(sql); //处理结果 System.out.println("更新sql执行完成:" + count); } }
11、 释放资源
package com.jdbc.test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Statement; public class JdbcTest1 { public static void main(String[] args) throws Exception { //注册驱动 Class.forName("com.mysql.jdbc.Driver"); //获取数据库的连接对象 Connection root = DriverManager.getConnection("jdbc:mysql://localhost:3306/db3", "root", "12345678"); //定义要执行的sql String sql = "UPDATE salarygrade SET losalary = 6000 WHERE grade = 1"; //获得执行sql的对象 Statement statement = root.createStatement(); //执行sql,由于这个sql属于更新操作,所以调用更新相关的API int count = statement.executeUpdate(sql); //处理结果 System.out.println("更新sql执行完成:" + count); //释放资源 statement.close(); root.close(); } }
好!!!接下来运行看一下,第一个JDBC操作mysql的程序能否成功:
貌似成功了,查一下数据看有没有被更新:
第一个JDBC的例子就完美运行,但是!!对于它里面的细节还一点都不懂,为啥要这样写代码呢?所以接下来有必要对用到的相关类进行一个了解。
各个类详解:
在快速入门的代码中涉及到这几个关键类:
public static void main(String[] args) throws Exception { //注册驱动 Class.forName("com.mysql.jdbc.Driver"); //获取数据库的连接对象 Connection root = DriverManager.getConnection("jdbc:mysql://localhost:3306/db3", "root", "12345678"); //定义要执行的sql String sql = "UPDATE salarygrade SET losalary = 6000 WHERE grade = 1"; //获得执行sql的对象 Statement statement = root.createStatement(); //执行sql,由于这个sql属于更新操作,所以调用更新相关的API int count = statement.executeUpdate(sql); //处理结果 System.out.println("更新sql执行完成:" + count); //释放资源 statement.close(); root.close(); }
下面则来全面了解一下它们。
DriverManager:驱动管理对象
它其实主要是有下两个功能:
1、注册驱动:告诉程序该使用哪一个数据库驱动jar;
我们可以看一下这个类中有一个注册的方法:
而它的调用其实是具体的数据库产品中进行的,也就是我们第一句所写的:
如之前所提示,它由于主动使用了类,则会对类进行初始化,则会执行它的静态代码块,所以瞅一下这个类的静态代码:
其实有个细节,这句话可以省略:
关于这块其实在当时学习JVM的SPI场景分析类加载机制时详细分析过,具体可以参考https://www.cnblogs.com/webor2006/p/9275901.html。
2、获取数据库连接;
其实也就是对应这句代码:
下面对这个API稍加解释一下:
* 方法:static Connection getConnection(String url, String user, String password) * 参数: * url:指定连接的路径 * 语法:jdbc:mysql://ip地址(域名):端口号/数据库名称 * 例子:jdbc:mysql://localhost:3306/db3 * 细节:如果连接的是本机mysql服务器,并且mysql服务默认端口是3306,则url可以简写为:jdbc:mysql:///数据库名称 * user:用户名 * password:密码
下面咱们来试一下如上所说简写的写法:
执行:
确实是!!!
Connection:数据库连接对象
它主要有以下两个作用:
1、获取执行sql 的对象;
- Statement createStatement()
- PreparedStatement prepareStatement(String sql)
这个暂时还木有用到,这个在最后再来解释。
2、管理事务;
事务这块暂时还木有使用到,不过未来肯定少不了用它的,先提前了解一下:
- 开启事务:setAutoCommit(boolean autoCommit) :调用该方法设置参数为false,即开启事务
- 提交事务:commit()
- 回滚事务:rollback()
Statement:执行sql的对象
它主要是用来执行sql的,主要有如下几种执行方法:
- boolean execute(String sql) :可以执行任意的sql,不是很常用,了解既可。
- int executeUpdate(String sql) :执行DML(insert、update、delete)语句、DDL(create,alter、drop)语句
返回值:影响的行数,可以通过这个影响的行数判断DML语句是否执行成功 返回值>0的则执行成功,反之,则失败。
- ResultSet executeQuery(String sql) :执行DQL(select)语句
接下来咱们则做个小练习,用来对其实践一下:
1. salarygrade表 添加一条记录
在上面的入门示例中其实代码是不健全的,异常直接向外抛出了,而且资源的释放没放到finally中:
所以这次的练习正规化一下,代码比较简单,过一下既可:
package com.jdbc.test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; /** * salarygrade添加一条记录 */ public class JdbcTest2 { public static void main(String[] args) { Statement stmt = null; Connection conn = null; try { //1. 注册驱动 Class.forName("com.mysql.jdbc.Driver"); //2. 定义sql String sql = "insert into salarygrade values(6,100000,150000)"; //3.获取Connection对象 conn = DriverManager.getConnection("jdbc:mysql:///db3", "root", "12345678"); //4.获取执行sql的对象 Statement stmt = conn.createStatement(); //5.执行sql int count = stmt.executeUpdate(sql);//影响的行数 //6.处理结果 System.out.println(count); if (count > 0) { System.out.println("添加成功!"); } else { System.out.println("添加失败!"); } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } finally { //7. 释放资源 //避免空指针异常 if (stmt != null) { try { stmt.close(); } catch (SQLException e) { e.printStackTrace(); } } if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } } }
运行一下:
此时看一下数据库数据:
2. salarygrade表 修改记录
这个比较简单,不多说:
package com.jdbc.test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; /** * salarygrade修改一条记录 */ public class JdbcTest3 { public static void main(String[] args) { Statement stmt = null; Connection conn = null; try { //1. 注册驱动 Class.forName("com.mysql.jdbc.Driver"); //2. 定义sql String sql = "UPDATE salarygrade SET hisalary = 120000 WHERE grade = 6"; //3.获取Connection对象 conn = DriverManager.getConnection("jdbc:mysql:///db3", "root", "12345678"); //4.获取执行sql的对象 Statement stmt = conn.createStatement(); //5.执行sql int count = stmt.executeUpdate(sql);//影响的行数 //6.处理结果 System.out.println(count); if (count > 0) { System.out.println("修改成功!"); } else { System.out.println("修改失败!"); } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } finally { //7. 释放资源 //避免空指针异常 if (stmt != null) { try { stmt.close(); } catch (SQLException e) { e.printStackTrace(); } } if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } } }
运行:
看数据:
3. salarygrade表 删除一条记录
package com.jdbc.test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; /** * salarygrade删除一条记录 */ public class JdbcTest4 { public static void main(String[] args) { Statement stmt = null; Connection conn = null; try { //1. 注册驱动 Class.forName("com.mysql.jdbc.Driver"); //2. 定义sql String sql = "DELETE FROM salarygrade WHERE grade = 6"; //3.获取Connection对象 conn = DriverManager.getConnection("jdbc:mysql:///db3", "root", "12345678"); //4.获取执行sql的对象 Statement stmt = conn.createStatement(); //5.执行sql int count = stmt.executeUpdate(sql);//影响的行数 //6.处理结果 System.out.println(count); if (count > 0) { System.out.println("删除成功!"); } else { System.out.println("删除失败!"); } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } finally { //7. 释放资源 //避免空指针异常 if (stmt != null) { try { stmt.close(); } catch (SQLException e) { e.printStackTrace(); } } if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } } }
运行:
4、创建一张student表:
package com.jdbc.test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; /** * 创建一张student表 */ public class JdbcTest5 { public static void main(String[] args) { Statement stmt = null; Connection conn = null; try { //1. 注册驱动 Class.forName("com.mysql.jdbc.Driver"); //2. 定义sql String sql = "CREATE TABLE student(id int , name varchar(20))"; //3.获取Connection对象 conn = DriverManager.getConnection("jdbc:mysql:///db3", "root", "12345678"); //4.获取执行sql的对象 Statement stmt = conn.createStatement(); //5.执行sql int count = stmt.executeUpdate(sql);//影响的行数 //6.注意表的创建其count是为0的 System.out.println(count); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } finally { //7. 释放资源 //避免空指针异常 if (stmt != null) { try { stmt.close(); } catch (SQLException e) { e.printStackTrace(); } } if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } } }
运行:
查看一下表: