Java连接mysql数据库

这篇具有很好参考价值的文章主要介绍了Java连接mysql数据库。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、Java连接mysql数据库

1.1 流程

java连接mysql大致需要这六步:

  1. 导入驱动包:这里我使用的是mysql-connector-java-8.0.17.jar(点击下载),这个包连接mysql5.6,5.7,8.0版本都没问题。
    Class.forName("com.mysql.cj.jdbc.Driver");
  2. url和账户名密码
    JDBC连接串:jdbc:mysql://<地址>:<端口>/<数据库>
  3. 获取连接DriverManager.getConnection(url, user, password);
  4. 执行sql的Statement对象connection.createStatement();
  5. 执行SQL
  6. 释放连接

1.2 一个测试连接的java程序

JdbcFirstDemo.java

package com.peng.less01;

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

public class JdbcFirstDemo {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        // 1.导入驱动类
        Class.forName("com.mysql.cj.jdbc.Driver");
        // 2.用户信息和url
        String url = "jdbc:mysql://localhost:3306/shop?useUnicode=true&characterEncoding=utf8&useSSL=false";
        String user = "root";
        String password = "12345678";
        // 3.获取连接
        Connection conn = DriverManager.getConnection(url, user, password);
        // 4.执行SQL的对象
        Statement sta =  conn.createStatement();
        // 5.执行SQL
        String sql = "select * from account";
        ResultSet rs = sta.executeQuery(sql);
        while (rs.next()){
            System.out.println("id= " + rs.getObject("id"));
            System.out.println("name= " + rs.getObject("name"));
            System.out.println("money= " + rs.getObject("money"));
            System.out.println("=========================================");
        }
        // 6.释放连接
        rs.close();
        sta.close();
        conn.close();
    }
}

这里使用的是VScode,connector包放到了lib目录下,代码放在了src/com/peng/less01下。
执行结果如下,显示了shop.account表下面的三条记录。
java连接mysql数据库,JAVA,数据库,mysql,java,jdbc,sql注入

二、优化:创建一个工具类

2.1 存在的问题

1、JDBC连接串,用户名,密码等都存在于代码中,需要进行解耦

