• 【Java】JDBC连接MySQL数据库,一把斗地主时间从无到有讲个通透~


    ??博客主页:??九九舅舅酒酒??
    ??欢迎点赞 ?? 收藏 留言 ?? 欢迎讨论!??
    ??本文由 【九九舅舅酒酒】 原创,首发于 CSDN???
    ??由于博主是在学小白一枚,难免会有错误,有任何问题欢迎评论区留言指出,感激不尽!个人主页
    ??精品专栏(不定时更新)【JavaSE】 【MySQL】【LeetCode】【Web】【操作系统】

    ??精品文章(纯JavaSE实现图书管理系统<含精解注释>)


    目录

    ?一:什么是数据库,为什么要有数据库?

    ?二:如何使用Java连接数据库~

    1)原生方法

    1.1)加载JDBC 驱动:

    1.2)建立数据库连接:

    1.3)创建 statement,用来执行SQL 语句:

    1.4)执行 SQL 语句:

    1.5)关闭记录集,关闭声明,关闭连接对象

    1.6)连起来

    1.7)原生方法的不足:

    ?三:IDEA中配置jar包

    ?四:url必知必会

    ?URL

    ?五:datasource获取连接



    一:什么是数据库,为什么要有数据库?

    数据,数据库,数据库管理系统和数据库系统是与数据库技术密切相关的四个基本概念。

    数据库相信大家都耳熟能详了,其实数据库顾名思义就是存放数据的仓库,只不过这个仓库是在计算机存储设备上,而且数据是按一定的格式存放的~

    可能有朋友就要打断我施法了,停停停,我们Java程序猿在IDEA里面和控制台你侬我侬,没有对象new个对象存储在内存JVM的堆上就行了,学数据库干啥啊?

    这时候我们就需要了解到:内存(Memory)也被称为内存储器,其作用是用于暂时存放CPU中的运算数据,以及与硬盘等外部存储器交换的数据。

    以疫情期间为例,把人隔离观察住的酒店,就好比是内存,家喻户晓的JVM就是放在内存上的~~~ 酒店是给人住的,他的空间是宝贵的,然而每个人每天生活必需品,衣食住行等等,隔离一天两天可能酒店还放得下,但是隔离十天半个月,一年半载呢?酒店是住人的,不是放东西的~~~酒店寸土寸金每个地方都很宝贵,拿酒店(内存)来放行李和必需品等(海量数据),如果酒店还是西安的W酒店,这岂不是很奢侈?~~你拿来存放自己和跟班大批行李老哥,还缺行李不?(doge),想要存放大批东西(海量数据),我直接把十四运的主场馆(外存上的数据库)(69.6亩)给你放行李(海量数据)

    这下诸位应该都了然为什么我们需要搞数据库了吧?


    二:如何使用Java连接数据库~

    1)原生方法

    1.1)加载JDBC 驱动:

    Class.forName(driver);// mysql 数据库:“com.mysql.jdbc.Driver”
    
    • 1

    1.2)建立数据库连接:

    Connection conn=DriverManager.getConnection(url,userName,password);
    
    • 1

    1.3)创建 statement,用来执行SQL 语句:

    Statement statement =conn.createStatement();
    
    • 1

    1.4)执行 SQL 语句:

    执行SQL语句一般要进行SQL语句的拼接

    String SQL = "*******";//拼接SQL语句,把里面可能会发生关键字,语法冲突的取出来,打上问号
    //注意问号的下标从1开始
    //这里预处理还能防止数据库注入!~
    
    • 1
    • 2
    • 3

    优化后的终极大招:

    PreparedStatement 详解

    预先处理好的声明 这个类好处诸多!

    有如下:

    1)首先 获取连接 我们在上面使用了DataSource类获取 DataSource的对象从而获取连接。这种方法比较注册驱动获取连接,还有一个好处,就是可以使用数据库连接池。


    2)除此之外,我们利用PreparedStatemen这个类, preparedStatement 翻译过来就是~事先准备好的声明。 通过连接 获取事先准备好的声明。

    PreparedStatement preparedStatement = connection.preparedStatement(SQL);
    //上述获取连接之后,等号右边可以翻译为根据连接处理预先准备好的SQL字符串语句。
    //然后把preparedStatement类型的引用变量指向  等号右边返回的对象
    
    • 1
    • 2
    • 3

    3)得到事先准备好的声明之后,对 事先准备好的声明 内 放置 要操作的具体内容!

    即使setString和setInt 方法,

    注意填空的问号下标应该是从1开始的!~


    4)这样一来二去,我们把Statement方法优化成了PreparedStatement方法。好处有2

    4.1)通过事先处理,后面可以填入的内容 鲁棒性增高,代码可复用性增强

    4.2)无特殊要求,百分之九十九点九的开发中程序员都

    使用PreparedStatement来防止数据库注入


    5)接下来就是对预处理操作的具体执行

    5.1) DQL语句 数据查询语言 preparedStatement.ExecuteQuery()

    5.2) DML语句 数据操纵语言 preparedStatement.ExecuteUpdaye()这两个方法。

    Execute the prepared statement翻译过来就是执行准备好的语句!

    在此我们要注意执行所准备的语句如果是select即查询(query)语句,需要返回结果集合 ResultSet类实例化的集合对象。

    **在针对结果集合对象resultSet进行操作时,必须调用其中的next()**方法!!!

    因为next()方法相当于我们获取的操作集合的光标。调用该方法之后,我们能将resultSet结果集里面的对象取出!注意一定要调用这个next方法哦

    如果查询结果集存在,resultSet.next();方法的返回值是true,否则是false;

    因此可以放在if或者while内使用!~

    while(resultSet.next());
    
    if(resultSet.next());
    
    
    ResultSet rs =statement.executeQuery(sql);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    1.5)关闭记录集,关闭声明,关闭连接对象

    1.6)连起来

    在以反射的方式注册驱动从而获取数据库的连接的方法,详情可以参考我以前的博客,因为本文侧重于讲解DataSource连接数据库的方法!所以在此不作赘述~

    1.7)原生方法的不足:

    每次使用都要创建连接,使用完毕后还必须关闭连接,操作繁琐,易出错;
    连接数据库资源不便统一管理;


    三:IDEA中配置jar包

    工欲善其事必先利其器,在前期的学习过程中,我们使用JDBC连接MySQL的时候应该手动配置Jar包

    移步之前的帖子——>配置Java包流程及Jar包下载


    四:url必知必会

    我们在浏览器的地址栏里输入的网站地址叫做URL (Uniform Resource Locator,统一资源定位符)。.就像每家每户都有一个门牌地址一样,每个网页也都有一个Internet地址。

    在使用连接数据库的时候需要先知道数据库的

    连接信息~

    列位您可记住嘞 127.0.0.1 这个地址:就是当前自己电脑的IP地址

    而我们的IP地址 和 端口如何理解

    IP地址就相当于我们点外卖订单所填的地址,端口号就是外卖订单所写的收件人!具体交给谁吃!

    而且这个URL没必要强行记

    URL

    private static final String URL = "jdbc:mysql://127.0.0.1:3306/java16_order_system?characterEncoding=utf8&useSSL=true";
    
    • 1

    jdbc:mysql://127.0.0.1:3306/java16_order_systemcharacterEncoding=utf8&useSSL=true

    放在好找的地方(如gitee码云仓库)等,需要的时候复制粘贴一改就行了!~


    五:datasource获取连接

    package model;
    
    import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
    
    import javax.sql.DataSource;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    
    // DBUtil 本质上是一个管理了单例的 DataSource 的类
    public class DBUtil {
        private static final String URL = "jdbc:mysql://127.0.0.1:3306/java16_order_system?characterEncoding=utf8&useSSL=true";
    //    private static final String URL = "jdbc:mysql://47.98.116.42:3306/java16_order_system?characterEncoding=utf8&useSSL=true";
        private static final String USERNAME = "root";
        private static final String PASSWORD = "rota";
    
        private static volatile DataSource dataSource = null;
    
        public static DataSource getDataSource() {
            if (dataSource == null) {
                synchronized (DBUtil.class) {
                    if (dataSource == null) {
                        dataSource = new MysqlDataSource();
                        ((MysqlDataSource)dataSource).setURL(URL);
                        ((MysqlDataSource)dataSource).setUser(USERNAME);
                        ((MysqlDataSource)dataSource).setPassword(PASSWORD);
                    }
                }
            }
            return dataSource;
        }
    
        // 数据库连接失败是很常见的问题. 如果失败, 后续的操作肯定也是失败的.
        // 如果发现 Connect 为 null, 就说明数据库连接失败, 就需要查看错误信息(Tomcat 的日志)
        // 常见的问题就是, url, username, password 等信息写错了, 或者数据库没有启动.
        public static Connection getConnection() {
            try {
                return getDataSource().getConnection();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            System.out.println("数据库连接失败, 请检查数据库是否启动正确, url 是否正确");
            return null;
        }
    
        public static void close(Connection connection, PreparedStatement statement, ResultSet resultSet) {
            try {
                if (resultSet != null) {
                    resultSet.close();
                }
                if (statement != null) {
                    statement.close();
                }
                if (connection != null) {
                    connection.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64

    需要查看了解上文提到的通过注册驱动获取连接,请移步之前博客:注册驱动获取连接


    由于本人水平有限,只是在学小白一枚。知识的理解难免有不当之处,代码可能存在错误的地方,有任何问题欢迎评论区留言指出,感激不尽!

    创作不易,烦请三连支持一下!~

    Java学习之旅,我们一起学习,共同进步!~

    先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦

  • 相关阅读:
    常见排序算法之冒泡排序
    OSG嵌入QT的简明总结2
    【软件测试】测试老鸟老张,我的梦想是什么?梦想还在吗?
    深度解析为什么做深度学习,都用python,而不用java或者c++
    还在用命令行看日志?快用Kibana吧,可视化日志分析YYDS
    ZYNQ入门
    无线传感器网络:数据链路层,MAC
    document对象概念介绍、验证用户名是否有效、正则表达式对象、两种常见的验证提示效果
    React-Router路由
    TouchGFX之二进制翻译
  • 原文地址:https://blog.csdn.net/m0_67401761/article/details/126080585