Mybatis 输入映射和输出映射 2021-09-21

Mybatis 应用

1 Mybatis 入门与编码流程
2 mapper代理开发方式
3 全局配置文件
4 输入映射和输出映射
5 关联查询
6 延迟加载
7 动态SQL
8 Mybatis缓存


一、输入类型

1.1 parameterType(输入类型)

parameterType属性可以映射的输入参数Java类型有:简单类型、POJO类型、Map类型、List类型(数组)。
Map类型和POJO类型的用法类似,只示例POJO类型的相关配置。
List类型在动态SQL部分进行讲解。

POJO类型的输入参数设置

1、功能说明:实现 SELECT * FROM user where username like ‘%小明%’ 查询接口。

2、 相关代码实现
核心是使用.获取POJO 中的属性,${} 获取数据。

定义包装对象QueryVO

public class QueryVO { private User user; }

Mapper文件
为何使用${}, 与#{}的区别是什么?

<!-- 使用包装类型查询用户 使用ognl从对象中取属性值,如果是包装对象可以使用.操作符来取内容部的属性 --> 
<select id="findUserList" parameterType="queryVo" resultType="user"> 
	SELECT * FROM user where username like '%${user.username}%' 
</select>

Mapper接口


/*** 用户管理mapper */ 
public interface UserMapper { 
//综合查询用户列表 
	public List<User> findUserList(QueryVo queryVo)throws Exception; 
}

二、输出映射

2.1 resultType(输出类型)

使用resultType进行输出映射时,要求sql语句中查询的列名(列别名)和要映射的pojo的属性名一致。
注意:输出简单类型必须查询出来的结果集只有一列

2.2 resultMap

如果sql查询列名和pojo的属性名可以不一致,通过resultMap将列名和属性名作一个对应关系,最终将查询结果映射到指定的pojo对象中。
resultType底层也是通过resultMap完成映射的。

1、 功能描述:
将以下sql的查询结果进行映射:

SELECT id id_,username username_,birthday birthday_ FROM user

2、 代码实现

2.2.1 resultMap

  • 定义resultMap:将查询的列名和映射的pojo的属性名做一个对应关系
  • type:指定查询结果要映射的pojo的类型 id:指定resultMap的唯一标示

2.2.2 id

表示查询结果集的唯一标识,非常重要。如果是多个字段为复合唯一约束则定义多个

  • Property:表示User类的属性。
  • Column:表示sql查询出来的字段名。
  • Column和property放在一块儿表示将sql查询出来的字段映射到指定的pojo类属性上。

2.2.3 result

普通结果,即pojo的属性。

Mapper映射文件示例

<mapper namespace="com.kkb.mybatis.resultmap_01.mapper.UserMapper">
    <!-- 定义resultMap:将查询的列名和映射的pojo的属性名做一个对应关系 -->
    <!--type:指定查询结果要映射的pojo的类型 id:指定resultMap的唯一标示 -->
    <resultMap type="com.kkb.mybatis.resultmap_01.po.User" id="userListResultMap">
        <!-- id标签:映射查询结果的唯一列(主键列) column:查询sql的列名 property:映射结果的属性名 -->
        <id column="id_" property="id"/>
        <!-- result标签:映射查询结果的普通列 -->
        <result column="username_" property="username"/>
        <result column="birthday_" property="birthday"/>
    </resultMap>

    <select id="findUserListResultMap" resultMap="userListResultMap">
        SELECT id id_, username username_, birthday birthday_
        FROM user
    </select>
</mapper>

三、 #{}和${}区别

3.1 类比JDBC 字符

  • #{} :相当于JDBC SQL语句中的占位符? (PreparedStatement)
  • ${} : 相当于JDBC SQL语句中的连接符合 + (Statement)

3.2 string类型的区别

  • #{} : 进行输入映射的时候,会对参数进行类型解析(如果是String类型,那么SQL语句会自动加 上’’)
  • ${} :进行输入映射的时候,将参数原样输出到SQL语句中

3.3 参数名称区别

  • #{} : 如果进行简单类型(String、Date、8种基本类型的包装类)的输入映射时。参数名称可以任意。
  • ${} : 如果进行简单类型(String、Date、8种基本类型的包装类)的输入映射时,${}中参数名称必须是value。

3.4 SQL 注入问题

${} :存在SQL注入问题 ,使用OR 1=1 关键字将查询条件忽略

四、 主键返回

插入操作后获取id: 添加selectKey标签实现主键返回。

  • keyProperty:指定返回的主键,存储在pojo中的哪个属性
  • order:selectKey标签中的sql的执行顺序,是相对与insert语句来说。由于mysql的自增原理,执行完insert语句之后才将主键生成,所以这里selectKey的执行顺序为after。
  • resultType:返回的主键对应的JAVA类型
  • LAST_INSERT_ID():是mysql的函数,返回auto_increment自增列新记录id值。
    <insert id="insertUser" parameterType="com.kkb.mybatis.po.User">
        <!-- selectKey将主键返回,需要再返回 -->
        <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
            select LAST_INSERT_ID()
        </selectKey>
        insert into user(username,birthday,sex,address)
        values(#{username},#{birthday},#{sex},#{address});
    </insert>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值