MyBatis & MySQL 面试题
MySQL 面试题
一、MySQL 基础
1、创建数据库
create database test1;
2、查看数据库
show databases;
3、选择数据库
use mysql;
4、删除数据库
drop database test1;
5、创建表
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] [database_name.] <table_name>
(
<column_name> <data_type> [[not] null], ......
)
注:TEMPORARY:指明创建临时表
IF NOT EXISTS:如果要创建的表已经存在,强制不显示错误消息
database_name:数据库名
table_name:表名
column_name:列名
data_type:数据类型*
6、查看定义
desc emp;
7、查看创建的表
show create table emp ;
8、更新表名
alter table emp rename users;
9、删除表
drop table emp;
10、增加表字段
alter table emp add column age int(3);
11、删除表字段
alter table emp drop column age;
12、修改表字段
alter table emp modify ename varchar(30);
alter table emp change age age int(4);
/***
前者可以修改列名称,后者不能.
change需要些两次列名称.
**/
二、MySQL基本语法
1、插入记录
//指定字段,
//自增,默认值等字段可以不用列出来,没有默认值的为自动设置为NULL
insert into emp (ename,hiredate,sal,deptno) values ('jack','2000-01-01','2000',1);
//可以不指定字段,但要一一对应
insert into emp values ('lisa','2010-01-01','8000',2);
2、批量记录
insert into emp values ('jack chen','2011-01-01','18000',2),('andy lao','2013-01-01','18000',2);
3、更新记录
update emp set sal="7000.00" where ename="jack";
update emp e,dept d set e.sal="10000",d.deptname=e.ename where e.deptno=d.deptno and e.ename="lisa";
4、删除记录
//请仔细检查where条件,慎重
delete from emp where ename='jack';
5、查看记录
//查看所有字段
select * from emp;
//查询不重复记录
select distinct(deptno) from emp ;
select distinct(deptno),emp.* from emp ;
//条件查询
//比较运算符: > < >= <= <> != ...
//逻辑运算符: and or ...
select * from emp where sal="18000" and deptno=2;
6、排序
//desc降序,asc 升序(默认)
select * from emp order by deptno ;
select * from emp order by deptno asc;
select * from emp order by deptno desc,sal desc;
7、限制记录数
select * from emp limit 1;
select * from emp limit 100,10;
select * from emp order by deptno desc,sal desc limit 1;
8、聚合:
select count(id) from emp ;
select sum(sal) from emp ;
select max(sal) from emp ;
select min(sal) from emp ;
/***
函数:count():记录数 / sum(总和); / max():最大值 / min():最小值
**/
9、分组
//分组统计
select count(deptno) as count from emp group by deptno;
select count(deptno) as count,deptno from emp group by deptno;
select count(deptno) as count,deptno,emp.* from emp group by deptno;
10、二次过滤
select count(deptno) as count,deptno from emp group by deptno having count > 2;
11、二次汇总
select count(sal),emp.* from emp group by sal, deptno with rollup ;
三、MySQL表的连接
- left join :左连接,返回左表中所有的记录以及右表中连接字段相等的记录;
- right join :右连接,返回右表中所有的记录以及左表中连接字段相等的记录;
- inner join: 内连接,又叫等值连接,只返回两个表中连接字段相等的行;
- full join:外连接,返回两个表中的行:left join + right join;
- cross join:结果是笛卡尔积,就是第一个表的行数乘以第二个表的行数。
1、内连接
select * from emp as e,dept as d where e.deptno=d.deptno;
select * from emp as e inner join dept as d on e.deptno=d.deptno;
/***
只返回两个表中连接字段相等的行
**/
2、左外连接
select * from emp as e left join dept as d on e.deptno=d.deptno;
/***
包含左表中所有的记录以及右表中连接字段相等的记录
**/
3、右外连接
select * from emp as e right join dept as d on e.deptno=d.deptno;
/***
包含右表中所有的记录以及左表中连接字段相等的记录
**/
4、子查询
//=, !=
select * from emp where deptno = (select deptno from dept where deptname="技术部");
select * from emp where deptno != (select deptno from dept where deptname="技术部");
//in, not in
//当需要使用里面的结果集的时候必须用in();
select * from emp where deptno in (select deptno from dept where deptname="技术部");
select * from emp where deptno not in (select deptno from dept where deptname="技术部");
//exists , not exists
//当需要判断后面的查询结果是否存在时使用exists();
select * from emp where exists (select deptno from dept where deptno > 5);
select * from emp where not exists (select deptno from dept where deptno > 5);
5、记录联合
union:返回去重之后的结果
select ename from emp union select ename from emp;
union all:返回所有结果
select ename from emp union all select ename from emp;
四、MySQL常用数据类型
1、数值类型
上标;下标
数据类型 | 存储范围 | 字节 |
---|---|---|
tinyint[(m)] | 有符号值:-128 至 127 无符号值:0 至 255 | 1 |
smallint[(m)] | 有符号值:-215 至 215-1 无符号值:0 至 216 | 2 |
mediumint[(m)] | 有符号值:-222 至 223-1 无符号值:0 至 224-1 | 3 |
int[(m)] | 有符号值:-231 至 231-1 无符号值:0 至 232-1 | 4 |
bigint[(m)] | 有符号值:-263 至 263-1 无符号值:0 至 264-1 | 8 |
float[(m, d)] | 最小非零值:±1.175494351e - 38 | 4 |
double[(m, d)] | 最小非零值:+2.2250738585072014e - 308 | 8 |
decimal (m, d) | 可变;其值的范围依赖于m和d | m(mysql < 3.23) m+2(mysql > 3.23) |
2、日期和时间类型
数据类型 | 存储范围 | 字节 |
---|---|---|
DATE | 1000-01-01 至 9999-12-31 | 4 |
TIME | -838:59:59 至 838:59:59 | 3 |
DATETIME | 1000-01-01 00:00:00 至 9999-12-3123:59:59 | 8 |
TIMESTAMP | 19700101080001 至 20380119111407 | 4 |
YEAR | 1901 至 2155 | 1 |
3、二进制数据类型
数据类型 | 说明 |
---|---|
TITYBLOB | 最大长度为255字节 |
BLOB | 最大长度为64KB |
MEDIUMBLOB | 最大长度为16MB |
LONGBLOB | 最大长度为4GB |
4、字符串数据类型
数据类型 | 说明 |
---|---|
CHAR | 1~255个字符的定长串,它的长度必须在创建时指定,否则MySQL假定为CHAR(1) |
VARCHAR | 可变长度,最多不超过255字节,如在创建时指定VARCHAR(n),则可存储0~n个字符的变长串 |
TINYTEXT | 同TEXT,最大长度为255字节 |
MEDUIMTEXT | 同TEXT,最大长度为16K |
TEXT | 最大长度为64K的变长文本 |
LONGTEXT | 同Text,最大长度为4GB(纯文本,一般不会到4G) |
ENUM | 接受最多64K个串组成的预定义集合的某个串 |
SET | 接受最多64K个串组成的预定义集合的零个或多个串 |
MyBatis面试题
一、Mybaits的优缺点
(1)优点:
① 基于SQL语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,SQL写在XML里,解除sql与程序代码的耦合,便于统一管理;提供XML标签,支持编写动态SQL语句,并可重用。
② 与JDBC相比,减少了50%以上的代码量,消除了JDBC大量冗余的代码,不需要手动开关连接;
③ 很好的与各种数据库兼容(因为MyBatis使用JDBC来连接数据库,所以只要JDBC支持的数据库MyBatis都支持)。
④ 能够与Spring很好的集成;
⑤ 提供映射标签,支持对象与数据库的ORM字段关系映射;提供对象关系映射标签,支持对象关系组件维护。
(2)缺点:
① SQL语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写SQL语句的功底有一定要求。
② SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。
二、#{} 和 ${} 的区别是什么?
${}是字符串替换,#{}是预处理;
Mybatis在处理 时 , 就 是 把 {}时,就是把 时,就是把{}直接替换成变量的值。而Mybatis在处理#{}时,会对sql语句进行预处理,将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;
使用#{}可以有效的防止SQL注入,提高系统安全性。
三、Mybatis是如何进行分页的?分页插件的原理是什么?
Mybatis使用RowBounds对象进行分页,它是针对ResultSet结果集执行的内存分页,而非物理分页。可以在sql内直接书写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页。
四、Mybatis的一级、二级缓存
(1)一级缓存: 基于 PerpetualCache 的 HashMap 本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该 Session 中的所有 Cache 就将清空,默认打开一级缓存。
(2)二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCache,HashMap 存储,不同在于其存储作用域为 Mapper(Namespace),并且可自定义存储源,如 Ehcache。默认不打开二级缓存,要开启二级缓存,使用二级缓存属性类需要实现Serializable序列化接口(可用来保存对象的状态),可在它的映射文件中配置 ;
(3)对于缓存数据更新机制,当某一个作用域(一级缓存 Session/二级缓存Namespaces)的进行了C/U/D 操作后,默认该作用域下所有 select 中的缓存将被 clear 掉并重新更新,如果开启了二级缓存,则只根据配置判断是否刷新。
五、Mybatis动态sql有什么用?执行原理?有哪些动态sql?
Mybatis动态sql可以在Xml映射文件内,以标签的形式编写动态sql,执行原理是根据表达式的值 完成逻辑判断 并动态拼接sql的功能。
Mybatis提供了9种动态sql标签:trim | where | set | foreach | if | choose | when | otherwise | bind。
六、使用MyBatis的mapper接口调用时有哪些要求?
- Mapper接口方法名和mapper.xml中定义的每个sql的id相同;
- Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同;
- Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同;
- Mapper.xml文件中的namespace即是mapper接口的类路径。
七、MyBatis 如何防止sql注入
- 检查变量数据类型和格式;
- 过滤特殊符号;
- 绑定变量,使用预编译语句;