Mybatis基础知识

参考博客:http://events.jianshu.io/p/4367b3838874
Mybatis 中#{}和$ {}的区别是什么?
1、在MyBatis 的映射配置文件中,动态传递参数有两种方式:
(1)#{} 占位符
(2)${} 拼接符
2、#{} 和 ${} 的区别
(1)
  1)#{} 为参数占位符 ?,即sql 预编译
  2)KaTeX parse error: Expected 'EOF', got '#' at position 28: …sql 拼接 (2)   1)#̲{}:动态解析 -> 预编译 …{}:动态解析 -> 编译 -> 执行
(3)
  1)变量替换后,#{} 对应的变量自动加上单引号 ‘’
  2)变量替换后,${} 对应的变量不会加上单引号 ‘’
(4)
  1)#{} 能防止sql 注入
  2)${} 不能防止sql 注入
3、#{} 和 ${} 的实例:假设传入参数为 1
(1)开始
  1)#{}:select * from t_user where uid=#{uid}
  2)${}:select * from t_user where uid= ‘${uid}’
(2)然后
1)#{}:select * from t_user where uid= ?
2)${}:select * from t_user where uid= ‘1’
(3) 最后
  1)#{}:select * from t_user where uid= ‘1’
  2)${}:select * from t_user where uid= ‘1’
4、#{} 和 ${} 的大括号中的值
(1)单个参数的情形
  1)#{}
    无MyBatis 默认值,可任意,且与参数名无关
    在这里插入图片描述
    在这里插入图片描述在这里插入图片描述
    
    2)${}
    <1>使用 MyBatis 默认值 value,即 ${value}
在这里插入图片描述
在这里插入图片描述
<2>使用自定义参数名,前提:在映射器接口方法的参数前加注解@Param(“”)
在这里插入图片描述
在这里插入图片描述
(2) 多个参数的情形
#{}
1、使用Mybatis默认值arg0、arg1、arg2…或param1、param2、param3…
在这里插入图片描述
在这里插入图片描述
2、 使用自定义参数名,前提: 在映射器接口方法的参数前加注解@Param(“”)
在这里插入图片描述
在这里插入图片描述
${}
1、使用Mybatis默认值arg0、arg1、arg2…或param1、param2、param3…
在这里插入图片描述
在这里插入图片描述
2、 使用自定义参数名,前提: 在映射器接口方法的参数前加注解@Param(“”)
在这里插入图片描述
在这里插入图片描述

#{} 和 ${} 在使用中的技巧和建议

1、不论是单个参数,还是多个参数,一律都建议使用注解@Param(“”)
2、 能用 #{} 的地方就用 #{},不用或少用 ${}
3、表名作参数时,必须用 ${}。如:select * from ${tableName}
4、order by 时,必须用 ${}。如:select * from t_user order by ${columnName}
5、表名处用#{}会直接报错;order by后面用#{}排序不生效
6、使用 ${} 时,要注意何时加或不加单引号,即 和 ′ {} 和 ' {}'。一般字段类型为char或者varchar时需要加单引号

2、 使用自定义参数名,前提: 在映射器接口方法的参数前加注解@Param(“”)
在这里插入图片描述
在这里插入图片描述

错误的使用的多个参数的情况

Schema:一个数据库用户所拥有的数据库的对象

Mybatis的缓存机制
● Mybatis有2种缓存机制,分别称之一级缓存和二级缓存

● (一个SqlSession内部)一级缓存是基于SqlSession的缓存,也称之为“会话缓存”,仅当是同一个会话、同一个Mapper、同一个SQL语句、同样的参数值时有效,默认开启,且整个过程不由人为控制(如果是自行得到SqlSession后的操作,可自行清理一级缓存)
在这里插入图片描述

每个SqlSession中持有了Executor,每个Executor中有一个LocalCache。当用户发起查询时,MyBatis根据当前执行的语句生成MappedStatement,在Local Cache进行查询,如果缓存命中的话,直接返回结果给用户,如果缓存没有命中的话,查询数据库,结果写入Local Cache,最后返回结果给用户。
● (多个SqlSession之间需要共享缓存)二级缓存默认是全局开启的,它是基于namespace的,所以也称之为“namespace缓存”
在这里插入图片描述

二级缓存开启后,同一个namespace(命名空间)下的所有操作语句,都影响着同一个Cache,即二级缓存被多个SqlSession共享,是一个全局的变量。
当开启缓存后,数据的查询执行的流程就是 二级缓存 -> 一级缓存 -> 数据库。

● 无论是一级缓存还是二级缓存,只要数据发生了写操作(增、删、改), 缓存数据都将被自动清理

● 由于Mybatis的缓存清理机制过于死板,所以,一般在开发实践中并不怎么使用!更多的是使用其它的缓存工具并自行制定缓存策略

Mybatis的延时加载

  1. 什么是延迟加载
    延迟加载也称为懒加载、惰性加载、按需加载,当我调用到关联的数据时才与数据库交互否则不交互
    使用延迟加载可以提高程序的运行效率,针对数据持久层的操作,在某些特定查询的情况下去访问特定的数据库,在其他情况下可以不访问某些数据表,尽量减少 SQL 的执行,从而达到提高速度的目的,是对数据库操作的一种优化。
    说明:延迟加载只存在于数据表的级联查询(多表关联查询)中,单表查询没有延迟加载的功能。
    具体的业务场景:
    数据库中有班级表(Class)和学生表(Student),当我们查询 Student 对象时,因为有级联关系,所以会将该 student 对象关联的 class 对象一并查询出来,这样就需要级联查询两张数据表的信息。
    在这里插入图片描述

延迟加载的思路是:当我们查询 Student 对象时,如果只用到了 name 或 GPA 的字段信息,没有调用 class 属性,则只发送一条 SQL 语句查询 Student 表;如果需要调用 Class 的属性,则发送两条 SQL 语句查询 Student 和 Class。
2.延时加载配置
延时加载功能默认关闭,需要在配置中显式开启。Xml配置是通过setting标签来开启延时加载功能,与之相关的主要有两个相关属性:
LazyLoadingEnabled:true表示开启懒加载,false表示关闭,默认为false
aggressiveLazyLoading:控制具有懒加载特性的对象的属性的加载
true:如果对具有懒加载特性的对象的任意调用会导致这个对象的完整加载。
false:每个属性都按需加载。
默认为true
具体配置
在这里插入图片描述
resultMap的用法以及关联结果集映射(associationcollection)
type:最好写成包的完整路径
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

没有查询的属性在user里面没有,该属性直接赋值为null
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

ofType的值是集合中存储元素的类型

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值