2、创建连接,释放连接这些操作都是固定的,没必要每次都重复写这些代码(创建函数解决

2.2 创建配置文件和工具类

src/db.properties 文件中记录driver,url,user,password

driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/shop?useUnicode=true&characterEncoding=utf8&useSSL=false
user=root
password=12345678

src/com/peng/less02/utils/JdbcUtils.java 工具类:读取properties配置文件
自动读取配置信息,加载mysql驱动。

package com.peng.less02.utils;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

// 这是一个工具类,用来减少重复操作
public class JdbcUtils {

    private static String driver = null;
    private static String url = null;
    private static String user = null;
    private static String password = null;
    static{
        
        try{
            // 读取db.properties
            InputStream in = JdbcUtils.class.getClassLoader().getResourceAsStream("db.properties");
            Properties properties = new Properties();
            properties.load(in);
            driver = properties.getProperty("driver");
            url = properties.getProperty("url");
            user = properties.getProperty("user");
            password = properties.getProperty("password");

            // 加载驱动
            Class.forName(driver);  
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    // 创建连接
    public static Connection getConnection() throws SQLException{
        return DriverManager.getConnection(url,user,password);
    }
    // 释放连接
    public static void releaseConnection(Connection conn, Statement sta, ResultSet rs){
        if (rs != null){
            try {
                rs.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        if (sta != null){
            try {
                sta.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        if (conn != null){
            try {
                conn.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

}

2.3 测试使用工具类进行CRUD操作

测试插入操作
src/com/peng/less02/TestInsert.java

package com.peng.less02;

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

import com.peng.less02.utils.JdbcUtils;

public class TestInsert {
    public static void main(String[] args) {
        Connection conn = null;
        Statement sta = null;
        ResultSet rs = null;
        try {
            conn = JdbcUtils.getConnection();
            sta = conn.createStatement();
            String sql = "insert into account(`id`,`name`,`money`) values(4,'药水哥',4698888)";
            int i = sta.executeUpdate(sql);
            if (i > 0){
                System.out.println("插入成功!");
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            JdbcUtils.releaseConnection(conn, sta, rs);
        }
    }
    
}

测试更新操作
src/com/peng/less02/TestUpdate.java

package com.peng.less02;
import java.sql.*;
import com.peng.less02.utils.JdbcUtils;

public class TestUpdate {
    public static void main(String[] args) {
        Connection conn = null;
        Statement sta = null;
        try {
            conn = JdbcUtils.getConnection();
            sta = conn.createStatement();
            String sql = "update account set `money`=238888 where id=3";
            int i = sta.executeUpdate(sql);
            if (i > 0){
                System.out.println("更新成功");
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            JdbcUtils.releaseConnection(conn, sta, null);
        }
    }
    
}

测试读取操作

package com.peng.less02;
import java.sql.*;
import com.peng.less02.utils.JdbcUtils;

public class TestSelect {
    public static void main(String[] args) {
        Connection conn = null;
        Statement sta = null;
        ResultSet rs = null;

        try {
            conn = JdbcUtils.getConnection();
            sta = conn.createStatement();
            String sql = "select * from account";
            rs = sta.executeQuery(sql);
            while (rs.next()){
                System.out.println("id= " + rs.getInt("id"));
                System.out.println("name= " + rs.getString("name"));
                System.out.println("money= " + rs.getObject("money"));
                System.out.println("======================================================");
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            JdbcUtils.releaseConnection(conn, sta, rs);
        }
    }

}

三、SQL注入问题

这里写一个登录认证程序如果账号,密码输入正确则允许登录。为了测试,这里的允许登录改为输出账号密码。

还使用前面写的JdbcUtils工具类

可以看到,这里我输入的用户名/密码是:’ or '1=1     ’ or '1=1
然后输出了user表中的所有数据,这明显是不合法的。存在sql注入的问题

问题就在于这段代码,sql是拼接而成的。

String sql = "select * from user where `username`='" + username + "' and `password`='" + password + "'";

拼接的sql为:select * from user where `username`='' or '1=1' and `password`='' or '1=1';

3.1 SQL注入示例

SqlInjection.java

package com.peng.less02;

import com.peng.less02.utils.JdbcUtils;
import java.sql.*;
public class SqlInjection {
    public static void main(String[] args) {
        login("' or '1=1", "' or '1=1");
    }

    // 登录功能
    public static void login(String username, String password){
        Connection conn = null;
        Statement sta = null;
        ResultSet rs = null;

        try {
            conn = JdbcUtils.getConnection();
            sta = conn.createStatement();
            //这段代码中sql是变量拼接而成的
            String sql = "select * from user where `username`='" + username + "' and `password`='" + password + "'";
            rs = sta.executeQuery(sql);
            //输入正确的账号密码就能够登录,这里为了测试就(输入正确输出账号密码)
            while (rs.next()){
                System.out.println("id= " + rs.getInt("id"));
                System.out.println("username= " + rs.getString("username"));
                System.out.println("password= " + rs.getObject("password"));
                System.out.println("======================================================");
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            JdbcUtils.releaseConnection(conn, sta, rs);
        }
    }
}

java连接mysql数据库,JAVA,数据库,mysql,java,jdbc,sql注入

四、使用PreparedStatement防止SQL注入

  • 使用PreparedStatement,防止SQL注入,同时对于执行多次的SQL更加高效

PreparedStatement对sql进行了预编译,传入的参数只会被当作字符串来处理,而不会像前面对sql进行了拼接。

流程如下:

先编写sql --> 进行预编译 --> 增加sql参数值 --> 执行sql

SqlInjection.java

package com.peng.less03;

import com.peng.less02.utils.JdbcUtils;
import java.sql.*;

public class SqlInjection {
    public static void main(String[] args) {
        // login("'' or 1=1", "'' or 1=1");
        login("张三", "zhangsan");
    }

    // 登录功能
    public static void login(String username, String password){
        Connection conn = null;
        PreparedStatement psta = null;
        ResultSet rs = null;

        try {
            conn = JdbcUtils.getConnection();
            //这里使用 ? 占位符来代替
            String sql = "select * from user where `username`=? and `password`=?";
            //使用PreparedStatement,防止SQL注入,同时对于执行多次的SQL更加高效
            psta = conn.prepareStatement(sql);
            psta.setString(1,username);
            psta.setObject(2,password);
            rs = psta.executeQuery();
            //输入正确的账号密码就能够登录,这里为了测试就(输入正确输出账号密码)
            while (rs.next()){
                System.out.println("id= " + rs.getInt("id"));
                System.out.println("username= " + rs.getString("username"));
                System.out.println("password= " + rs.getObject("password"));
                System.out.println("======================================================");
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            JdbcUtils.releaseConnection(conn, psta, rs);
        }
    }
}

五、JDBC操作事务

和用sql执行事务类似,创建连接后setAutoCommit(false),最后commit(),失败则rollback()
注意:rollback()部分可以不用写,事务失败会自动回滚。

TestTransaction.java文章来源地址https://www.toymoban.com/news/detail-780751.html

package com.peng.less04;
import java.sql.*;

// 仍然使用前面写的JdbcUtils工具类
import com.peng.less02.utils.JdbcUtils;

public class TestTransaction {
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement pst = null;
        
        try {
            conn = JdbcUtils.getConnection();
            // 关闭自动提交,开启事务
            conn.setAutoCommit(false);
            //模拟一个转账事务,A向大帅哥转账100块
            String sql1 = "update account set `money`=money - 100 where `name`='A'";
            pst = conn.prepareStatement(sql1);
            pst.executeUpdate();

            // int x = 1/0;
            String sql2 = "update account set `money`=money + 100 where `name`='大帅哥'";
            conn.prepareStatement(sql2).executeUpdate();

            conn.commit();
            System.out.println("Success!");
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            try {
                // rollback()可以不用写,失败的话会自动回滚
                conn.rollback();
            } catch (SQLException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
            e.printStackTrace();
        }finally{
            JdbcUtils.releaseConnection(conn, pst, null);
        }
    }
}

到了这里,关于Java连接mysql数据库的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • java代码实现,利用JDBC接口-连接Mysql数据库

    java代码实现,利用JDBC接口-连接Mysql数据库

    1、JDBC本质上是一个接口,也就是java语言操作数据库的一套API(应用程序编程接口), 接口就规则,也就是sun公司创建了一个jdbc接口,各个sql(数据库管理系统)去实现接口提供jar包。其优点JDBC不是指单一操作某一个数据库。各个厂商使用相同的接口。不同的sql厂家实现

    2024年02月09日
    浏览(38)
  • 【Java】IntelliJ IDEA使用JDBC连接MySQL数据库并写入数据

    【Java】IntelliJ IDEA使用JDBC连接MySQL数据库并写入数据

    在 IntelliJ IDEA 中连接 MySQL 数据库并将数据存储在数据表中,使用 Java 和 JDBC(Java Database Connectivity)实现。 下载并安装 IntelliJ IDEA 下载并安装 MySQL 数据库 下载 MySQL Connector/J 驱动程序(JDBC 驱动程序) 使用 Navicat 创建一个 MySQL 数据库 打开 IntelliJ IDEA。 选择 \\\"File\\\"→ “New” →

    2024年02月05日
    浏览(28)
  • java中连接数据库com.mysql.jdbc.Driver和com.mysql.cj.jdbc.Driver的区别?

    com.mysql.jdbc.Driver 和 com.mysql.cj.jdbc.Driver 是MySQL数据库连接驱动的不同版本。 com.mysql.jdbc.Driver :这是旧版的MySQL JDBC驱动(版本5.x)。它已经过时,不再推荐使用。如果您使用较旧的MySQL版本(如MySQL 5.7及以下),可以考虑使用此驱动。但请注意,该驱动在MySQL 8.0及更高版本上可

    2024年02月14日
    浏览(41)
  • JDBC 技术 | Java连接MySQL数据库(四万字零基础保姆级超全详解)

    JDBC 技术 | Java连接MySQL数据库(四万字零基础保姆级超全详解)

    管他啥是啥,看就完了!如果觉得博主写的不错,可以点赞关注支持一下博主哦!有什么地方存在不足或者错误的,烦请各位大佬在评论区指正。万分感谢!! 本文结合了韩顺平零基础学java,黑马程序员零基础学 JavaWeb,等多个视频的相关知识内容整理而来。花费了很多很多

    2024年02月05日
    浏览(36)
  • java通过JDBC连接mysql8.0数据库,并对数据库中的表进行增删改查操作

    java通过JDBC连接mysql8.0数据库,并对数据库中的表进行增删改查操作

    目录 一、JDBC简介 二、添加依赖 三、JDBC操作数据库的步骤 四、JDBC操作数据库——增删改查 (一)新增数据 (二)删除数据 (三)修改数据 (四)查询数据 (五)多表连接查询         Java数据库连接,(Java Database Connectivity,简称JDBC)是java语言中用来规范客户端程序如何来访问数

    2024年02月03日
    浏览(289)
  • JAVA连接数据库 JDBC编程

    JAVA连接数据库 JDBC编程

    提供修改数据库和查询数据库的代码,两者只有很细微的差别         注意在进行连接数据库首先你得下载你对应MYSQL版本的JDBC驱动包,比如MYSQL8.0版本的你就要下载MYSQL8.0版本的JDBC驱动包,MYSQL5.1版本的你就要下载MYSQL5.1版本的JDBC驱动包 我下载的8.0版本的驱动包就是这个

    2024年02月15日
    浏览(43)
  • 【大数据笔记】java jdbc连接hive数据库;java hive连接kerberos

    【大数据笔记】java jdbc连接hive数据库;java hive连接kerberos

    1、pom.xml配置         dependency             groupIdorg.apache.hive/groupId             artifactIdhive-jdbc/artifactId             scope2.1.1/scope         /dependency 2、驱动 org.apache.hive.jdbc.HiveDriver 3、用传统改的Class.forName,然后DriverManager去拿。 二、java hive连接kerberos

    2024年01月19日
    浏览(14)
  • Java-JDBC连接数据库

    Java-JDBC连接数据库

    目录 一、JDBC开发步骤 1.Java程序连接数据库 1.1引入MySQL驱动包 1.2Java连接MySQL步骤 2 实现增删改查操作 2.1 添加数据 2.2 修改数据 2.3 删除数据 2.4 查询数据 二、JDBC处理相关问题 1 解决SQL注入问题 1.1、问题演示 1.2、解决问题 2 JDBC事务处理 3 获取自增长键值 4 批处理操作 1.1 引入

    2024年02月09日
    浏览(41)
  • 【Java 进阶篇】深入理解 JDBC:Java 数据库连接详解

    【Java 进阶篇】深入理解 JDBC:Java 数据库连接详解

    数据库是现代应用程序的核心组成部分之一。无论是 Web 应用、移动应用还是桌面应用,几乎都需要与数据库交互以存储和检索数据。Java 提供了一种强大的方式来实现与数据库的交互,即 JDBC(Java 数据库连接)。本文将深入探讨 JDBC 的各个方面,从基本概念到实际编程示例

    2024年02月07日
    浏览(14)
  • 通过JDBC连接数据库并用Java把数据写入数据库

    通过JDBC连接数据库并用Java把数据写入数据库

    目录 1.新建项目 2.在src包下新建lib包,用来存放jar包(下载对应jar包复制到lib包里) 3.右键导入的jar包,找到并单击\\\"添加到库\\\"(add....) 4.在src包下新建bean包,新建class类 5.class类中写数据库表中对应的列名的set get方法、空参、有参(String方法)注意:类名为私有类(private),新建类时数

    2024年02月02日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包