• 数据库的基本操作(7)


    在这一篇博客中我将对数据库进行一个结尾,这将是关于数据库基本内容的结尾。

    首先我们来简单总结一下前面的内容:

    前面主要讲了Mysql中的索引和事务,这是面试必考的内容。

    索引,怎么理解索引呢?

    1.索引存在的意义:为了提高查找的效率

    2.索引需要付出的代价

    a.空间的代价:索引是为了方便查找,用空间来换取时间

    b.时间代价:针对增删改

    3.索引虽然付出的代价很多,但是在实际的工作中,索引任然会得到广泛的使用,实际需求中,经常“一写多读”

    4.索引背后的数据结构   B+树

    a.其他的结构可以嘛?

    二叉搜索树(AVL树,红黑树)不太性,树的高度太高,导致IO访问的次数更多。哈希表也不可以,因为哈希表不可以进行范围查找

    b..B树的介绍

    N叉搜索树,每个节点上包含了N个记录,N个记录就分成了N+1个区间,对应到N+1个子树,通过这种方式来快速确定当前需要查找到的值在哪个区间,进一步进行快速筛选。

    c.B+树的介绍

    B+树是在B树的基础上做出的改进,首先,每个节点上包含了N个key,N个key分成了N个区间,其次,每个节点上的值,都会在子节点上体现,叶子节点上包含所有数据的全集,最后,叶子节点再通过链表的形式来进行收尾相连。

    此时带来最大的好处,一方面,可以更高效的进行范围查找,另一方面,因为叶子节点是数据的全集,非叶子节点就只保存key,占用的空间少,可以在内存中进行缓存,又进一步的减少IO次数。

    5.什么是事务

    a.事务是要将多个SQL打包成一个,要么都进行执行,要么都不执行

    b.事务的应用场景,典型就是转账、

    c.事务是如何实现保障上述机制的呢?核心就是回滚,回滚的依据就是mysql要记录治安执行的一些过程

    d.事务的几个基本特性:原子性,一致性,持久性,隔离性

    这边重点再说一下隔离性:其中有三个重要的问题

    脏读,给写操作加锁;

    不可重复读,给读操作也加锁;

    幻读,串行化

    read uncommitted;read committed;repeatable read;serializable;通过这四个,mysql的配置文件来设置这里的隔离级别。

    这边只是简单的介绍一下,如果需要详细的,可以读一下上一篇博客

    下面来开始今天的内容:

    JDBC编程

    首先我们需要先创建一个项目,之后去中央仓库中下载一下驱动包,但是有一个比较重要的需要注意一下,要根据MySQL版本来下载驱动包,之后去创建一个lib目录,之后将下载的驱动包复制到lib中,最后最重要的是

     需要点最下面的add,接下来就是进行代码的编写了。

    JDBC的基本编程流程

    1. //1.创建数据库
    2. DataSource dataSource=new MysqlDataSource();
    3. //设置数据库的地址
    4. ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/java?characterEncoding=utf8&useSSl=false");
    5. //设置登录数据库的命名
    6. ((MysqlDataSource)dataSource).setUser("root");
    7. //设置登录数据库的密码
    8. ((MysqlDataSource)dataSource).setPassword("123456");

    首先需要创建DataSource对象,之后确定数据库的位置,其中setUser和setPassword很好理解, 就是你数据库的账户和密码,下面来重点讲解一下

    jdbc:mysql://127.0.0.1:3306/java?characterEncoding=utf8&useSSl=false

     一般来说,这个不用进行修改,直接复制使用就行。

     

    1. //2.让代码和数据库服务器创建连接
    2. Connection connection=dataSource.getConnection();

    这个代码是让代码和数据库服务器之间创建连接

    我们需要选择第一个,但是创建结束之后我们会发现会有报错,之后右键进行

     

    1. //4.执行sql
    2. //SQL中的insert,update,delete这些操作需要使用executeUpdate
    3. //SQL中的delete使用executeQuery
    4. int ret=statement.executeUpdate(sql);
    5. System.out.println(ret);

    返回的ret是操作的次数

    最后需要的是创建出来的空间进行释放

    1. //5.释放空间
    2. statement.close();;
    3. connection.close();

    这个顺序是不可以进行换位置的

    下面来看一下整体的代码

    1. public static void main(String[] args) throws SQLException {
    2. //1.创建数据库
    3. DataSource dataSource=new MysqlDataSource();
    4. //设置数据库的地址
    5. ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/java?characterEncoding=utf8&useSSl=false");
    6. //设置登录数据库的命名
    7. ((MysqlDataSource)dataSource).setUser("root");
    8. //设置登录数据库的密码
    9. ((MysqlDataSource)dataSource).setPassword("123456");
    10. //2.让代码和数据库服务器创建连接
    11. Connection connection=dataSource.getConnection();
    12. //3.操作数据库,以插入数据为例
    13. String sql="insert into student values(1,'张三')";
    14. //之后需要将sql包装成一个“语句对象”
    15. PreparedStatement statement=connection.prepareStatement(sql);
    16. //4.执行sql
    17. //SQL中的insert,update,delete这些操作需要使用executeUpdate
    18. //SQL中的delete使用executeQuery
    19. int ret=statement.executeUpdate(sql);
    20. System.out.println(ret);
    21. //5.释放空间
    22. statement.close();;
    23. connection.close();

    但是我们不可以每次都自己输入内容,如果需要用户输入我们需要更改一下代码,下面来展示一下insert,update,delete,selete的代码

    insert代码

    1. Scanner scanner=new Scanner(System.in);
    2. //1.创建好数据库
    3. DataSource dataSource=new MysqlDataSource();
    4. //设置数据库所在的地址
    5. ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/java?characterEncoding=utf8&useSSl=false");
    6. //设置登录数据库的用户名
    7. ((MysqlDataSource)dataSource).setUser("root");
    8. //设置登录数据库的密码
    9. ((MysqlDataSource)dataSource).setPassword("123456");
    10. //2.让代码和数据库服务器创建连接
    11. Connection connection=dataSource.getConnection();
    12. //2.5让用户通过控制台输入待插入的数
    13. System.out.println("请输入学号");
    14. int id= scanner.nextInt();
    15. System.out.println("请输入姓名");
    16. String name=scanner.next();
    17. //3.操作数据库,以插入数据为例
    18. //关键所在就是创建一个SQL语句
    19. String sql="insert into student values(?,?)";
    20. //此处光是一个String类型的sql还不行,需要把这个String包装成一个”语句对象“
    21. PreparedStatement statement=connection.prepareStatement(sql);
    22. //进行替换操作
    23. statement.setInt(1,id);
    24. statement.setString(2,name);
    25. System.out.println("statement: "+statement);
    26. //4.执行SQL,相当于扫码取件
    27. //SQL里面如果是insert,update,delete使用executeUpdate方法
    28. //SQL里面如果是select,使用executeQuery方法
    29. //返回值就表示这个操作,影响了几行就相当于在控制台输入sql之后得到的数字
    30. int ret=statement.executeUpdate();
    31. System.out.println(ret);
    32. //5.释放需要释放的资源
    33. statement.close();;
    34. connection.close();

    delete代码

    1. //删除数据库
    2. //让用户来输入一个id,之后根据id来进行删除
    3. //1.创建数据源
    4. DataSource dataSource=new MysqlDataSource();
    5. ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/java?characterEncoding=utf8&useSSl=false");
    6. ((MysqlDataSource)dataSource).setUser("root");
    7. ((MysqlDataSource)dataSource).setPassword("123456");
    8. //2.建立连接
    9. Connection connection=dataSource.getConnection();
    10. //3.用户输入id
    11. Scanner scanner=new Scanner(System.in);
    12. System.out.println("输入想要删除的用户id:");
    13. int id= scanner.nextInt();
    14. //4.拼装sql语句
    15. String sql="delete from student where id = ?";
    16. PreparedStatement statement=connection.prepareStatement(sql);
    17. statement.setInt(1,id);
    18. //5.执行sql
    19. int ret=statement.executeUpdate();
    20. System.out.println("ret = "+ret);
    21. //6.释放
    22. statement.close();
    23. connection.close();

    update代码

    1. DataSource dataSource=new MysqlDataSource();
    2. ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/java?characterEncoding=utf8&useSSl=false");
    3. ((MysqlDataSource)dataSource).setUser("root");
    4. ((MysqlDataSource)dataSource).setPassword("123456");
    5. Connection connection=dataSource.getConnection();
    6. Scanner scanner=new Scanner(System.in);
    7. System.out.println("需要修改的id:");
    8. int id=scanner.nextInt();
    9. System.out.println("修改后的name:");
    10. String name= scanner.next();
    11. String sql="update student set name = ? where id = ?";
    12. PreparedStatement statement=connection.prepareStatement(sql);
    13. statement.setString(1,name);
    14. statement.setInt(2,id);
    15. System.out.println("statement: "+statement);
    16. int ret=statement.executeUpdate();
    17. System.out.println("ret="+ ret);
    18. statement.close();
    19. connection.close();

    select代码

    1. //1.创建数据源
    2. DataSource dataSource=new MysqlDataSource();
    3. ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/java?characterEncoding=utf8&useSSl=false");
    4. ((MysqlDataSource)dataSource).setUser("root");
    5. ((MysqlDataSource)dataSource).setPassword("123456");
    6. //2.创建连接
    7. Connection connection=dataSource.getConnection();
    8. //3.拼接sql
    9. String sql="select * from student";
    10. PreparedStatement statement=connection.prepareStatement(sql);
    11. //4.执行sql,对于查询操作,就需要使用executeQuery
    12. //查询操作返回的不是int,而是一个临时表
    13. //使用ResultSet表示这个表
    14. ResultSet resultSet= statement.executeQuery();
    15. //5.遍历结果集合
    16. while(resultSet.next()){
    17. int id=resultSet.getInt("id");
    18. String name=resultSet.getString("name");
    19. System.out.println("id = "+id+", name = "+name);
    20. }
    21. //6.释放资源
    22. resultSet.close();
    23. statement.close();
    24. connection.close();

  • 相关阅读:
    Python学习笔记(一)
    本周二晚19:00战码先锋第8期直播丨如何多方位参与OpenHarmony开源贡献
    Cookie与Session
    pandas dataframe 数据格式转化 基础
    SkyWalking快速上手(六)——告警
    初识软件工程
    数字化开采|AIRIOT智慧矿山自动化生产解决方案
    【Qt之QTableWidget和QTreeWidget】树悬停、选择样式及表格表头和首行间隔线
    Spring Cloud都有哪些组件?
    java计算机毕业设计人才库构建研究源码+数据库+lw文档+系统
  • 原文地址:https://blog.csdn.net/m0_64761752/article/details/128007275