Mybatis动态代理_mapper.xml详解_动态sql

本文介绍了Mybatis的动态代理开发规范,包括映射文件与接口的对应关系,参数和返回类型的匹配。详细讲解了mapper.xml的parameterType、resultType、if条件判断和循环等元素的使用,并提供了解决属性名与字段名不一致问题的两种方法。

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

一、mapper动态代理
通常的架构中的持久层:dao接口,daoImpl实现类。
MyBatis持久成:dao接口,dao实现类(获取会话,调用sqlSession方法进行操作数据库)还有mapper.xml映射文件。
       Mybatis持久层演变成mapper接口(dao接口)和mapper.xml映射文件。

**mapper动态代理开发的规范要求:
       1、映射文件mapper.xml名字和接口名字一致。
       2、映射文件的namespace要和接口的路径一致。
       3、映射文件中的Statement的id要与接口的方法名一致。
       4、映射文件的输入参数的类型:paramterType和接口的参数类型一致。
       5、映射文件的输出结果 类型和接口的返回类型一致。
配置批量加载mapper的映射文件

<mappers>
	<!-- 扫描包的方式   批量加载mapper -->
	<package name="com.hpe.mapper"/>
</mappers>

二、mapper.xml详解
parameterType:输入参数类型:Java基本类型、实体类对象、hashMap
map传参:通过#{map的key}设置值,如果找不到key,不会报错,取值为null

<select id="selectMap" parameterType="map" resultType="User" >
	SELECT * FROM user WHERE sex = #{sex} AND address LIKE  #{address}
</select>

多参数:无需指定参数类型
       方法一:使用#{index}来取值,从0开始。

<select id="selectByParams" resultType="User" >
	SELECT * FROM user WHERE sex = #{0} AND address LIKE  #{1}
</select>

       方法二:接口参数使用@Param(“key”),然后通过#{key}的方式取值。原理:把当前的参数封装到一个map中。

/**
* 
 * 方法描述:第一种多参数的查询
 * @param sex
 * @param address
 * @return
 */
public List<User> selectByParams(@Param("sex")String sex, @Param("addr")String address);
--------------------------------------------------------
<select id="selectByParams" resultType="User" >
	SELECT * FROM user WHERE sex = #{sex} AND address LIKE  #{addr}
</select>

resultType:输出结果类型:Java基本类型、实体类对象、hashMap
实体类中属性名和数据库字段名不匹配问题
       解决方法一:给sql查询的结果起别名
       SELECT carId,name AS carName,userId FROM car
       解决方法二:resultMap,可以解决属性名和字段名不一致问题;解决映射复杂类型的实体类问题。

<resultMap type="com.hpe.pojo.Car" id="carMap">
	<!-- id:主键,唯一标识
		column:数据库表中的字段名
		property:实体类中的属性名
		column和property是映射关系
	 -->
	<id column="carId" property="carId" />
	<!-- result:普通结果 -->
	<result column="name" property="carName" />
	<result column="userId" property="userId"/>
	<!-- 如果字段名和属性名一致,可以省略 -->
</resultMap>

<select id="selectCar" resultMap="carMap">
		SELECT * FROM car
</select>

if条件判断
当判断条件为整数类型时

<if test="age!=null and age!=0">

条件 :<where>会去除多余的and、or

<select id="selectIf" parameterType="User" resultType="User">
	SELECT * FROM user 
	<where>
		<if test="sex!=null and sex!=''">
		 AND sex = #{sex}
		</if>
		<if test="address!=null and address!=''">
		 AND address LIKE #{address}
		</if>
	</where>
</select>

<set>会去除多余的逗号

<update id="updateUser" parameterType="user">
	UPDATE user   
	<set>
		<if test="address!=null and address!=''">
			address=#{address},
		</if>
		<if test="username!=null and username!=''">
			username=#{username},
		</if>
	</set>
	 WHERE id=#{id}
</update>

<foreach></foreach>循环
collection:传递过来的参数,可以是list、array(数组)、map的key、实体类中的属性
item:循环中的当前元素
index:当前元素的下标
open:循环的开始,以什么开始
close:循环的结束
separator:分隔符

<delete id="deleteByIds" parameterType="list">
	DELETE FROM user WHERE id IN
	<foreach collection="list" item="id" open="(" close=")" separator=",">
		#{id}
	</foreach>
</delete>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值