MyBatis框架 传参、事务、缓存(二级)

传参

在mapper.xml文件中的标签中的parameterType可以可控制参数
传入参数的方法:

sSession.select("虚拟包.id", 参数列表);
SQL语句中获取参数的三种方式

方式:通过#{ }获取参数、相当于一个占位符
①使用索引,从0开始,也可使用param1表示第一个参数,
例:

<select id="selVipMoney" resultType="int" parameterType="int">
     select money from vip where cardid=#{0} 
     <!--或者:select money from vip where cardid=#{param1}-->
</select> 

Tips:如果只有一个参数(基本数据类型或String),对{}内部信息并无要求

②如果参数是对象,#{属性名}
例:

<select id="selhighprice" resultType="Commodity" parameterType="Commodity">
     	select * from commodity where price>${price}
</select>

③如果参数是map,#{key}
例:

<select id="selpage" resultType="Commodity" parameterType="map">
     	select * from commodity limit #{index},#{number}
</select>

Ps:此处测试的是分页查询,对于分页查询:
需先计算,后传入,占位符(?)不允许在关键字前后进行数学运算

除此之外,也可通过${}(不常用)获取参数
方式:不使用占位符,是字符串拼接
①对于对象,默认找${属性}的get/set方法
②对于map,通过、${key}获取
③若写一个数字,就表示一个数字

事务管理

在mybatis中默认关闭了JDBC的自动提交功能,即每一个SqlSession默认不自动提交事务。
手动提交事务:.session()
事务回滚:.rollback() 在出现异常时使用

Ps:.setAutoCommit(true)设置为自动提交

缓存

1)、含义
应用程序和数据库交互的过程是一个相对比较耗时的过程
缓存可以使得应用程序减少对数据库的访问,提升程序运行效率
①先去缓存区查询
②无缓存去数据库查询
③返回查询结果,并放入缓存区

2)、mybatis中默认开启SqlSession缓存
同一个SqlSession对象调用同一个<select>时,第一次查询之后,会把
结果缓存到缓存区中(内存)。
例:

	System.out.println("一个SqlSession:");
  	sSession.selectList("com.mfqh.mapper.kfcMapper.selGoods");
  	sSession.selectList("com.mfqh.mapper.kfcMapper.selGoods");
  	
  	System.out.println("新建一个SqlSession:");
  	SqlSession sSession2 = factory.openSession();
  	sSession2.selectList("com.mfqh.mapper.kfcMapper.selGoods");

结果(通过log4j输出):
在这里插入图片描述
可以看出同一个对象第二次查询命中缓存,但在另一个SqlSession中,需要再次查询数据库,即每个SqlSession对象都有一个独立的缓存区

Ps:一个<select>对应一个Statement对象,实质是缓存Statement对象
在<select>元素的statementType属性可以定义具体的Statement对象:
Statement,PreParedStatement(默认,带参数的sql语句),CallableStatement(调用存储过程)

3)、二级缓存(每个sqlSessionFactory有一个缓存)
可在mapper<namespace>中添加子元素<cache readOnly=“true”/>开启
例:

	System.out.println("一个SqlSession:");
  	sSession.selectList("com.mfqh.mapper.kfcMapper.selGoods");
  	sSession.selectList("com.mfqh.mapper.kfcMapper.selGoods");
  	System.out.println("新建一个SqlSession:");
  	sSession.commit();
  	SqlSession sSession2 = factory.openSession();
  	sSession2.selectList("com.mfqh.mapper.kfcMapper.selGoods");

结果:
在这里插入图片描述
不难看出,mybatis第一次查询未命中缓存,去数据库查询并存储数据到缓存,第二次和第三次(另一对象)查询皆命中缓存

Ps:实体类需实现序列化接口
当session.commit()或session.close()时,才会缓存到factory缓存区中
适用场景:当数据被频繁查询,很少被修改时(修改后易产生脏数据(内存和数据库信息不一致))

Tips:<select>标签的useCache属性可以设置是否使用二级缓存
增删改标签的flushCache属性默认为true,即每次操作都会刷新缓存

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值