1、
MyBatis
的优点和缺点
优点:
(1)基于
SQL
语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,
SQL
写在 XML里,解除
sql
与程序代码的耦合,便于统一管理;提供
XML
标签,支持编写动态
SQL
语句,并可重 用。
(2)与
JDBC
相比,减少了
50%
以上的代码量,消除了
JDBC
大量冗余的代码,不需要手动开关连接; (
3
)很好的与各种数据库兼容(因为
MyBatis
使用
JDBC
来连接数据库,所以只要
JDBC
支持的数据库 MyBatis都支持)。
(4)能够与
Spring
很好的集成;
(5)提供映射标签,支持对象与数据库的
ORM
字段关系映射;提供对象关系映射标签,支持对象关系
组件维护。
缺点
(1)
SQL
语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写
SQL
语句的功底有一定 要求。
(2)
SQL
语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。
2、
#{}
和
${}
的区别是什么?
#{}
是预编译处理,
${}
是字符串替换。
Mybatis
在处理
#{}
时,会将
sql
中的
#{}
替换为
?
号,调用
PreparedStatement
的
set
方法来赋值;
Mybatis
在处理
${}
时,就是把
${}
替换成变量的值。
使用
#{}
可以有效的防止
SQL
注入,提高系统安全性。
3、 如何执行批量插入?
首先
,
创建一个简单的
insert
语句
:
<
insert id
=
”insertname”
>
insert into
names
(
name
)
values
(
#
{
value
})
</
insert
>
然后在
java
代码中像下面这样执行批处理插入
:
list
<
string
>
names
=
new
arraylist
();
names
.
add
(
“fred”
);
names
.
add
(
“barney”
);
names
.
add
(
“betty”
);
names
.
add
(
“wilma”
);
sqlsession sqlsession
=
sqlsessionfactory
.
opensession
(
executortype
.
batch
);
try
{
namemapper mapper
=
sqlsession
.
getmapper
(
namemapper
.
class
);
for
(
string name
:
names
) {
mapper
.
insertname
(
name
);
}
sqlsession
.
commit
();
}
catch
(
Exception e
){
e
.
printStackTrace
();
sqlSession
.
rollback
();
throw
e
;
}
finally
{
sqlsession
.
close
();
}
4、
Mybatis
的一级、二级缓存
:
1
)一级缓存
:
基于
PerpetualCache
的
HashMap
本地缓存,其存储作用域为
Session
,当
Session
flflush
或
close
之后,该
Session
中的所有
Cache
就将清空,默认打开一级缓存。
2
)二级缓存与一级缓存其机制相同,默认也是采用
PerpetualCache
,
HashMap
存储,不同在于其存 储作用域为 Mapper(Namespace)
,并且可自定义存储源,如
Ehcache
。默认不打开二级缓存,要开启 二级缓存,使用二级缓存属性类需要实现Serializable
序列化接口
(
可用来保存对象的状态
),
可在它的映射 文件中配置 ;
3)对于缓存数据更新机制,当某一个作用域
(
一级缓存
Session/
二级缓存
Namespaces)
的进行了
C/U/D 操作后,默认该作用域下所有 select
中的缓存将被
clear
掉并重新更新,如果开启了二级缓存,则只根 据配置判断是否刷新。