数据库的基本操作(7)
创始人
2024-02-10 06:16:17

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

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

前面主要讲了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.创建数据库DataSource dataSource=new MysqlDataSource();//设置数据库的地址((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/java?characterEncoding=utf8&useSSl=false");//设置登录数据库的命名((MysqlDataSource)dataSource).setUser("root");//设置登录数据库的密码((MysqlDataSource)dataSource).setPassword("123456");

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

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

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

 

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

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

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

 

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

返回的ret是操作的次数

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

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

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

下面来看一下整体的代码

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

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

insert代码

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

delete代码

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

update代码

        DataSource dataSource=new MysqlDataSource();((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/java?characterEncoding=utf8&useSSl=false");((MysqlDataSource)dataSource).setUser("root");((MysqlDataSource)dataSource).setPassword("123456");Connection connection=dataSource.getConnection();Scanner scanner=new Scanner(System.in);System.out.println("需要修改的id:");int id=scanner.nextInt();System.out.println("修改后的name:");String name= scanner.next();String sql="update student set name = ? where id = ?";PreparedStatement statement=connection.prepareStatement(sql);statement.setString(1,name);statement.setInt(2,id);System.out.println("statement: "+statement);int ret=statement.executeUpdate();System.out.println("ret="+ ret);statement.close();connection.close();

select代码

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

相关内容

热门资讯

猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...