MyBatis的动态SQL标签有哪些?
if标签:条件判断
choose、when、otherwise标签:选择结构,类似java中的switch
trim标签:对包含的内容加上前缀,后缀
where标签:主要是用来简化SQL语句中where条件判断的,能智能的处理and or,不必担心多余导致语法错误
foreach标签:遍历元素
Mybatis的mapper如何传递多个参数
方式一,可以使用map进行传参,SQL中使用map的key来引用取值
方式二,可以在SQL中使用#{param1},#{param2}…来引用取值,它是根据mapper接口对应方法中形参的顺序进行匹配的,不管接口方法的参数名字叫个啥,SQL都只能使用param1,param2,等来取值
方式三,可以使用@Param注解,给mapper接口方法的参数命名,在SQL中直接使用取的名字来引用
Mybatis,关联对象查询,使用嵌套子查询和JOIN连表有什么区别
嵌套子查询,指的是在查询一个主对象的时候,使用单表查询,在resultmap中额外发送一个子sql查询关联对象,然后映射给主对象
连表join查询,指的是查询一个主对象的时候,使用join连表的方式把主对象和关联对象的数据一次性查出来,用resultmap映射结果
他们的区别,join连表查询只发一条sql就能把数据查询出来,嵌套子查询会有一个n+1的问题,就是说如果主查询出来n条数据,那么会额外发送n条子sql去查询对应的关联对象,加上主查询那1次,也就是n+1次,因此它的性能相对较低的,一般我们会使用join连表查询
为什么要使用连接池
对数据库的操作都需要取得连接,使用完都需要关闭连接,如果每次操作需要打开关闭连接,这样系统性能很低下。连接池就可以动态的管理这些连接的申请,使用和释放,我们操作数据库只需要在连接池里获取连接,使用完放回连接池,这样大大节省了内存,提高效率。
数据库连接池的原理主要分为三部分
- 第一,连接池的建立,在系统初始化时建立几个连接对象以便使用。
- 第二,连接池的管理,客户请求连接数据库时,首先查看连接池中是否有空闲连接,如果有直接分配,如果没有就等待,直到超出最大等待时间,抛出异常
- 第三,连接池的关闭,当系统关闭时,连接池中所有连接关闭
Redis部分
讲一下你理解的Redis,为什么Redis很快
Redis是一种高性能的,开源的,C语言编写的非关系型数据库,可以对关系型数据库起到补充作用,同时支持持久化,可以将数据同步保存到磁盘
说Redis很快是相对于关系型数据库如mysql来说的,主要有以下因素
- 第一,数据结构简单,所以速度快
- 第二,直接在内存中读写数据,所以速度快
- 第三,采用多路IO复用模型,减少网络IO的时间消耗,避免大量的无用操作,所以速度快
- 第四,单线程避免了线程切换和上下文切换产生的消耗,所以速度快
你常用的Redis的数据存储结构有哪些,他们的使用场景分别是什么
Redis存储形式是键值对,支持value形式包括String,List,Set,ZSet,Hash。
String可以用作缓存,计数器,防攻击,验证码、登录过期等
List可以用来做队列,秒杀等,
Set可以用来去重,
ZSet用于排序
redis的五种数据结构:
String类型 keyValue都是String (可以用作缓存)
List类型 Value可存放多个值,有序且重复(可以通过lpush,rpop实现队列 也可以通过range范围查询来实现分页功能,用户最近视频观看记录)
Set类型 无序但不可重复(因为可以自动去重因此可以实现并集交集差集,可以实现好友去重,可以实现抽奖活动,去重保证每个人参加一次,可以实现朋友圈点赞)
Zset类型 对应的每个set元素可添加一个分数(可以实现排行榜)
zset的底层是用跳表(一个多层的有序链表,一种基于概率统计的插入算法)实现Hash类型 value就是一个map类型(购物车),redis的Hash其实可以理解成JAVA中的MAP
>redis分为key和value,一般说的数据结构就是值value的结构,其中list、set、hash和java中的集合类似。