Mybatis框架的概念
Mybatis框架是java做持久层操作的框架,其底层还是jdbc,只不过采用了ORM思想,使得我们今后只需要关注sql语句和需要封装的javaBean对象即可,不需要再去做数据库驱动加载,获取Connnection链接,得到预编译对象,封装结果集等操作。
ORM:对象关系映射
在添加数据时得到当前数据的id
<selectKey keyProperty = “id” keyColumn=”id” order=”after” resultType=”int”>
Select LAST_INSERT_ID();
</selectKey>
模糊查询
方式一:
<select id=”findByName” parameterType=”string” resultType=”user”>
Select * from user where username like #{username}
</select>
测试: findByName(“%李%”)
注意:可以防止SQL注入,因为#{}是站位符,java与jdbc类型会自动转换,对象符合OGNL表达式;
方式二:
<select id=”findByName” parameterType=”string” resultType=”user”>
Select * from user where username like ‘%${value}%’
</select>
测试: findByName(“李”)
注意:会有SQL注入发生,${}只是拼接,如果是基本类型或者string类型必须写value,
如果是对象类型解析符合OGNL表达式规则
ResultType和ResultMap的区别
当数据库中列名和JavaBean中属性名一致的时候使用ResultType,否则使用ResultMap。
ResultMap的作用是手动给其指定哪列的值赋值到哪个属性中。
Mybatis是什么时候从数据库连接池中拿数据库链接的?
Mybatis是在真正开始执行数据库操作的时候才去拿数据库链接。
动态sql之if判断
<if test=””> </if>
动态sql之where
<where>标签就等同于在sql语句中拼接了一个where条件,而且如果后面紧挨着的条件中有and,会自动去掉。
动态sql之foreach
<select id=”findByName” parameterType=”QueryVo” resultType=”user”>
Select * from user
<if test=””>
<where>
<foreach collection=”ids” item=”id” separator=”or”>
Id=#{id}
</foreach>
</where>
</if>
</select>
注意:在数据库端如果要体系出一对一或者一对多靠的是主外键。那么在java端如果要体现出A到B是一对一,要在A对象中加一个B的对象属性。A到B体现一对多,主要是在A的javabean中加入B的对象集合。
延迟加载的概念
延迟加载是一种均衡服务器压力的技术,就是我们需要什么数据的时候,才执行对应的数据库操作,否则先不查询。前提条件必须是采用mybatis分步查询的方式。
一级缓存
Mybatis默认情况下一级缓存就是开启的状态。就是在我们要重复查询某一个对象的时候,只会在第一次查询的时候去数据库中查询,其余都直接从缓存中拿数据。除非中间出现了增删改等SqlSession的提交或者关闭操作。可见一级缓存是SqlSeesion级别的。只要SqlSession没有被提交或关闭,数据就一直在。
二级缓存
二级缓存需要手动开启,而且要使用二级缓存的对象必须实现序列化接口。即便是SqlSession对象被关闭了。数据依然存在。所以要谨慎使用。