java面试题——mybatis

如何避免sql注入?
可以使用预处理PreparedStatement,或者使用正则表达式过滤掉字符中的特殊字符。

Mybatis的优缺点?
优点:
基于SQL语句编程,相当灵活。与JDBC相比,减少了代码量,消除了大量冗余的代码,不需要手动开关连接;并且能和Spring很好的集成。
缺点:
Sql语句的编写工作量大,尤其当字段多,关联表多时。对编写sql语句的功底有一定的要求。数据库移植性差,不能随意更换数据库。

mybatis中#和$的区别?
#为参数占位符,也就是sql预编译,在DBMS中进行变量替换,替换后会自动加上单引号,能够有效防止sql注入
$为字符串替换,也就是sql拼接,在DBMS外进行变量替换,替换后不会自动加单引号,不能防止sql注入。

Mysql的一级,二级缓存?
一级缓存是基于sqlsession默认开启的,需要创建sqlsession对象,是使用hahmap来存储的,不同的sqlsession之间是互不影响的,当在同一个sqlsession中查询两次数据时,第一次查询完数据后会将数据写入到缓存中,第二次就会在缓存中直接获取数据,提高查询效率。
二级缓存和一级缓存的机制相同,也是使用hsahmap来存储,不同点是她的作用域是mapper,可以自定义存储源,默认不打开二级缓存,sqlsession之间是共享的,可能存在脏读或者脏写的情况。

Xml映射文件中除了常见的select、insert、update、delete标签之外,还有那些标签?
、、、、、、、、、、

为什么说Mybatis是半自动ORM映射工具?他与全自动的区别在哪里?
Hibernate就属于全自动ORM映射工具,使用Hibernate查询对象时,可以根据对象的关系模型直接获取。所以是全自动的,Mybatis需要手动编写SQL。所以是半自动ORM映射工具。

Mybatis动态sql是做什么的?都有那些动态sql?能简述一下动态sql的执行原理吗?
Mybatis动态sql可以让我们在xml映射文件内,以标签的形式编写动态sql,完成逻辑判断和动态拼接sql的功能。其执行原理是使用OGNL从sql参数对象中计算表达式的值,根据表达式的值动态拼接sql,以此来完成动态sql的功能。

MySql优化:
首先是硬件方面的优化。
还有就是存储引擎的优化,事务型选择innoDB,非事务型选择MyISAM。
表结构设计的优化。符合三范式的要求。
开启查询缓存,当只需要一行数据时,使用limit1.
为搜索字段创建索引。
不使用select*。

为什么要使用自增列作为主键?
如果使用自增主键,那么每次插入数据就会按照是顺序依次插入,当一页写满时,就会开辟一个新的页面。如果使用非自增作为主键,那么每次插入的数据都很随机,其他数据就会因为新数据的插入而移动,增加了很多开销。

Mybatis是否支持延迟加载?如果支持。它的实现原理是什么?
Mybatis仅支持一对一和一对多的延迟加载,在mybatis配置文件中,可以配置是否启动延迟加载lazyloadingEnabled=ture/false
原理是:
使用CGLIB创建目标对象的代理对象,当调用目标方法时,进入拦截器方法。比如当A调用B属性的名称时,发现是null。那么就会发送事先保存好的B对象的sql,进行查询,然后调用set方法,然后A对象B属性就有值了。接着完成调用就可以了。

数据库3大范式
1NF:保证每列字段不可以再拆分(原子性)
2NF:在1NF基础上,每张表只描述一件事
3NF在2NF基础上,确保数据表中的每一列数据都和主键直接相关,而不能间接相关。

SQL语句主要分为那几类?
数据定义语言DDL
数据查询语言DQL
数据操纵语言DML
数据控制功能DCL

mysql数据库的存储引擎你知道哪些,有什么区别
1.MyISAM:不支持事务,不支持外键,适用于有大量的select操作的表,如 日志表,表级别锁
2.InnoDB(MySQL5.5以后默认使用):支持事务,支持外键关联,应用于执行大量的insert和update操作的行级别锁

Mysql关联查询有哪些?
交叉连接、内连接、外连接、联合查询、全连接

什么是子查询?
条件查询:一条sql语句的查询结果作为另一条查询语句的条件或查询结果。
嵌套查询:多条sql语句嵌套使用,内部的sql查询语句称为子查询。

Select*和select全部字段的两种写法有什么优缺点?
1.Slelect要解析数据字典,select全部字段不用
2.select
输出顺序和建表列顺序相同,select全部字段按指定字段顺序;
3.Select不需要修改表字段名,后者需要改。
4.Select全部字段可以建立索引进行优化,select
无法优化。
5.select全部字段可读性比select*高。

说一下乐观锁和悲观锁?
乐观锁: 每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在提交更新的时候会判断一下再此期间别人有没有去更新这个数据。
悲观锁:每次拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻止,直到 锁被释放。
数据库的乐观锁需要自己实现,在表里面添加一个version字段,每次修改成功值加1,这样每次修改的时候先对比一下,version是否一致,如果不一致就不修改,这样就实现了乐观锁。
如何解决bean中属性名和数据库字段名不一致?
在sql语句中使用别名,或者使用ResultMap结果集接受数据。
mybatis如何进行分页的?
使用rowbounds 插件进行分页。或者使用物理分页,直接在sql语句中,使用limit
进行分页查询。
Mybatis的Xml映射文件中,不同的Xml映射文件,id是否可以重复?
不同的xml映射文件中,如果配置了namespace,那么id就可以重复,如果没有配置namespace那么id就不能重复。