Mybatis面试题
Mybatis简介:半自动化的orm(对象关系映射)框架,内部封装了jdbc,但是禁用了事务的自动提交.
不用迭代结果集,方便多表操作,提供对象关系映射标签支持对象关系组建维护
关系型数据库:表与表之间有主外键关系,mysql、SQLserver
Mybatis中由于完全限定名太长,可以起个简短的别名,或者用类名表示完全限定名
<typeAliases>
<!--<typeAlias type="com.offcn.entity.Person" alias="Person"></typeAlias>-->
<package name="com.offcn.entity"></package>
</typeAliases>
#{} 与 ${}的区别
${}用在sql语句中获取字符串的值,有SQL注入的问题,存在安全隐患
#{}是占位符,利用preparestatement的set方法赋值,防止SQL注入.
#{}不能放到字符串里用来like模糊查询,也不能查询表名/字段名.
获取自增主键
1.改xxmapper.xml <insert useGeneratedKeys="true" keyProperty="xxid">
2.插入selectKey :
<selectKey keyColumn="eid" keyProperty="eid" resultType="int" order="AFTER">
select last_insert_id()
</selectKey>
keyColumn : 取指定列名。
keyProperty: 取出该列的值,把值映射到实体类的指定的属性中
resultType: 主键的返回值类型
Order: 执行sql之前,还是执行sql之后. After before
Mybatis查询对一的 情况:多对一和一对一
<association></association>
Property:复杂属性名
JavaType 复杂属性类型 association标签用javaType
Column和select,把查询出来结果的指定列作为select的参数
对多的情况:一对多和多对多
<collection></collection>
Property:实体类属性名,一般是集合
ofType:表示集合中元素的数据类型 collection标签内用ofType
column和select
表与表之间的关联关系一般由多的一方维护,在一的一方可以设置放弃维护
<set name="emps" inverse="true"> <!--true表示放弃表之间关联关系的维护-->
用xml配置默认延时加载,设置lazy=”false”或Hibernate.initialize(employee.getDepart())
而注解模式默认没有延迟加载
一对一关系中,由从表设置manytoone来维护关联关系
动态标签:
Where 在sql语句中附加where,去掉无关的and or
If
Choose when otherwise 只要一个条件成立,其他都不执行
Set 用于update语句附加set,去掉无关, 可以通过if判断该字符是否更新
Trim 用于where/set ,有前缀后缀之分
Foreach循环 用于批量添加/修改/删除
Collection:表示什么类型的集合
Item:集合元素
Separtor:分隔符
Open 循环前附加字符
Close 循环后附加字符
Index 集合中元素的索引
Bind 用于模糊查询,自定义key和value
Mybatis延迟加载:
一级缓存:默认开启 sqlsession中有一个Map<String,Object>,查询条件为key,查询结果为value 保存到map中,sqlsession关闭缓存就被清理sqlsession.clearCache(),生命周期短
sqlsession级别,对对象的增/删/改操作也会清空一级缓存
二级缓存:默认关闭 在sqlsessionFactory中有Map<String,Map<String,Object> map=new HashMap<>(),第一个String表示命名空间,第二个String是查询条件,Object是缓存数据
Mapper级别,对对象的增/删/改操作也会清空二级缓存,但只清空本命名空间的数据
开启方式
一:在mybatis核心配置中设置<setting name="cacheEnabled" value="true"/>
二:在mapper.xml文件中使用<cache></cache>
三:实体类实现serializable序列化接口
由于mybatis缓存是操作磁盘,效率远不如redis,menmercache操作内存,一般不用
开启二级缓存后,第一次查询会执行sql,第二次及以后的查询都会从缓存中读取数据
Mybatis 一二级缓存的区别:
Mybatis 首先去缓存中查询结果集,如果没有则查询数据库,如果有则从缓存取出返回结果集就不走数据库。Mybatis 的二级缓存即查询缓存,它的作用域是一个 mapper 的 namespace,即在同一个namespace 中查询 sql 可以从缓存中获取数据。二级缓存是可以跨 SqlSession 的。
数据库中密码被md5加密如何验证密码是否正确? 验证时也加密
criteria.andPasswordEqualTo(DigestUtils.md5DigestAsHex(password.getBytes()));
浙公网安备 33010602011771号