• JDBC在IDEA中配置mysql过程及编程详解


    目录

    jdbc编程简介

    1.导入jar包

    2.建立数据库连接 

    2.1 创建数据源,描述数据库服务器在哪

    2.2 实现一个mysql客户端,通过网络和服务器进行通信

    3.使用代码操作数据库

    3.1 增删改操作

    增加操作

    更新操作

    删除操作

    3.2 查询操作

    4.断开连接,释放资源


    jdbc编程简介

    JDBC,Java Database Connectivity ,java数据库连接.是一种执行SQL语句的API,是java中数据库连接规范,这个API由java.sql.*,javax.sql.*包中的一些类和接口组成,它为Java开发人员操作数据库提供了一个标准的API,可以为多种关系数据库提供统一访问

    1.导入jar包

    jar包下载地址:

    https://mvnrepository.com/

    1.输入地址->输入mysql搜素

    32c9b8dc5c9e46e4832e288a4c93b468.png

    2.点击第一个后选择版本

    352d535adc0144de92b138595e73f842.png3.选择版本和本机mysql大版本相同的 jar包

    fdc7dd9cb5a248078bb2811496dd2ade.png4. 点击下载jar包

    eb711b07cc364c77bb08c975b18f226f.png 5.创建lib包,导入jar包,直接cv

    1b1d1b0a41694deda11b4797a869cfff.png

     cecbecd52bc84e56b37d0000b6fb1e54.png

    6.右击lib->点击Add as Library

    e463ebf1880d4516ac705245df51591d.png

     21a808cba72c41a6bac7d5f3a673aaf4.png

     此时就解析出了jar包中的内容,我们就可以进行对数据库据的编程了

    2.建立数据库连接 

    和数据库建立连接时,需要用到数据库,首先创建一个数据库和一张表然后进行数据库连接

    1. mysql> desc student;
    2. +-------+-------------+------+-----+---------+-------+
    3. | Field | Type | Null | Key | Default | Extra |
    4. +-------+-------------+------+-----+---------+-------+
    5. | id | int(11) | YES | | NULL | |
    6. | name | varchar(20) | YES | | NULL | |
    7. +-------+-------------+------+-----+---------+-------+
    8. 2 rows in set (0.01 sec)

    jdbc编程时用到的资源,必须要导入jar包才能用

    1. import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
    2. import javax.sql.DataSource;
    3. import java.sql.*;

    2.1 创建数据源,描述数据库服务器在哪

    使用 DataSource 描述 MySQL 服务器的位置. 

    DataSource是SUN官方数据库连接池标准接口,由第三方组织实现此接口,该接口提供了获取连接的功能

    Connection getConnection()

    1. DataSource dataSource = new MysqlDataSource();
    2. ((MysqlDataSource)dataSource).setUrl
    3. ("jdbc:mysql://127.0.0.1:3306/java_2?characterEncoding=utf8&useSSL=false");
    4. ((MysqlDataSource)dataSource).setUser("root");
    5. ((MysqlDataSource)dataSource).setPassword("123456");

     url是资源唯一地址定位符,就是网址
    127.0.0.1:数据库服务器所在的IP地址,这是个特殊的IP,表示主机自己,环回网址,相当于this.
    只要数据库服务器和jdbc程序在一台电脑上都可以使用这个IP
    :3306是端口号,安装时默认的,使用IP确定了主机,网络数据报给那个程序是通过端口号来识别出数据库服务器的
    java_2数据库名
    characterEncoding=utf8字符编码方式
    useSSL=false关闭加密功能

    2.2 实现一个mysql客户端,通过网络和服务器进行通信

    Connection connection = dataSource.getConnection();

     要注意使用Java.sql的Connection 

    b5a62de7e1cd4f97871babadf530c85e.png

    3.使用代码操作数据库

    控制客户端给数据库发送请求,执行操作

    3.1 增删改操作

    增删改和查询稍有不同~ 

    增加操作

    构造 SQL 语句. JDBC 操作数据库, 本质仍然是通过 SQL 来描述数据库操作 

    1. String sql = "insert into student values(001,'张三')";
    2. PreparedStatement statement = connection.prepareStatement(sql);
    3. int ret = statement.executeUpdate();
    4. statement.close();
    5. connection.close();

    String sql 描述的是sql是什么样的

    还需要一个特殊的类:

    执行是靠PreparedStatement,它会对sql进行一些预处理,解析之类的,之前通过cmd输入的语句是发送给服务器端让服务器进行解析

     b76e9a0477b5429db73b9f367ae4ac92.png

    当前数据是写死的,我们更希望是动态的 

    我们通过控制台输入一些信息,来操作数据库

    1. Scanner scanner = new Scanner(System.in);
    2. System.out.println("请输入学号");
    3. int id = scanner.nextInt();
    4. System.out.println("请输入姓名");
    5. String name = scanner.next();
    6. String sql = "insert into student values(" + id + ",'" + name+ "')";
    7. PreparedStatement statement = connection.prepareStatement(sql);
    8. int ret = statement.executeUpdate();

    0b0b6cfc5cb84b9f8166399c1ed12dcc.png

     b9681700d7a54d64a7432855bbef85cb.png

    但是这种操作还存在一个问题

    07ba66806bbb4faaa0896c35895d014d.png

    这样的代码可读性很低,另一方面,这个代码还容易引起SQL注入攻击

    ec63f777d20a46e9b9eaef6c5b8a7afb.png如果输入这样的代码就会在插入的同时引起很多其他的问题

    因此我们提出更靠谱的方案: 通过占位符替换的方法输入操作信息

    1. Scanner scanner = new Scanner(System.in);
    2. System.out.println("请输入学号");
    3. int id = scanner.nextInt();
    4. System.out.println("请输入姓名");
    5. String name = scanner.next();
    6. String sql = "insert into student values(?,?)";
    7. PreparedStatement statement = connection.prepareStatement(sql);
    8. statement.setInt(1,id);
    9. statement.setString(2,name);
    10. int ret = statement.executeUpdate();

    c158233b3ecd45fd84c19fc9e6ed26c1.png

    265f1351943a42fcac426b75d555f52f.png

     注意:这里的占位符下标是从1开始的!!

    b2497967ec1744aca2ed4db46bf734b0.png

    执行增加,删除,更新三个操作用executeUpdate执行,代码和增加的代码是相同的

    执行查询操作使用executeQuery

    PreparedStatement的好处:
    预编译SQL,性能更高

    性能更高体现在:PreparedStatement中的参数可以使用占位符进行占位,然后执行SQL时,只需要对SQL进行预编译一次,我们利用占位符重新设置参数,这样就不用重复执行检查SQL语法和编译SQL语句了!这样就提高了性能

    防止SQL注入,会将敏感字符转义.

     

    更新操作

    也是通过占位符来操作

    1. Scanner scanner = new Scanner(System.in);
    2. System.out.println("请输入学号");
    3. int id = scanner.nextInt();
    4. System.out.println("请输入修改的姓名");
    5. String name = scanner.next();
    6. String sql = "update student set name = ? where id = ? ";
    7. PreparedStatement statement = connection.prepareStatement(sql);
    8. statement.setString(1,name);
    9. statement.setInt(2,id);
    10. int ret = statement.executeUpdate();
    11. statement.close();
    12. connection.close();

    数据库中的结果:

    1. mysql> select*from student;
    2. +------+------+
    3. | id | name |
    4. +------+------+
    5. | 1 | 张三 |
    6. | 2 | 李四 |
    7. | 3 | 王五 |
    8. | 5 | 赵六 |
    9. +------+------+
    10. 4 rows in set (0.00 sec)
    11. 更新后:
    12. mysql> select*from student;
    13. +------+--------+
    14. | id | name |
    15. +------+--------+
    16. | 1 | 张三 |
    17. | 2 | 李四 |
    18. | 3 | wangqi |
    19. | 5 | 赵六 |
    20. +------+--------+
    21. 4 rows in set (0.00 sec)

    删除操作

    1. Scanner scanner = new Scanner(System.in);
    2. System.out.println("请输入要删除的学号");
    3. int id = scanner.nextInt();
    4. String sql = "delete from student where id = ? ";
    5. PreparedStatement statement = connection.prepareStatement(sql);
    6. statement.setInt(1,id);
    7. int ret = statement.executeUpdate();
    8. statement.close();
    9. connection.close();

     7764b78af32144238553159393365c92.png

     结果:

    1. mysql> select*from student;
    2. +------+------+
    3. | id | name |
    4. +------+------+
    5. | 1 | 张三 |
    6. | 2 | 李四 |
    7. | 5 | 赵六 |
    8. +------+------+
    9. 3 rows in set (0.00 sec)

    三个操作的代码是相同的 

    执行时给服务器发送网络请求

    int ret = statement.executeUpdate();

    ret返回的是一个整数,表示执行的结果影响到了多少行

    3.2 查询操作

    查询操作用到的是

    ResultSet ret = statement.executeQuery();

    与上面三个操作不同的是:

    executeUpdate 只能返回一个 int.

    executeQuery 返回的是一个 ResultSet 对象. 可以把这个对象视为是一个 "临时表"

    增删改返回的是影响的行数,只返回一个整数

    查询的结果集合是一张表,因此比其它几个操作多一个遍历,遍历后才能看到结果

    1. String sql = "select*from student";
    2. PreparedStatement statement = connection.prepareStatement(sql);
    3. ResultSet ret = statement.executeQuery();
    4. //遍历临时表, 拿到里面的数据.
    5. // resultSet 简单的当成一个类似于 "迭代器"
    6. // next 如果没有到达末尾, 就是返回 true, 要继续循环.
    7. // next 如果到达末尾, 就返回 false, 结束循环.
    8. while(ret.next()) {
    9. int id = ret.getInt("id");
    10. String name = ret.getString("name");
    11. System.out.println("id: "+id+" name: "+name);
    12. }
    13. ret.close();
    14. statement.close();
    15. connection.close();

    获取哪一列,就用getXXX方法 ,XXX为列的类型

    结果:

    ce8708e1ab814f18b906fae1ad451677.png

    4.断开连接,释放资源

    java有GC即垃圾回收机制,会自动处理申请的内存,但是像这种连接的资源还需要我们手动释放

    资源的释放顺序是和创建顺序相反的

    释放的顺序:先用到的资源后释放

    1. ret.close();
    2. statement.close();
    3. connection.close();

  • 相关阅读:
    vue使用elementPlus ui框架,如何给Dialog 对话框添加Loading 自定义类名显示隐藏
    kubesphere中间件部署
    噪声传感器工作原理是什么?
    C++多态(超级详细版)
    Python与Scrapy:构建强大的网络爬虫
    异常处理机制(抛出异常、捕获异常)
    【学术】知云文献及划词翻译软件(XTranslator)的安装及使用
    Python-文件常用函数-读文件-写文件-定位文件
    k8s部署单点的mysql实例
    为什么好多政务网站以及高校网站没有安装SSL证书开启https?其实有免费专属SSL证书可用
  • 原文地址:https://blog.csdn.net/chenchenchencl/article/details/128028365