• JDBC编程的基本流程


    1、创建数据源

    1. 创建DataSource对象,这个对象描述了数据库服务器在哪,需要导入包javax.sql.DataSource
    DataSource databases = new MysqlDataSource();
    
    • 1
    1. 设置数据库所在的地址
    ((MysqlDataSource) databases).setURL("jdbc:mysql://127.0.0.1:3306/mydb_one?characterEncoding=utf8&useSSL=false");
    
    • 1

    jdbc:mysql 表示这个url是用于jdbc mysql的url
    127.0.0.1 表示mysql服务器所在的主机的ip值,这里意为本机
    3306 表示端口号,mysql的默认端口号就是3306
    mydb_one 表示我的数据库名
    characterEncoding=utf8 服务器的字符集,如果你的服务器字符集是utf8mb4也写成utf8
    useSSL=false 表示传输过程中,不需要加密

    1. 设置登录数据库的用户名
    ((MysqlDataSource) databases).setUser("root");
    
    • 1
    1. 设置登录数据的密码
    ((MysqlDataSource) databases).setPassword("fl12345.0");
    
    • 1

    以上写法还能换成另一种写法

    MysqlDataSource database = new MysqlDataSource();
    database.setURL();
    database.setUser("root");
    database.setPassword("fl12345.0");
    
    • 1
    • 2
    • 3
    • 4

    但是第一种写法是更常见的习惯写法,因为代码中持有的实例是DataSource类型,后面一些其他代码如果需要用到DataSource,相关的参数也是DataSource,未来如果数据库进行切换,代码几乎不用改动——低耦合

    第二种写法就会导致代码中导出散播着MysqlDataSource这条的类型,如果要进行数据库切换,代码中很多地方都需要修改——高耦合

    2、让代码和数据源建立连接

    前面创建好数据源,只是描述了一下这个数据源在哪,但我们并没有实际的去访问这个数据源

    例如快递小哥给我打电话,让我去取快递,但实际上我可以选择不去,或者稍后再去取。真正去取快递这个操作,就相当于和数据库建立连接

    Connection connection = dataSource.getConnection();
    
    • 1

    当我们去使用getConnection()方法时,会返回一个Connection对象,idea会给我们提示有很多的Connection,一定要认准,使用的是JDBC的Connection,不是MySQL驱动包里面的Connection,更不是其它的Connection

    在这里插入图片描述

    创建数据源的哪一个步骤出现差错,在建立连接的时候都会抛出SQLException,因此我们需要显示处理SQLException

    3、操作数据库

    操作数据库的关键就是构造一个SQL语句

    3.1 插入操作

    String sql = "insert into student values(1, 'fl')";
    
    //数据库中的student表
    //+-------+-------------+------+-----+---------+-------+
    //| Field | Type        | Null | Key | Default | Extra |
    //+-------+-------------+------+-----+---------+-------+
    //| id    | int(11)     | YES  |     | NULL    |       |
    //| name  | varchar(20) | YES  |     | NULL    |       |
    //+-------+-------------+------+-----+---------+-------+
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在JDBC中构造SQL,不必带上分号, 分号只是在命令行中用来区分不同的语句,现在是直接在代码上操作

    此处光是一个String类型的sql还不行,需要把这个Sring包装成一个“语句对象”

    PreparedStatement statement = connection.prepareStatement(sql);
    
    • 1

    通过connection里面的prepareStatement这个方法来构造语句对象,这操作就是把字符串风格的sql转成了一个JDBC里面的对象

    执行sql

    int ret = statement.executeUpdate();
    
    • 1

    返回值就表示影响了几行

    SQL中如果是insert, update, delete, 都使用executeUpdate 方法
    如果是select, 则使用executeQuery 方法

    sql执行完毕后,还需要释放资源

    statement.close();
    connection.close();
    
    • 1
    • 2

    先释放statement,再释放connection 先创建的后释放,后创建的先释放

    整个插入数据已经执行完毕,但是插入的数据都是直接给定的,但实际上大概率我们是需要灵活的处理要插入的数据,例如让用户通过控制台,输入想要插入的数据

    Scanner scanner = new Scanner(System.in);
    
    //让用户通过控制台输入一下待插入的数据
    System.out.print("请输入id:");
    int id = scanner.nextInt();
    System.out.print("请输入名字:");
    String name = scanner.next();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    此时就需要把id和name替换到insert语句中的对应位置上,此处就有两种方式
    第一种: 通过字符串拼接这个操作来构造sql,虽然可以,但是不推荐,因为这么写非常麻烦,容易写错,其次就是容易引起“SQL注入”

    第二种: 使用代替写法,避免直接拼接字符串

    String sql = "insert into student values(?, ?);
    PreparedStatement statement = connection.prepareStatement(sql);
    
    //插入多条记录
    //String sql = "insert into student values(?, ?), (?, ?)";//下标1,2,3,4  并非1,2,1,2
    
    • 1
    • 2
    • 3
    • 4
    • 5

    ?相当于告诉java程序,这两个字段的值,还不确定,先占个位置,再使用PreparedStatement的setXXX系列的方法进行替换
    setXXX方法有很多,需要让这里的方法和数据库的列的类型匹配
    进行替换操作

    statement.setInt(1, id); //把第一个?替换成id
    statement.setString(2,name); //把第二个?替换成name
    
    • 1
    • 2

    这里就是在执行具体的替换操作,从下标1还是计算。

    最后还需要执行sql

    3.2 删除操作

    让用户输入一个id,根据id来删除

    //1.创建数据源
    DataSource dataSource = new MysqlDataSource();
    ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/mydb_one?characterEncoding=utf8&useSSL=false");
    ((MysqlDataSource)dataSource).setUser("root");
    ((MysqlDataSource)dataSource).setPassword("fl12345.0");
    
    //2.建立链接
    Connection connection = (Connection) dataSource.getConnection();
    
    //3.输入id
    Scanner scanner = new Scanner(System.in);
    System.out.print("请输入要删除的id:");
    int id = scanner.nextInt();
    
    //4.拼接SQL
    String sql = "delete from student where id = ?";
    PreparedStatement statement = connection.prepareStatement(sql);
    statement.setInt(1, id);
    
    //5.执行SQL
    int ret = statement.executeUpdate();
    System.out.println("ret = " + ret);
    System.out.println(statement);
    
    //6.释放资源
    statement.close();
    connection.close();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    删除操作和插入操作几乎是一模一样

    3.3 修改操作

    根据id修改学生姓名

    //1.创建数据源
    DataSource dataSource = new MysqlDataSource();
    ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/mydb_one?characterEncoding=utf8&useSSL=false");
    ((MysqlDataSource)dataSource).setUser("root");
    ((MysqlDataSource)dataSource).setPassword("fl12345.0");
    
    //2.建立链接
    Connection connection = (Connection) dataSource.getConnection();
    
    //3.输入id
    Scanner scanner = new Scanner(System.in);
    System.out.print("请输入要修改的学生id:");
    int id = scanner.nextInt();
    System.out.print("请输入要修改的学生姓名:");
    String name = scanner.next();
    
    //4.拼接SQL
    String sql = "update student set name = ? where id = ?";
    PreparedStatement statement = connection.prepareStatement(sql);
    statement.setString(1, name);
    statement.setInt(2, id);
    
    //5.执行sql
    int ret = statement.executeUpdate();
    System.out.println("ret = " + ret);
    System.out.println(statement);
    
    //6.关闭资源
    statement.close();
    connection.close();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    修改操作和插入操作几乎是一模一样

    3.4 查找操作

    查找操作和前面的三个操作相比,要复杂一些,查找操作需要对结果进行访问

    //1.创建数据源
    DataSource dataSource = new MysqlDataSource();
    ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/mydb_one?characterEncoding=utf8&useSSL=false");
    ((MysqlDataSource)dataSource).setUser("root");
    ((MysqlDataSource)dataSource).setPassword("fl12345.0");
    
    //2.建立链接
    Connection connection = (Connection) dataSource.getConnection();
    
    //3.拼接SQL
    String sql = "select * from student";
    PreparedStatement statement = connection.prepareStatement(sql);
    
    //4.执行SQL,对于查询操作,就需要使用executeQuery
    //  查询操作的返回结果不是一个int,而是一张"临时表"
    //使用ResultSet表示这张临时表
     ResultSet resultSet = statement.executeQuery();
    
    //5.遍历结果集合(返回临时表),先获取到这一行,再获取到这一行中的若干行
    //  如果遍历到表的结束位置,此处的next也就返回false
    //+-------+-------------+------+-----+---------+-------+
    //| Field | Type        | Null | Key | Default | Extra |
    //+-------+-------------+------+-----+---------+-------+
    //| id    | int(11)     | YES  |     | NULL    |       |
    //| name  | varchar(20) | YES  |     | NULL    |       |
    //+-------+-------------+------+-----+---------+-------+
    //  next方法表示获取到一行记录,同时把光标往后移动一行
    while (resultSet.next()){
        //针对这一行获取到其中的列
        int id = resultSet.getInt("id");
        String name = resultSet.getString("name");
        System.out.println("id = "+ id +", name = " + name);
    }
    
    //6.释放资源
    resultSet.close();//resultSet也需要释放
    statement.close();
    connection.close();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    在获取每一列的数据时,需要用对应的类型去接受,不可混用

    在使用get系列方法时,会有两种
    在这里插入图片描述
    第一种传的参数是第几列(从1开始)
    第二种传的参数是列的名字(主要用这个)

  • 相关阅读:
    blender中的灯光和相机
    Python中如何判断列表中的元素,是否在一段文本中??
    某金融机构身份国产化LDAP创新实践——国产自主可控 LDAP目录服务建设经验分享
    jsp交通管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目
    图解MySQL逻辑备份的实现流程
    项目管理工具中的线性进度表是什么
    python类的内置属性,原本具足,无需人为干预
    痛快,SpringBoot终于禁掉了循环依赖
    php yield使用
    Layui之用户管理实例
  • 原文地址:https://blog.csdn.net/qq_56044032/article/details/127835470