接上,如果想要按id查找一条数据
这样拿值(#{}),引用类型时,拿到parameterType里的类的该字段的值
#{} 参数是采用预编译 防止sql注入
${}参数是采用sql拼接 无法防止sql注入
#{} 参数是简单类型 (基础类型和字符串),变量可以任意
${} 参数是简单类型 (基础类型和字符串),变量必须是value
#{} 参数是引用类型,变量是引用类型中的属性,不可任意
${} 参数是引用类型 ,变量是引用类型中的属性,不可任意
在数据库中,用navicat,区间查询是这样的
1.
从七号到八号范围内的数据
2.
在mybatis配置文件中,如下可以做到查询多条
两者等价
这样调用
还可以用可变数组调用,创建一个vo类
可变数组的uservo类
另外区间查询
collection是集合。item是单个个体(联想foreach循环),和#{id}对应,叫什么都行,但是得对应,没有结尾就不用写close了
各种标签
if
配置文件里,条件语句
where
用where标签,开始的sql语句(select * from user)就不用写where 1=1了(符合条件才where)
有时候有重复的,可以公用
这样就可以实现公用,直接写from user就行,前边不用写,其他语句同理
一对多
sql语句
把这些数据封到一个对象里。用户对多个账户
(List是ArrayList的多态)
这样运行会发现数据没有被封进去
因为是多表,没有完整的表对应。所以用手动映射。方法如下
一对多这么干,查的类型是Account那个类
注意
这两个对应
多对多如图,原理差不多
延迟加载
延迟加载可以防止运行时浪费等,使另一个东西需要时再加载
多对一相当于把之前一句话,变成现在的两句话
x
先用方法把id查出来,才能用findByIdwhere
还需要开启识别延迟加载
调的时候是一样的
发现所有东西都出来了,因为上面这个account包含用户和账号
这样写就会只输出money
一对多
同理
这人俩账号
mybatis的一级缓存和二级缓存
经常查的、不经常更改的放到缓存中,缓存没有再去数据库(磁盘)
4.查第二次返回地址是一样的说明是有缓存。是取出来了。不是覆盖。如果是两条。就说明没有缓存
关于map
map就是key(在这里是sql语句):value(在这里是sql语句查出来的对象)格式.key在数组。value在链表
一级缓存存在的证明
由此可见有一级缓存存在。刚刚地址一样没有重新查。现在提交了没有缓存了就得重新查
二级缓存存的是一些离散的数据。不存放对象。存放的是零散的sql语句。语句用一个,但是对象是两个
存的是离散数据
二级缓存默认不开启。要在配置文件中加“<cache/>”开启,而且没有一级缓存才能用二级缓存
开启步骤
执行顺序是:先找1级,一级没有再找二级。最后找数据库。所以测试的时候先把一级缓存干掉