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等中央缓存来替代二级缓存。