Mybatis笔记之映射器

本文深入探讨MyBatis框架的高级应用,包括模糊查询、参数传递方式、结果集映射、缓存机制等核心功能,以及如何通过构造方法、主键、普通属性等元素配置resultMap。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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: 只读,意味着缓存数据只能读取而不能修改。这样设置的好处是我们可以快速读取缓存。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Master_Yoda

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值