• JDBC之在IDEA中连接mysql


    目录

    创建工程,导入驱动jar包

    注册驱动

    获取连接

    定义SQL语句

    获取执行SQL对象

    执行SQL

    处理返回结果

    释放资源

    配置

     获取连接

     换了个方法一:出现第三方库API

    方法二:反射实例化Driver

     方法三:使用DriverManager实现数据库的连接。体会获取连接必要的4个基本要素。

    方法四:可以只是加载驱动,不用显示的注册驱动过了

    ​编辑

    方法五:(final版):将数据库连接需要的4个基本信息声明在配置文件中,通过读取配置文件的方式,获取连接


    • 创建工程,导入驱动jar包

    我的idea是8.0.30版本,所以驱动包也是对应版本

    • 注册驱动

      Class.forName("com.mysql.jdbc.Driver");

    • 获取连接

      Connection conn = DriverManager.getConnection(url, username, password);

      Java代码需要发送SQL给MySQL服务端,就需要先建立连接

    • 定义SQL语句

    String sql =update…” ;
    • 获取执行SQL对象

    执行SQL语句需要SQL执行对象,而这个执行对象就是Statement对象

    Statement stmt = conn.createStatement();
    • 执行SQL

    stmt.executeUpdate(sql);  
    • 处理返回结果

    • 释放资源

    配置

    ### 具体操作

    * 创建新的新的项目 

     * 定义项目的名称,并指定位置

     * 对项目进行设置,JDK版本、编译版本

     选中项目→右键→打开模块设置(F4)

    * 创建模块,指定模块的名称及位置

     

    * 导入驱动包 

      将mysql的驱动包放在模块下的lib目录(随意命名)下,并将该jar包添加为库文件

    复制驱动包mysql-connector-java-8.0.30.jar到刚刚创建的lib里

     选中启动,右键→添加为库

    * 在添加为库文件的时候,有如下三个选项(生效范围)
      * Global Library  : 全局有效
      * Project Library :   项目有效
      * Module Library : 模块有效(选中这个)

     获取连接

    * 在src下创建类

     

    * 编写代码如下

    1. package com.jdbc;
    2. import java.sql.Connection;
    3. import java.sql.DriverManager;
    4. import java.sql.Statement;
    5. /**
    6. * @author 乱码酱
    7. * @date :2022-09-20 10:02
    8. * @program: JDBC
    9. * @create:JDBC快速入门
    10. */
    11. public class JDBCdemo {
    12. public static void main(String[] args) throws Exception {
    13. //1. 注册驱动
    14. // Class.forName("com.mysql.jdbc.Driver");
    15. //2. 获取连接
    16. String url = "jdbc:mysql://127.0.0.1:3306/db1";
    17. String username = "root";
    18. String password = "1234";
    19. Connection conn = DriverManager.getConnection(url, username, password);
    20. //3. 定义sql
    21. String sql = "update account set pasword = 111 where id = 1";
    22. //4. 获取执行sql的对象 Statement
    23. Statement stmt = conn.createStatement();
    24. //5. 执行sql
    25. int count = stmt.executeUpdate(sql);//受影响的行数
    26. //6. 处理结果
    27. System.out.println(count);
    28. //7. 释放资源
    29. stmt.close();
    30. conn.close();
    31. }
    32. }

     

     不出意外的话应该是出了意外

    报错:

    Exception in thread "main"java.sql.sQLException:Access denied for user 'root '@ localhost’ (using password: YES) 线程“main”中的异常java.sql.sQLException:拒绝用户‘root’@localhost‘的访问(使用密码:YES)

    新版本类名前要加“cj.”,加上还是报错

     换了个方法一:出现第三方库API

     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.
    java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)

    加载类com.mysql.jdbc.Driver。‘com.mysql.cj.jdbc.Driver’这个驱动程序是通过SPL自动注册的,手动加载驱动程序类通常是不必要的。

    //解决方法
    把com.mysql.jdbc.Driver 改为com.mysql.cj.jdbc.Driver 即可

     java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)

    数据库抛出一个异常: 用户使用密码访问数据库时遭到拒绝

    解决思路:

    1. 密码错误,重设数据库密码再登录

    2. 数据库并没有给你分配足够的权限

    仔细一想我的mysql密码终于想起来了,登录上了

    完整代码:

    1. public class ConnectionTest {
    2. @Test
    3. public void testConnection1()throws SQLException {
    4. try {
    5. //1.提供java.sql.Driver接口实现类的对象
    6. Driver driver = new com.mysql.cj.jdbc.Driver();
    7. //2.提供url,指明具体操作的数据
    8. String url = "jdbc:mysql://localhost:3306/jdbc";
    9. //jdbc :mysql:协议
    10. //localhost :ip地址
    11. //3306:默认mysql的端口号
    12. //jdbc:jdbc数据库
    13. //3.提供Properties的对象,指明用户名和密码
    14. Properties info = new Properties();
    15. info.setProperty("user", "root");
    16. info.setProperty("password", "123321");
    17. //4.调用driver的connect(),获取连接
    18. Connection conn = driver.connect(url, info);
    19. System.out.println(conn);
    20. } catch (SQLException e) {
    21. e.printStackTrace();
    22. }
    23. }
    24. }

    说明:上述代码中显式出现了第三方数据库的API

    方法二:反射实例化Driver

    1. // 方法二:反射实例化Driver
    2. @Test
    3. public void testConnection2() throws Exception {
    4. // 一开始是 ClassNotFoundException,去掉前缀,使其范围扩大
    5. try {
    6. //1.使用反射获取Driver实现类对象
    7. Class clazz = Class.forName("com.mysql.cj.jdbc.Driver");
    8. Driver driver = (Driver) clazz.newInstance();
    9. // 2.提供要连接的数据库
    10. String url = "jdbc:mysql://localhost:3306/jdbc";
    11. //3.提供Properties的对象,指明用户名和密码
    12. Properties info = new Properties();
    13. info.setProperty("user", "root");
    14. info.setProperty("password", "123321");
    15. //4.调用driver的connect(),获取连接
    16. Connection conn = driver.connect(url, info);
    17. System.out.println(conn);
    18. } catch (SQLException e) {
    19. e.printStackTrace();
    20. }
    21. }

     方法三:使用DriverManager实现数据库的连接。体会获取连接必要的4个基本要素。

    1. // 方法三:使用DriverManager实现数据库的连接。体会获取连接必要的4个基本要素。
    2. @Test
    3. public void testConnection3() throws Exception {
    4. // 一开始是 ClassNotFoundException,去掉前缀,使其范围扩大
    5. try {
    6. //1.使用反射获取Driver实现类对象
    7. Class clazz = Class.forName("com.mysql.cj.jdbc.Driver");
    8. Driver driver = (Driver) clazz.newInstance();
    9. // 2.提供另外三个连接的基本信息
    10. String url = "jdbc:mysql://localhost:3306/jdbc";
    11. String user = "root";
    12. String password = "123321";
    13. //3.注册驱动
    14. DriverManager.registerDriver(driver);
    15. // 4.获取连接
    16. Connection conn = DriverManager.getConnection(url, user, password);
    17. System.out.println(conn);
    18. } catch (SQLException e) {
    19. e.printStackTrace();
    20. }
    21. }

    方法四:可以只是加载驱动,不用显示的注册驱动过了

    说明:不必显式的注册驱动了。因为在DriverManager的源码中已经存在静态代码块,实现了驱动的注册。

    1. // 方法四:可以只是加载驱动,不用显示的注册驱动过了
    2. @Test
    3. public void testConnection4() throws Exception {
    4. // 一开始是 ClassNotFoundException,去掉前缀,使其范围扩大
    5. // 1.提供数据库连接的4个基本要素
    6. String url = "jdbc:mysql://localhost:3306/jdbc";
    7. String user = "root";
    8. String password = "123321";
    9. String driverName = "com.mysql.cj.jdbc.Driver";
    10. //2.加载Driver实现类对象
    11. Class clazz = Class.forName("com.mysql.cj.jdbc.Driver");
    12. // 相较于方法三,可以省略如下操作:
    13. // Driver driver = (Driver) clazz.newInstance();
    14. // //3.注册驱动
    15. // DriverManager.registerDriver(driver);
    16. /*
    17. 可以注释掉上述代码的原因,是因为在mysql的Driver类中声明有:
    18. static {
    19. try {
    20. DriverManager.registerDriver(new Driver());
    21. } catch (SQLException var1) {
    22. throw new RuntimeException("Can't register driver!");
    23. }
    24. }
    25. */
    26. // 4.获取连接
    27. Connection conn = DriverManager.getConnection(url, user, password);
    28. System.out.println(conn);
    29. }

    方法五:(final版):将数据库连接需要的4个基本信息声明在配置文件中,通过读取配置文件的方式,获取连接

    *此种方式的好处?
    *1.实现了数据与代码的分离。实现了解耦
    *2.如果需要修改配置文件信息,可以避免程序重新打包

    其中,配置文件声明在工程的src目录下:【jdbc.properties】

    src右键→新建→文件jdbc.properties

    1. #提供数据库连接的4个基本要素
    2. url = jdbc:mysql://localhost:3306/jdbc
    3. user = root
    4. password = 123321
    5. driverClass = com.mysql.cj.jdbc.Driver

    1. //方式五(final版):将数据库连接需要的4个基本信息声明在配置文件中,通过读取配置文件的方式,获取连接
    2. /*此种方式的好处?
    3. *1.实现了数据与代码的分离。实现了解耦
    4. *2.如果需要修改配置文件信息,可以避免程序重新打包。*/
    5. @Test
    6. public void testConnection5() throws Exception {
    7. InputStream is = JDBCdemo.class.getClassLoader().getResourceAsStream("jdbc.properties");
    8. Properties pros = new Properties();
    9. pros.load(is);
    10. //2.读取配置信息
    11. String user = pros.getProperty("user");
    12. String password = pros.getProperty("password");
    13. String url = pros.getProperty("url");
    14. String driverClass = pros.getProperty("driverClass");
    15. //3.加载驱动
    16. Class.forName(driverClass);
    17. //4.获取连接
    18. Connection conn = DriverManager.getConnection(url,user,password);
    19. System.out.println(conn);
    20. }

    说明:使用配置文件的方式保存配置信息,在代码中加载配置文件

    **使用配置文件的好处:**

    ①实现了代码和数据的分离,如果需要修改配置信息,直接在配置文件中修改,不需要深入代码
    ②如果修改了配置信息,省去重新编译的过程。

    最终结果:

  • 相关阅读:
    .Net使用Elastic.Clients.Elasticsearch在Elasticsearch8中实现向量存储和相似度检索
    Dockerfile命令详细讲解
    好的代码是优质资产、莫让代码成为负债
    phpstudy+sql注入靶场环境搭建中的几个坑
    第5章 验证码识别
    uniapp如何根据不同角色自定义不同的tabbar
    8个免费高清图片素材网站,再也不用担心侵权了。
    ES13的11个超赞的新属性
    【开源】基于Vue和SpringBoot的网上药店系统
    BrokenPipeError错误和python subprocess.run()超时参数在Windows上无效
  • 原文地址:https://blog.csdn.net/clover_oreo/article/details/126946273