• Java连接MySQL数据库


    数据库DataBase,简称DB。

            按照一定的格式存储数据的一些文件的组合。

            顾名思义,存储数据的仓库。实际上就是一些文件,文件中存储了具有特定格式的数据。

    数据库管理系统DataBaseManagement,简称DBMS。

            专门用来管理数据库中的数据。数据库管理系统可以对数据库中的数据进行增删改查。

            常见的数据库管理系统:Mysql、Oracle、MS、SqlServer、DB2

    SQL:结构化查询语言

    程序员编写SQL语句,DBMS执行语句,最终完成数据库路中数据的增删改查。

    即:DBMS --执行--> SQL语句 --操作--> 数据库DB

    MySql具有默认端口号:3306

            端口号port:任何一个软件(应用)都会有的。端口号是应用的唯一代表。

            端口号和IP地址在一块。IP地址用来定位计算机,而端口号用来定位计算机上的某个服务。

            在同一台计算机上,端口号不能重复,具有唯一性。

    数据库中存储数据最基本的单位就是表。任何一张表都有行、列。行被称为数据、列被称为字段。

    SQL语句的分类:

            DQL:数据查询语言,对数据进行查询:select

            DML:数据操作语言,对数据进行增删改:insert、delete、update

            DDL:数据定义语言,对数据进行定义:create、drop、alter

            TCL:事务控制语言,包括事务提交commit、事务回滚rollback

            DCL:数据控制语言,包括授予权限grant、撤销权限revoke

    MySQL服务监听3306端口,因此客户端应该去连接3306端口。

    连接Mysql的指令:mysql -h 主机IP -P 端口 -u 用户名 -p密码

            -p密码中间没有空格

            如果不写-h、-P,默认会是主机的3306端口

            实际工作中,大多不用3306端口号作为Mysql的端口号,因为很容易被攻击。

    JDBC:为访问不同的数据库提供了统一的接口,为使用者屏蔽了细节问题。

            Java程序使用JDBC,可以连接任何提供了JDBC驱动程序的数据库系统·,从而操作数据库。

    JDBC原理示意:

            Java程序如果想要操作不同的数据库,方法不统一,不利于整个程序的管理。

            因此改进:规定一套接口规范,让不同的数据库厂商实现,Java程序中统一调用接口的方法

    即:Mysql、Oracle、DB2、SQL Server等等DBMS实现接口【驱动程序jar文件】

            Java程序中调用接口中的方法完成数据库的连接

    利用JDBC完成对数据库的操作:

    1.在项目下创建lib文件夹,将mysql.jar包拷贝到文件中,并add to project加入到项目中

    2.注册驱动

    1. // 创建Driver对象
    2. Driver driver = new Driver();

    3.得到连接

    1. String url = "jdbc:mysql://127.0.0.1:3306/db01";
    2. // jdbc:mysql:// :表示规定好协议,按照jdbc的方式连接到mysql数据库
    3. // 127.0.0.1 :主机,也可以是localhost,表示连接ip地址
    4. // 3306 :表示监听3306端口
    5. // db01 :表示连接到db01数据库
    6. // 将数据库的用户名、密码放在properties对象中
    7. Properties properties = new Properties();
    8. // 其中,“user”、“password”是规定好的,后面的value值根据实际填写即可。
    9. properties.setProperty("user", "root"); // 用户名
    10. properties.setProperty("password", "kxg"); // 密码
    11. // 建立连接
    12. Connection connection = driver.connect(url, properties);

    4.执行SQL语句

    1. String sql = "insert into actor values(1, 'jack', '男', '1970-1-1', '110');
    2. // Statement对象:用于执行静态的SQL语句并返回其生成的结果对象
    3. Statement statement = connect.createStatement();
    4. // 如果是DML语句,则返回影响的行数。即statement中存放的是执行语句数据库中受影响的行数
    5. int rows = statement.executeUpdate(sql);
    6. // 通过rows判断是否执行成功
    7. System.out.println(rows > 0 ? "成功" : "失败");

    5.关闭资源

    1. statement.close();
    2. connect.close();

    优化:        

            1.可以将数据库的相关信息写入properties配置文件中,通过配置文件读取信息

            2.注册驱动时,通过反射获得类对象,newInstance()获得Driver实例

            3.通过DriverManger代替Driver进行统一管理

    1. // 相关properties配置文件:
    2. user=root
    3. password=kxg
    4. url=jdbc:mysql://localhost:3306/db01
    5. driver=com.mysql.cj.jdbc.Driver
    1. // 连接数据库
    2. // 通过properties对象读取配置文件信息
    3. Properties properties = new Properties();
    4. properties.load(new FileInputStream("src//mysql.properties"));
    5. // 获取配置文件中的相关值
    6. String user = properties.getProperty("user");
    7. String password = properties.getProperty("password");
    8. String driver = properties.getProperty("driver");
    9. String url = properties.getProperty("url");
    10. // 利用反射加载driver类
    11. Class.forName(driver);
    12. // DriverManger创建连接
    13. Connection connection = DriverManger.getConnection(url, user, password);
    14. // 创建statement对象
    15. Statement statement = connection.createStatement();
    16. // 编写SQL语句
    17. String sql = "CREATE TABLE NEWS(id INT AUTO_INCREMENT, content VARCHAR(255), primary key(id));";
    18. // 执行SQL语句
    19. statement.executeUpdate(sql);
    20. // 关闭连接
    21. statement.close();
    22. connect.close();

    介绍JDBC中常用的接口、类及其中的方法:

    DriverManger:驱动管理类

            getConnection(url, user, password):获取与数据库的连接

    Connection接口:

            createStatement():创建Statement对象

            PreparedStatement(sql):生成预处理对象

    Statement接口:

            executeUpdate(sql):执行DML(update、insert、delete)语句,返回受到影响的行数

            executeQuery(sql):执行查询(select)语句,返回ResultSet对象

            execute(sql):执行任意SQL语句,返回布尔值

    1. // 演示SQL注入
    2. // 用户通过输入用户名、密码进行登录
    3. Scanner scanner = new Scanner(System.in);
    4. String name = "";
    5. String pwd = "";
    6. System.out.print("请输入用户名:");
    7. name = scanner.nextLine();
    8. System.out.print("请输入密码:");
    9. pwd = scanner.nextLine();
    10. // 建立与mysql的连接
    11. Properties properties = new Properties();
    12. properties.load(new FileInputStream("src//mysql.properties"));
    13. String user = properties.getProperty("user");
    14. String password = properties.getProperty("password");
    15. String url = properties.getProperty("url");
    16. String driver = properties.getProperty("driver");
    17. Class.forName(driver);
    18. Connection connection = DriverManager.getConnection(url, user, password);
    19. Statement statement = connection.createStatement();
    20. String sql = "select * from admin where name = '" + name + "' and password = '" + pwd + "';";
    21. // 执行SQL语句
    22. ResultSet resultSet = statement.executeQuery(sql);
    23. // 关闭资源
    24. resultSet.close();
    25. statement.close();
    26. connection.close();
    27. // 用户在进行登录时,输入数据库中已经存在的用户名、密码,显示登录成功
    28. // 但是如果用户输入用户名输入的是:"1' or",而密码输入的是"or '1' = '1"时,也可登录成功
    29. // 这就是SQL注入,同时 or '1' = '1 也被称为万能密码。

    PreparedStatement接口:

            executeUpdate(sql):执行DML(update、insert、delete)语句,返回受到影响的行数

            executeQuery(sql):执行查询(select)语句,返回resultSet对象

            execute(sql):执行任何SQL语句,返回布尔值

            setObject(占位符索引, 占位符的值):解决SQL注入的问题

    1. // prepareStatement:预处理,可以解决statement中的SQL注入问题
    2. Scanner scanner = new Scanner(System.in);
    3. String name = "";
    4. String pwd = "";
    5. System.out.print("请输入用户名:");
    6. name = scanner.nextLine();
    7. System.out.print("请输入密码:");
    8. pwd = scanner.nextLine();
    9. // 获取相关值
    10. Properties properties = new Properties();
    11. properties.load(new FileInputStream("src//mysql.properties"));
    12. String user = properties.getProperty("user");
    13. String password = properties.getProperty("password");
    14. String url = properties.getProperty("url");
    15. String driver = properties.getProperty("driver");
    16. // 注册驱动
    17. Class.forName(driver);
    18. // 得到连接
    19. Connection connection = DriverManager.getConnection(url, user, password);
    20. // 组织SQL语句
    21. String sql = "select * from admin where name = ? and password = ?;"; // ?:相当于占位符
    22. // 创建prepareStatement对象,并且与SQL语句建立连接
    23. PreparedStatement preparedStatement = connection.preparedStatement(sql);
    24. // 赋值操作
    25. preparedStatement.setString(1, name); // sql语句中第一个?补成name
    26. preparedStatement.setString(2, pwd); // SQL语句中第二个?补成pwd
    27. // 接收结果集
    28. ResultSet resultSet = preparedStatement.executeQuery();
    29. // 关闭连接
    30. resultSet.close();
    31. preparedStatement.close();
    32. connection.close();

    ResultSet结果集:

            (光标一开始指向的是表格的最上面-第一行的上面(表头))

            next():光标向下移动一行,如果没有下一行,返回false

            previous():光标向上移动一行

            getObject(列的索引/列名):返回对应列的值,接收类型为object

    1. // 通过ResultSet遍历表中的数据
    2. // resultSet.next():光标向后移动,如果没有下一行,则直接返回false
    3. while (resultSet.next()) {
    4. // 得到每一行的数据
    5. int id = resultSet.getInt(1);
    6. String name = resultSet.getString(2);
    7. String sex = resultSet.getString(3);
    8. String birth = resultSet.getString(4);
    9. String phone = resultSet.getString(5);
    10. System.out.println(id + "\t" + name + "\t" + sex + "\t" + birth + "\t" + phone);
    11. }
  • 相关阅读:
    公众号选题方向有哪些?
    BSP视频教程第28期:CANopen主从机组网实战,CAN词典工具使用方法以及吃透PDO玩法
    阿里云oss丨NoSuchKey图片水印报错
    【苹果家庭推iMessage位置推】ActiveMQ先前与AMQ.JS(基于旋转)一起使用
    可观测性-Event-埋点数据模型
    04-云计算安全
    【Computer Vision】基于卷积神经网络实现美食分类
    linux更换常用软件的默认缓存路径(.conda, .huggingface等)
    mysql
    将本地构建的镜像推送到远程镜像库,构建多种系统架构支持的Docker镜像并推送到Docker Hub
  • 原文地址:https://blog.csdn.net/m0_63404275/article/details/127885509