2024年最新【MySQL 数据库 进阶】 面试官常问 索引+事务+JDBC_mysql127,面试官6个灵魂拷问

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

1、索引是查找比较多的情况下才适合用

2、索引占据的空间不小,磁盘小不建议用

3、建立索引需要区分度比较大得时候才适合制作索引

4、在MySQL中使用create index命令,MySQL底层自动帮我们创建B+树

2.4非聚簇索引

描述MySQL底层是怎样组织数据的。

非聚簇索引是通过“表”的结构,把所有的数据装进去

image-20211204204222142

最后通过表的形式,把数据都装入一个表中

2.5聚簇索引

数据本身就是通过B+树方式组织的,每个叶子节点存一条完整记录。

image-20211204204611030

聚簇和非聚簇,最终是聚簇的索引更高效,因为非聚簇还要建一个表再把数据放入表中这个动作拖慢了速度,但是非聚簇有一个优点就是它是通过每一行存储数据那么它的磁盘碎片就比较少,更省空间。

三、事务

3.1 何为事务

一般在钱的事情上人们都比较敏感,如果别人给你转了200,那么别人的账户就-200,这时候如果服务器断了,你就没有收到别人的200块钱,这种现象会造成一种社会的恐慌是一种严重的现象,为了解决这种现象SQL就使用事务来控制,保证要么全部执行成功,要么全部执行失败。

3.2 事务的概念

事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败。在不同的环境中,都可以有事务。对应在数据库中,就是数据库事务。

3.3 事务的特性
  • 原子性:将一系列操作打包到一起,构成一个整体,这个整体要么全做完,要么全失败。 such as:A账户-200,B账户+200,中途数据库崩溃,那么原子性,会把做了中间状态的操作还回去(术名:回滚),原子性会把中间的操作记录下来,当数据库崩溃是,在把上一条操作还回去,从而实现要么全成功,要么全失败。
  • 一致性:执行事务之前,和执行完事务之后,当前表里面的数据都是合理的状态
  • 持久性:事务操作的数据都是在硬盘上操作的,而硬盘是一个持久化储存的。
  • 隔离性:多个事务,并发执行时产生的问题!!!

四、JDBC

4.1 何为JDBC

JDBC是java当中的数据库的API,也就是说JDBC是通过java代码操作数据库的。由于数据库支持多种编程,也就是说不同数据库支持不同语言的API,数据库也分多种数据库,也分多种API,如果通过代码操作不同数据库完成同样的功能,也就要写多种语言的代码,开发成本高,学习成本也高,时间成本也高,所以为了解决上诉问题,就是把各类数据库的各类API抽象出来封装到一层,封装出一套统一的API。 那么JDBC就是java语言标准库提供的API。

4.2 JDBC工作原理

image-20211205170443191

JDBC优势:
1、Java语言访问数据库操作完全面向抽象接口编程
2、开发数据库应用不用限定在特定数据库厂商的API
3、程序的可移植性大大增强

4.3 JDBC的实现

1、增加操作:

public static void testInsert() throws SQLException {
        //DataSource标准库的接口, MYsqlDataSource()是MySQL JDBC的驱动
        DataSource dataSource=new MysqlDataSource();
        //1.设置IP和端口,通过URL来表示,
        //1).setURL属于MySQLDataSource的方法,用到向下转型
        ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/java101?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("0123456789");

        //3.连接数据库
        Connection connection=dataSource.getConnection();

        //4.让用户输入id和姓名
        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入学号:");
        int id=scanner.nextInt();
        System.out.println("请输入姓名");
        String name=scanner.next();

        //5.构造一个SQL语句,给插入做准备
        String sql="insert into student values(?,?)";
        PreparedStatement statement=connection.prepareStatement(sql);//与数据库服务器进行连接交互
        statement.setInt(1,id);//提供setXXX方法,下标从1开始
        statement.setString(2,name);
        System.out.println("sql:"+ statement);
    
        //executeUpdate()来变更数据库增,改,删操作
        int ret=statement.executeUpdate();
        System.out.println("ret:"+ ret);

       //释放资源
        statement.close();
        connection.close();
    }

image-20211205172927490

image-20211205172938750

2、删除操作,跟增加操作差不懂不在赘述:

public static void testDelete() throws SQLException {
        DataSource dataSource=new MysqlDataSource();
        ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/java101?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("0123456789");
    
        Connection connection=dataSource.getConnection();

        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入删除的id");
        int id=scanner.nextInt();

        //构造sql
        String sql="delete from student where id=?";
        PreparedStatement statement=connection.prepareStatement(sql);
        statement.setInt(1,id);
        System.out.println("sql:" + statement);

        //执行sql
        int ret = statement.executeUpdate();
        System.out.println("ret:" + ret);

        //释放资源
        statement.close();
        connection.close();


    }

3、修改操作,和前面增,删操作一样

public static void testUpdate() throws SQLException {
        DataSource dataSource=new MysqlDataSource();
        ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/java101?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("0123456789");

        Connection connection=dataSource.getConnection();

        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入你要修改的id");
        int id=scanner.nextInt();
        System.out.println("请输入你要修改的名字");
        String name=scanner.next();

        //构造sql
        String sql="Update student set id=? where name=?";
        PreparedStatement statement=connection.prepareStatement(sql);
        statement.setInt(1,id);
        statement.setString(2,name);
        System.out.println("sql:"+statement);

        //执行sql
        int ret= statement.executeUpdate();
        System.out.println("ret:" + ret);

        //释放资源
        statement.close();
        connection.close();

    }

4.查询操作,跟前面不太一样:

public static void testSelect() throws SQLException {
    
        DataSource dataSource=new MysqlDataSource();
        ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/java101?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("0123456789");

        Connection connection=dataSource.getConnection();

        String sql="select \* from student";
        PreparedStatement statement= connection.prepareStatement(sql);

       // 因为select最终呈现的表是一张临时表,要写额外的代码,报这张临时表获取到
        ResultSet resultSet=statement.executeQuery();
        //resultSet是一张表,

        while (resultSet.next()) {
            //next()表示获取当前行同时切换下一行类似于i++,有返回true,没有返回false
            //resultSet表示当前行,下面get表示每一行中的具体列
            int id=resultSet.getInt("id");
            String name=resultSet.getString("name");
            System.out.println("id:"+id+" name:"+name);
        }
        //释放资源
        resultSet.close();
        statement.close();
        connection.close();

    }

image-20211205173756354

image-20211205173849157

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

37dsON-1715666159208)]
[外链图片转存中…(img-oXr4lEgw-1715666159208)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

  • 22
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值