MyBatis & MySQL 面试题
MySQL 面试题
一、MySQL 基础
1、创建数据库2、查看数据库3、选择数据库4、删除数据库5、创建表6、查看定义7、查看创建的表8、更新表名9、删除表10、增加表字段11、删除表字段12、修改表字段 二、MySQL基本语法
1、插入记录2、批量记录3、更新记录4、删除记录5、查看记录6、排序7、限制记录数8、聚合:9、分组10、二次过滤11、二次汇总 三、MySQL表的连接
1、内连接2、左外连接3、右外连接4、子查询5、记录联合 四、MySQL常用数据类型
1、数值类型2、日期和时间类型3、二进制数据类型4、字符串数据类型 MyBatis面试题
一、Mybaits的优缺点二、#{} 和 ${} 的区别是什么?三、Mybatis是如何进行分页的?分页插件的原理是什么?四、Mybatis的一级、二级缓存五、Mybatis动态sql有什么用?执行原理?有哪些动态sql?六、使用MyBatis的mapper接口调用时有哪些要求?七、MyBatis 如何防止sql注入
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.]( [[not] null], ...... )
6、查看定义注:TEMPORARY:指明创建临时表
IF NOT EXISTS:如果要创建的表已经存在,强制不显示错误消息
database_name:数据库名
table_name:表名
column_name:列名
data_type:数据类型*
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);二、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 ;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) |
| 数据类型 | 存储范围 | 字节 |
|---|---|---|
| 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 |
| 数据类型 | 说明 |
|---|---|
| TITYBLOB | 最大长度为255字节 |
| BLOB | 最大长度为64KB |
| MEDIUMBLOB | 最大长度为16MB |
| LONGBLOB | 最大长度为4GB |
| 数据类型 | 说明 |
|---|---|
| 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个串组成的预定义集合的零个或多个串 |
(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注入
- 检查变量数据类型和格式;过滤特殊符号;绑定变量,使用预编译语句;



