java博客记录

导航

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()));

 

posted on 2021-06-07 10:00  java博客记录  阅读(57)  评论(0)    收藏  举报