Mybatis--参数与结果的映射

1 参数的映射
传递一个Map,在Xml中parameterType设置为"map",在sql中可直接取map的key传递进去即可。
接口:

public List<User> testMapParam(Map<String,Object> param);

XML:

<select id="testMapParam" parameterType="map" resultType="com.test.mybatis.pojo.User">
		SELECT
		<include refid="Base_Column_List" />
		FROM user
		WHERE name LIKE CONCAT("%",#{name},"%")
	</select>

测试:

public static void testMapParam() {
		Map<String,Object> param=new HashMap<String,Object>();
		param.put("name", "测试");
		List<User> lstUser = userDao.testMapParam(param);
		for(User user:lstUser) {
			System.out.println(user);
		}
	}

参数传递Map

    <update id="updateCompany">
        UPDATE company
        <set>
            <foreach collection="map.entrySet()" index="key" item="value" separator=" , ">
                ${key} = #{value}
            </foreach>
        </set>
        WHERE id=#{companyId}
    </update>

参数传递List

    <insert id="batchInsert">
        INSERT INTO company(company_name,user_id,create_time)
        <foreach collection="lstCompany" item="company" open=" VALUES " close="" separator=",">
            (#{company.companyName},#{company.userId},now())
        </foreach>
    </insert>

参考:https://www.cnblogs.com/ismallboy/p/11076333.html

2 结果映射
映射到实体可以将resultType设置为实体的全限定名。映射成Map将resultType设置为"map"即可。
Dao:

public List<Map<String,Object>> testResultMap(Integer id);

XML

<select id="testResultMap" parameterType="java.lang.Integer" resultType="map">
		SELECT
		<include refid="Base_Column_List" />
		FROM user
		WHERE id=#{id}
	</select>

测试:

public static void testResultMap() {
		List<Map<String, Object>> testResultMap = userDao.testResultMap(3);
		for(Map<String, Object> map:testResultMap) {
			System.out.println(map);
		}
	}

association标签
主要用在一对一的场景下,比如一个用户对于一个公司,现在有user表和company表,company的user_id对于user表的id。
Company Model中有一个User类型的变量,利用association实现嵌套查询
CompanyMapper.xml

    <resultMap id="companyAndUserMap" type="com.test.model.CompanyAndUserDetail" extends="BaseResultMap">
        <association property="user" column="user_id" javaType="com.test.model.User" select="com.test.dao.UserMapper.selectByPrimaryKey">
        </association>
    </resultMap>

    <select id="selectUserAndCompanyInfo" resultMap="companyAndUserMap">
        SELECT *
        FROM company
    </select>

子查询用户信息

    <select id="selectByPrimaryKey" resultType="com.test.model.User">
        select *
        FROM user
        WHERE id=#{userId}
    </select>

打印SQL日志
在这里插入图片描述
发现执行了一次company查询,多次user查询,这就是n+1查询问题,一次查询(即可+1)出了多条记录,每条记录然后去执行子查询(即为n)。

使用关联的嵌套结果映射

    <resultMap id="companyAndUserMap02" type="com.test.model.CompanyAndUserDetail" extends="BaseResultMap">
        <association property="user" javaType="com.test.model.User" columnPrefix="u_">
            <id column="id" property="id" />
            <result column="username" property="username" />
            <result column="password" property="password" />
            <result column="create_time" property="createTime" />
        </association>
    </resultMap>
    <select id="selectCompanyAndUserInfo02" resultMap="companyAndUserMap02">
        SELECT c.*,
         u.id AS u_id,u.username AS u_username,u.password AS u_password,
         u.create_time AS u_create_time
        FROM company AS c
        LEFT JOIN user AS u ON c.user_id=u.id
    </select>

可以避免N+1查询问题

collection集合
适用于一对多的场景,比如一个用户有多个角色,在用户model中有一个角色集合,通过collection标签,将数据映射到List变量中,需要设置get和set方法

    <resultMap id="userAndRoleMap" type="com.test.model.UserRoleDetail" extends="BaseResultMap">
        <collection property="role" columnPrefix="r_" ofType="com.test.model.Role">
            <id column="id" property="id" />
            <result column="role_name" property="roleName" />
            <result column="create_time" property="createTime" />
        </collection>
    </resultMap>
    <select id="selectUserAndRoleDetail" resultMap="userAndRoleMap">
        SELECT u.*,
        r.id AS r_id,
        r.role_name AS r_role_name,
        r.create_time AS r_create_time
        FROM user AS u
        LEFT JOIN user_role AS ur ON u.id=ur.user_id
        LEFT JOIN role AS r ON ur.role_id=r.id
    </select>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值