广告
返回顶部
首页 > 资讯 > 数据库 >Java连接mysql数据库
  • 868
分享到

Java连接mysql数据库

数据库mysqljavajdbcsql注入 2023-08-16 13:08:06 868人浏览 薄情痞子
摘要

文章目录 一、Java连接mysql数据库1.1 流程1.2 一个测试连接的java程序 二、优化:创建一个工具类2.1 存在的问题2.2 创建配置文件和工具类2.3 测试使用工具类进行CRUD操作 三、SQL注入问题3.1

一、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表下面的三条记录。
在这里插入图片描述

二、优化:创建一个工具

2.1 存在的问题

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

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

2.2 创建配置文件和工具类

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

driver=com.mysql.cj.jdbc.Driverurl=jdbc:mysql://localhost:3306/shop?useUnicode=true&characterEncoding=utf8&useSSL=falseuser=rootpassword=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);        }    }}

在这里插入图片描述

四、使用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

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);        }    }}

来源地址:https://blog.csdn.net/qq_46480020/article/details/127605538

您可能感兴趣的文档:

--结束END--

本文标题: Java连接mysql数据库

本文链接: https://www.lsjlt.com/news/371312.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java连接mysql数据库
    文章目录 一、Java连接mysql数据库1.1 流程1.2 一个测试连接的java程序 二、优化:创建一个工具类2.1 存在的问题2.2 创建配置文件和工具类2.3 测试使用工具类进行CRUD操作 三、SQL注入问题3.1...
    99+
    2023-08-16
    数据库 mysql java jdbc sql注入
  • Java怎么连接MySQL数据库
    今天小编给大家分享一下Java怎么连接MySQL数据库的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。首先说明,由于是8版本的...
    99+
    2023-06-29
  • java如何连接mysql数据库
    这篇文章主要介绍java如何连接mysql数据库,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!java如何连接mysql数据库?1. 下载安装eclipse软件,以及准备“...
    99+
    2022-10-18
  • Java连接MySQL数据库实例
    首先说明,由于是8版本的数据库,所以配置类的写法上与5版本的有所区别,需要注意,同时用idea或eclipse时需要导入jar包,jar包的下载链接: https://dev.mys...
    99+
    2022-11-13
  • MySQL数据库 JDBC 编程(Java 连接 MySQL)
    目录1. 数据库编程的基础条件2. Java 的数据库编程:JDBC3. JDBC 访问数据库的层次结构4. MySQL 数据库操作介绍5. MySQL 驱动包的下载及添加到项目6....
    99+
    2022-11-12
  • java连接MySQL数据库的代码
    本文实例为大家分享了java连接MySQL数据库的具体代码,供大家参考,具体内容如下package connect; import java.sql.Connection; import java.sql.DriverManager; ...
    99+
    2023-05-31
    java mysql ava
  • mysql 连接数据库
    1、首先启动mysql 并链接数据 小意思吧!都会了是吧    mysql -uroot -p //连接数据    net start mysql /...
    99+
    2022-05-21
    连接数据库 mysql
  • Mysql最后补充+Java连接数据库
    Truncate table 表名直接删除表中全部数据,与delete不同的是,此方法无法使用where选择,只能全部删除。 truncate table users;&nbs...
    99+
    2022-10-18
  • java中ATM与数据库Mysql的连接
    import java.sql.*;  import java.util.*;  public class ATM1 ...
    99+
    2022-10-18
  • Node.js 连接 mysql 数据库
    目录 一、安装驱动 二、连接数据库 1、数据库连接的配置信息 数据库连接参数说明 2、封装 mysql 的执行语句 3、后端路由文件  三、数据库操作( CURD ) 1、查询数据 2、插入数据 3、更新数据 4、删除数据 4、获取受影响的...
    99+
    2023-09-09
    mysql 数据库 node.js
  • python连接MySQL数据库
    模块功能:connect()方法 * connect()方法用于连接数据库,返回一个数据库连接对象。如果要连接一个位于host.remote.com服务器上名为fourm的MySQL数据库,连接串可以这样写: ...
    99+
    2023-01-31
    数据库 python MySQL
  • JSP连接MySQL数据库
    ✅作者简介:热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏:JAVA开发者成长之路 ✨...
    99+
    2023-08-16
    java mysql tomcat
  • Python3 连接Mysql数据库
    初学Python ,目前无论是电子书还是网上的教程,都是针对于python2.7,但是对于部分语法以及模块都有变化。比如urllib2是python自带的模块,不需要下载。urllib2在python3.x...
    99+
    2022-10-18
  • php连接mysql数据库
        连接数据库:使用面向对象的方法;1.造一个mysqli对象,造连接对象2.准备一条SQL语句3.执行SQL语句,如果是查询语句。成功返回结果及对象4.从结果集...
    99+
    2022-10-18
  • jdbc连接MySql数据库
    jdbc连接MySql数据库 package com.zhy; import com.mysql.jdbc.Driver; import java.sql.*; public class TestJdbc { publi...
    99+
    2020-09-18
    jdbc连接MySql数据库 数据库入门 数据库基础教程 数据库 mysql
  • python3连接MySQL数据库
    环境:python 3.6.1 + mysql 5.1 Python3 支持用 pymysql 模块来链接数据库 1、pymysql安装 windows下:pip install pymysql 直接安装 官方文档:http://...
    99+
    2023-01-31
    数据库 MySQL
  • idea连接MySQL数据库
    文章目录 前言一、idea创建连接MySQL操作步骤 二、配置连接参数操作步骤 总结 前言 提示:idea连接数据库前,先需要查看自己数据库安装、配置是否完成: 1.打开mysql命令控制台 2.输入密码,到如下页面...
    99+
    2023-08-17
    mysql intellij-idea 数据库
  • C#连接MySQL数据库
    目录 一、引用MySql.Data.dll文件 二、连接、关闭数据库 三、数据库增删改查 附:完整代码 一、引用MySql.Data.dll文件 创建C#窗体应用程序,解决方案资源管理器中找到“引用”,右键,选择添加引用。 在MyS...
    99+
    2023-10-28
    c# 数据库 mysql
  • Python 连接 MySQL 数据库
    在实际数据分析和建模过程中,我们通常需要从数据库中读取数据,并将其转化为 Pandas dataframe 对象进行进一步处理。而 MySQL 数据库是最常用的关系型数据库之一,因此在 Python 中如何连接 MySQL 数据库并查询数据...
    99+
    2023-08-16
    python
  • C# 连接 MySQL 数据库
    目录 一、需求 二、新建 C# 项目 三、MySQL数据库 四、MySqlHelper 五、测试 一、需求 C# 使用 MySQL 数据库的情况还是比较少的,大部分使用 Windows 平台一般使用 SQL Server,在两年前我...
    99+
    2023-09-02
    c# 数据库
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作