1 select
1.1 使用select进行查询
传递参数:
这里实现的是进行模糊查询:
1.1.1 传递map参数
这是mapper文件中的查询语句
<select id="findRoleByMap" parameterType="map" resultType="role">
select id,role_name as roleName,note from t_role where role_name like concat('%',#{roleName},'%')
and note like concat('%',#{note},'%')
</select>
接口文件中的定义public List<Role> findRoleByMap(Map<String, String> params);
调用方法:
Map<String, String> paramsMap = new HashMap<>();
paramsMap.put("roleName", "zhangsan");
paramsMap.put("note", "notes");
RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);
List<Role> lists = roleMapper.findRoleByMap(paramsMap);
for (int i = 0; i < lists.size(); i++) {
System.out.println(lists.get(i));
}
1.1.2 使用注解方式传递参数
我们需要使用mybatis的参数注解@Param
<select id="findRoleByMaps" resultType="role">
select id,role_name as roleName,note from t_role where role_name like concat('%',#{roleName},'%')
and note like concat('%',#{note},'%')
</select>
这个时候可以不用声明select语句中的parameterType
public List<Role> findRoleByMaps(@Param("roleName") String rolename, @Param("note") String note);
这样就可以像上面那样调用了。
1.1.3 使用JavaBean传递参数
当参数过多的情况下,mybatis允许通过javabean传参数,但是要有get和set方法
public class RoleParam {
private String roleName;
private String note;
}
接口文件中增加下面这个函数
public List<Role> findRoleByMap1(RoleParam param);
mapper配置文件中增加下面这条语句:
<select id="findRoleByMap1" parameterType="params.RoleParam" resultType="role">
select id,role_name as roleName,note from t_role where role_name like "%"#{roleName}"%"
and note like concat('%',#{note},'%')
</select>
上面的参数和javabean中的参数名一定要一致。
1.2 使用resultMap映射结果集
<resultMap type="com.dlj.pojo.Role" id="roleResultMap">
<id property="id" column="id"/>
<result property="roleName" column="role_nmae"/>
<result property="note" column="note"/>
</resultMap>
上面的那个id用来唯一标识,下面这个id标识使用哪个属性来作为其主键,result元素定义普通列的映射关系。
2 insert
插入语句实例
<insert id="inssetRole" parameterType="role" useGeneratedKeys="true" keyProperty="id">
insert into t_role(role_name,note) values(#{roleName},#{note})
</insert>
上面的useGeneratedKeys属性标识使用数据库内置策略生成主键,keyProperty属性指定哪个是主键字段。这样我们插入以后,还可以获得插入后生成的主键的值
SqlSession sqlSession = SqlSessionFactoryUtil.openSqlSession();
RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);
Role role = new Role();
role.setRoleName("test4");
role.setNote("testNote");
roleMapper.insertRole(role);
System.out.println(role.getId());
3 update 元素和delete元素
<update id="upateRole" parameterType="role">
update t_role set role_name=#{roleName},note =#{note} where id=#{id}
</update>
<delete id="delete" parameterType="long">
delete from t_role where id=#{id}
</delete>
4 sql元素
我们可以通过定义一串sql语句,在其他的语句中通过引用来使用它
<sql id="role_columns">
role_name,note
</sql>
<insert id="insertRole" parameterType="role" useGeneratedKeys="true" keyProperty="id" >
insert into t_role <include refid="role_columns"></include> values(#{roleName},#{note})
</insert>
5 resultMap
resultMap的作用是定义映射规则、级联的更新、定制类型转化器等
5.1 resultMap元素的组成
<resultMap type="" id="">
<constructor>
<idArg/>
<arg/>
</constructor>
<id/>
<result/>
<association property=""></association>
<collection property=""></collection>
<discriminator javaType="">
<case value=""></case>
</discriminator>
</resultMap>
resultMap中的id代表着整个resultMap的标识,type代表着我们需要映射的POJO。
其中constructor元素用于配置构造方法,一个POJO可能不存在无参的构造方法,这个时候我们就可以使用constructor进行配置,假设角色类RoleBean不存在没有参数的构造方法,它的构造方法声明为public RoleBean(Integer id,String roleName),那么我们需要配置这个结果集。
<constructor>
<idArg column="id" javaType="int" />
<arg column="role_name" javaType="string"/>
</constructor>
id元素表示哪个列是主键,如果有多个主键的话,则定义多个id。
<!-- property:主键在pojo中的属性名 -->
<!-- column:主键在数据库中的列名 -->
<id property="id" column="id" />
result元素定义普通属性:
<result property="createtime" column="createtime" />
5.2 级联
- association 代表一对一关系
- collection 代表一对多关系
- diccrimination 鉴别器,它可以根据实际选择采用哪个类作为实例,允许你根据特定的条件去关联不同的结果集。
6 缓存
mybatis对缓存提供技术支持,但是在没有欸之的默认情况下,它只开启一级缓存(一级缓存只是相对于同一个SqlSession而言),而二级缓存的开启是需要配置的,MyBatis要求返回的POJO必须是可序列化的,也就是要实现Serializable接口,然后再进行配置,在xml文件中配置就可以开启缓存
<cache />
当开启二级缓存以后(二级缓存是在SqlSessionFactory层面所共享的),意味着:
- 映射文件里所有的select语句将会被缓存
- 所有的insert、update和delete语句会刷新缓存
- 缓存会使用LRU(最近最少使用的)算法来回收
- 缓存会存储列表集合或对象(无论查询方法返回什么)的1024个引用
- 缓存会被视为read/write(可读/可写)的缓存,意味着对象检索不是共享的,而且可以安全地被调用者修改,不干扰其他调用者或线程所作的潜在修改
我们也可以修改二级缓存的默认配置
<cache eviction="LRU " flushInterval="100000" size="1024" readOnly="true" ></cache>
eviction是缓存回收的策略,包含以下几种:
- LRU 最近最少使用,移除最长时间不用的对象
- FIFO 先进先出,按对象进入缓存的顺序移除它们
- SOFT 软引用,移除基于垃圾回收器状态和软引用规则的对象
- WEAK 弱引用,更积极地移除基于垃圾收集器状态和若引用规则的对象
flushInterval: 刷新时间间隔
size: 引用数目,一个正整数
readOnly: 只读,意味着缓存数据只能读取而不能修改。这样设置的好处是我们可以快速读取缓存。