MyBatis映射

获取新增记录主键

把新增主键封装到实体类中

1.xml

<insert id="funtion" parameterType="entity">
 <!--order:获取主键值时间。BEFORE:在 insert 执行前;AFTER:在 insert 语句执行后-->
 <selectKey keyColumn="表中主键列" keyProperty="实体类主键" order="AFTER" resultType="返回类型">
 	select last_insert_id() / SELECT @@IDENTITY
 </selectKey>
 	InsertSql语句
</insert>

<insert id="funtion" parameterType="entity"  useGeneratedKeys="true" keyProperty="实体类主键" 
keyColumn="表中主键列">
	InsertSql语句
</insert>

2.注解

@Insert("InsertSql语句")
    @SelectKey(
            statement = "select last_insert_id()",
            keyProperty = "实体类主键",
            keyColumn = "表中主键列",
            resultType = Long.class,
            before = false //插入后获取
)
void add(User user);

resultMap

1 实体类成员变量和数据库字段不一样时用

1.1 xml

<resultMap id="resultMap" type="返回实体类">
	<id column="主键" property="实体类变量"/><!--主键用id标签-->
	<result column="普通字段" property="实体类变量"/><!--普通字段用result标签-->
</resultMap>
<select id="方法名" resultMap="resultMap的id">
</select>

1.2 注解

@Select("SELECT * FROM table WHERE label1=#{arg}")
@Results({
	@Result(id = true,column = "字段",property = "实体类属性") //id:是否主键
})
XXX select方法(@Param("arg") String arg);

2 多表查询时用

2.1 单条sql查询

<!--autoMapping不需要配置的field-->
<resultMap id="返回实体类resultMap的id" type="返回实体类" autoMapping="true">
	 <!--
		 association:配置一对一关联关系
 		 property:要映射的属性名称
	 -->
	<association property="关联实体类属性" resultType="关联实体类"/>

	<!--
 		collection:配置一对多关联关系
 		property:要映射的属性名称
 		ofType:指定集合中存放的类型
	 -->
	 <collection property="关联实体类属性" ofType="关联实体类" resultType="关联实体类"/>
</resultMap>

<select id="方法名" resultMap="返回实体类resultMap的id">
	多表查询sql
</select>

2.2 多条sql查询

可以懒加载,访问主表数据时执行主表查询
在sqlMapperConfig.xml添加配置

<settings>
 	<!--开启延迟加载-->
	 <setting name="lazyLoadingEnabled" value="true"/>
 	<!--不使用积极加载-->
 	<setting name="aggressiveLazyLoading" value="false"/>
</settings>

2.2.1 xml

<resultMap id="返回实体类resultMap的id" type="返回实体类">
	 <!--
		association:配置一对一关联关系
 		property:要映射的属性名称
 		select:要调用的 sql 语句 id
 		column:要传递的参数字段
	 -->
	<association property="关联实体类属性" column="传递的从表的列"
 select="关联实体类查询sql的id"/>

	<!--
 		collection:配置一对多关联关系
 		property:要映射的属性名称
 		ofType:指定集合中存放的类型
		select:要调用的 sql 语句 id
 		column:要传递的参数字段
	 -->
	 <collection property="关联实体类属性" ofType="关联实体类" column="传递的从表的列" select="关联实体类查询sql的id"/>
</resultMap>

<select id="关联实体类查询sql的id" resultType="关联实体类">
	关联实体类查询sql,#{传递的从表的列}接收从表参数
</select>

<select id="方法名" resultMap="返回实体类resultMap的id">
	返回实体类查询sql
</select>

2.2.2 注解

@Select("SELECT * FROM table WHERE label1=#{arg}")
@Results({
	@Result(
		 column = "column", //传递的参数
		 property = "关联实体类属性", 
		 one = @One(
 				select = "查询关联实体类方法(加上包名可以是其他类的)",
				fetchType = FetchType.LAZY) //懒加载
	), 
	@Result(
		 column = "column", //传递的参数
		 property = "关联实体类属性", 
		 many = @Many(
 				select = "查询关联实体类方法",
				fetchType = FetchType.LAZY) //懒加载
	)
})
XXX select方法(@Param("arg") String arg);

XXX 查询关联实体类方法(@Param("column") String column);

3 使用通用resultMap

<resultMap id="通用resultMap的id" type="返回实体类">

<resultMap id="返回实体类resultMap的id" type="返回实体类" extends="通用resultMap的id">
	<!--会引用通用resultMap内的映射-->
</resultMap>

动态SQL

注解中使用要在sql语句加上<script>标签

@Select("<script>" +
            "SELECT * FROM table " +
                 "<where>" +
                     "<if test='arg1!= null'>" +
                         "arg1 =#{arg1}" +
                     "</if>" +
                     "<if test='arg2!=null'>" +
                         "and arg2= #{arg2}" +
                     "</if>" +
                 "</where>" +
            "</script>")
XXX select方法(@Param("arg1") String arg1,@Param("arg2") String arg2);

1 条件

<where><!--where作为标签防止全部条件为空-->
	<if test="条件1 and 条件2">
 		添加SQL
	</if>
</where>

2 遍历

传入参数为list或array时候用

<!--
	collection:参数类型,list或array
	open:拼装的 sql 语句片段的开始部分
	close:拼装的 sql 语句片段的结束部分
	item:当前遍历元素的变量名
	separator:指定分割符
-->

<foreach collection="list" item="entity" separator=",">
	(#{entity.filed1},#{entity.filed2})
</foreach>

<foreach collection="array" item="item" open="(" separator="," close=")">
	#{item}
</foreach>

3 选择

<choose> 
	<when test=""></when> 
	<otherwise></otherwise>
</choose>

通用sql

1 定义

<sql id="id">
	sql语句
</sql>

2 使用

<include refid="id"/>

二级缓存

不同sqlSession对象执行相同查询只发出一次sql
执行不是查询的方法都会清空缓存
sqlMapperConfig.xml

<settings>
	<setting name="cacheEnabled" value="true"/>
</settings>

1 xml

mapper.xml中开启

<mapper>
	<cache></cache>
</mapper>

2 注解

用在接口上

@CacheNamespace(blocking = true)
public interface XXXMapper{
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值