Java面试题整理——Mysql数据库

Java面试题整理

Mysql


1.数据库的三范式是什么?

  • 第一范式:对属性的原子性约束,要求属性具有原子性,不可在分解。
  • 第二范式:对记录的唯一性约束,要求记录有唯一标识,即实体的唯一性。
  • 第三范式:对字段冗余性的约束,即任何字段不能由其他字段派生出来,它要求字段没有冗余。

2.Mysql中有哪几种锁?

  • 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
  • 行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
  • 页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁粒度界于表锁和行锁之间,并发度一般。

3.CHAR和VARCHAR的区别?

  • CHAR和VARCHAR类型在存储和检索方面有所不同。
  • CHAR列长度固定为创建表时声明的长度,长度值范围值1到255,当CHAR值被存储时,它们被用空格填充到特定长度,检索CHAR值时是需删除尾随空格。

4.BLOB和TEXT有什么区别?

  • BLOB是一个二进制对象,可以容纳可变数量的数据。TEXT是一个不区分大小写的BLOB。
  • BLOB和TEXT类型之间的唯一区别在于对BLOB值进行排序和比较时区分大小写,对TEXT值不区分大小写。

5.NOW() 和 CURRENT_DATE() 有什么区别?

  • NOW() 命令用于显示当前年份,月份,日期,小时,分钟和秒。
  • CURRENT_DATE() 仅显示当前年份,月份和日期。

6.MYSQL有关权限的表都有哪几个?

  • Mysql服务器通过权限表来控制用户对数据库的访问,权限表存放在mysql数据库里,由mysql_install_db脚本初始化。这些权限表分别是user,db,table_priv,columns_priv和host。

7.优化数据库的方法?

  • 选取最适用的字段属性,尽可能减少定义字段宽度,尽量把字段设置NOTNULL,例如‘省份’,‘性别’最好适用ENUM。
  • 使用连接(JOIN)来代替子查询
  • 适用联合(UNION)来代替手动创建的临时表
  • 事务处理
  • 锁定表、优化事务处理
  • 适用外键、优化锁定表
  • 建立索引
  • 优化查询语句

8.数据库中的事务是什么?

事务(transaction)是作为一个单元的一组有序的数据库操作。如果组中的所有操作都成功,则认为事务成功,即使只有一个操作失败,事务也不成功。如果所有操作完成,事务则提交,其修改将作用于所有其他数据库进程。如果一个操作失败,则事务将回滚,该事务所有操作的影响都将取消。

事务特性:

  • 原子性:即不可分割性,事务要么全部被执行,要么全部不被执行。
  • 一致性或可串性:事务的执行使得数据库从一种正确状态转换成另一种正确状态。
  • 隔离性:在事务正确提交之前,不允许把该事务对数据的任何改变提供给任何其他事务。
  • 持久性:事务正确提交后,其结果将永久保存在数据库中,即使在事务提交后有了其他故障,事务的处理结果也会得到保存。

事务就是被绑定在一起作为一个逻辑工作单元的SQL语句分组,如果任何一个语句操作失败那么整个操作就会失败,以后操作就会回滚到操作前状态,或者是上一个节点。为了确保要么执行,要么不执行,就可以使用事务。要将有组语句作为事务考虑,就需要通过ACID测试,即原子性,一致性,隔离性和持久性。

9.SQL注入漏洞产生的原因?如何防止?

SQL注入产生的原因:程序开发过程中不注意规范书写SQL语句和对特殊字符进行过滤,导致客户端可以通过全局变量POST和GET提交一些SQL语句正常执行。

防止SQL注入的方式:

  • 开启配置文件中的 magic_quotes_gpc 和 magic_quotes_runtime 设置。
  • 执行SQL语句时使用addslashes进行SQL语句转换。
  • SQL语句书写尽量不要省略双引号和单引号。
  • 过滤掉SQL语句中的一些关键词:update、insert、delete、select、*。
  • 提高数据库表和字段的命名技巧,对一些重要的字段根据程序的特点命名,取不易被猜到的。

10.SQL语句优化有哪些方法?(选择几条)?

  • WHERE子句中:WHERE表之间的连接必须写在其他WHERE条件之前,那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾,HAVING最后。
  • 用EXISTS代替IN、用NOT EXISTS代替NOT IN。
  • 避免在索引列上使用计算。
  • 避免在索引列上使用IS NULL和IS NOT NULL。
  • 对查询进行优化,应尽量避免全表扫描,首先应考虑在 WHERE 及 ORDER BY 涉及的列上建立索引。
  • 应尽量避免在 WHERE 子句中对字段进行 NULL 值判断,否则将导致引擎放弃使用索引而进行全表扫描。
  • 应尽量避免在 WHERE 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。

Mybatis


1.Mybatis 中 #{} 和 ${} 的区别是什么?

#{} 是预编译处理,KaTeX parse error: Expected ‘EOF’, got ‘#’ at position 21: …串替换; Mybatis在处理 #{} 时,会将sql中的 #{} 替…{}时,就是把 ${} 替换成变量的值;使用 #{} 可以有效防止SQL注入,提高系统安全性。

2.说一下 Mybatis 的一级缓存和二级缓存?

  • 一级缓存:基于PerpetualCache 的 HashMap 本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该 Session 中的所有 Cache 就将清空,默认打开一级缓存。
  • 二级缓存:与一级缓存机制相同,默认也是采用PerpetualCache,HashMap 存储,不同在于其存储作用域为Mapper(Namespace),并且可以自定义存储源,如 Ehcache。默认不打开二级缓存,要开启二级缓,使用二级缓存属性类需要实现Serializeable序列化接口(可用来保存对象的状态),可在它的映射文件中配置。

对于缓存数据更新机制,当某一个作用域进行了C/U/D操作后,默认该作用域下所有 select 中的缓存将被 clear。

3.Mybatis 和 Hibernate 的区别有哪些?

  • Mybatis 和 Hibernate 不同,它不完全是一个ORM框架,因为Mybatis需要程序员自己编写SQL语句。
  • Mybatis直接编写原生态SQL,可以严格控制SQL执行性能,灵活度高,非常适合对关系数据模型要求不高的软件开发,因为这类软件需求变化频繁,一旦需求变化要求迅速输出成果。但是灵活的前提是Mybatis无法做到数据库无关性,如果需要实现支持多种数据库软件,则需要自定义多套SQL映射文件,工作量大。
  • Hibernate对象/关系映射能力强,数据库无关性好,对于关系模型要求高的软件,如果用Hibernate开发可以节省很多代码,提高效率。

Hibernate


1.为什么要使用 Hibernate?

  • 对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。
  • Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作。
  • Hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。
  • Hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。

2.什么是 ORM 框架?

对象——映射关系(Object-Relational Mapping,简称ORM),面向对象的开发方法是当今企业级应用开发环境中的主流开发方法,关系数据库是企业级应用环境中永久存放数据的主流数据存储系统。对象和关系数据是业务实体的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据。内存中的对象之间存在关联和继承关系,而在数据库中,关系数据无法直接表达多对多关联和继承关系。因此,对象-关系映射(ORM)系统一般以中间件的形式存在,主要实现程序对象到关系数据库的映射。

3.Hibernate 有几种查询方式?

// HQL查询。
// HQL: Hibernate Query Language. 面向对象的写法:
Query query = session.createQuery("from Customer where name = ?");
query.setParameter(0, "张三");
Query.list();
// SQL查询。
// SQL:
SQLQuery query = session.createSQLQuery("select * from customer");
List<Object[]> list = query.list();
SQLQuery query = session.createSQLQuery("select * from customer");
query.addEntity(Customer.class);
List<Customer> list = query.list();
// 条件查询。
// QBC: Query By Criteria.(条件查询)
Criteria criteria = session.createCriteria(Customer.class);
criteria.add(Restrictions.eq("name", "花姐"));
List<Customer> list = criteria.list();

HQL是面向对象查询操作的,SQL是结构化查询语言,是面向数据库表结构的。

4.说一下 Hibernate 的缓存机制?

Hibernate中的缓存分为一级缓存和二级缓存。

一级缓存就是 Session 级别的缓存,在事务范围内有效,是内置的不能被卸载。二级缓存是 SessionFactory 级别的缓存,从应用启动到应用结束有效。是可选的,默认没有二级缓存,需要手动开启。保存数据库后,缓存在内存中保存一份,如果更新了数据库就要同步更新。

什么样的数据适合存放在二级缓存中?

  • 很少被修改的数据(帖子的最后回复时间)。
  • 经常被查询的数据(电商的地点)。
  • 不是很重要的数据(允许出现偶尔并发的数据)。
  • 不会被并发访问的数据。
  • 常亮数据。

Hibernate的二级缓存默认是不支持分布式缓存的。可以使用Memcache,Redis等中央缓存来替代二级缓存。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

绯色灬观月

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值