Mybatis映射配置

1深入Mybatis映射配置文件

1.1查询语句

接口中

    List<User> queryAllUser();
    
    User queryUserById(Integer id);

xml配置文件中

    <select id="queryAllUser" resultType="user">
        select * from user
    </select>
    
    <select id="queryUserById" resultType="user">
        select * from user where id = #{id}
    </select>

1.2插入语句

接口中

int insertUser(User user);

xml配置文件中

    <insert id="insertUser">
        insert into user (username,nick_name,email)
        values (#{username},#{nickName},#{email})
    </insert>

1.3删除语句

接口中

    void deleteUserById(Integer id);

XML配置中

    <delete id="deleteUserById">
        delete from user where id = #{id}
    </delete>

1.4更新语句

接口中

    void updateUser(User user);

XML配置中

<update id="updateUser">
    update user set password = #{password} where id = #{id}
</update>

1.5当接口中参数和XML配置取值时名称不一样时

在接口中的参数前加注解

User queryUserById(@Param("id") Integer xxxxxxxId);

在XML中取值时用注解指定的名称

<select id="queryUserById" resultType="user">
    select * from user where id = #{id}
</select>

2.#{}与${}的区别

* 它俩都可以获取接口调用中传递过来的参数
* #{}会将参数作为占位符,使用预编译语句(PreparedStatement)执行
* ${}会直接用实际参数替换${}, 参数可以作为SQL的一部分。

        在某些特殊场合下只能用${},不能用#{}。例如:在使用排序时ORDER BY ${id},如果使用#{id},则会被解析成ORDER BY “id”,这显然是一种错误的写法。

3.结果集如何映射

3.1ResultType方式

ResultType方式适用于数据库结果集可以直接映射成一个Java类的情况

Java实体类:

@Getter
@Setter
@ToString
public class User {
    private Integer id;
    private String username;
    private String nickName;
    private String password;
    private String email;
    private Timestamp lastLoginTime;
}

使用方法:

    <select id="queryAllUser" resultType="com.mybatis.bean.User">
        select * from user
    </select>

3.2ResultMap方式

ResultMap方式适用于复杂的结果集映射,比如数据库返回的结果集中的列名和JavaBean无法一一对应,或者对象间存在一对一、一对多关联映射时。

解决数据库列名与Java类中属性名不一致的映射问题

    <mapper>
        ...
        <resultMap id="userMap" type="user">
            <id property="id" column="id" />
            <result property="username" column="username" />
            <result property="lastLoginttime" column="last_login_time" />
            <result property="email" column="email" />
            <result property="nickName" column="nick_name" />
        </resultMap>
        ...
    </mapper>

在查询语句中将resultType换成resultMap

    <select id="queryAllUser" resultMap="userMap">
        select * from user
    </select>

解决一对一映射查询问题

实体类

@Getter
@Setter
@ToString
public class King {
    private Integer id;
    private String name;
    private Queen queen;    //一个对象中的属性引用了另一个对象
}

@Getter
@Setter
@ToString
public class Queen {
    private Integer id;
    private Integer kId;
    private String name;
}

映射文件

    <resultMap id="kingMap" type="king">
        <id column="kid" property="id" />
        <result column="kname" property="name" />
        <!-- 一对一映射关系 -->
        <association property="queen" javaType="queen" resultMap="queenMap" columnPrefix="queen_"/>
    </resultMap>
    
    <resultMap id="queenMap" type="queen">
        <id column="id" property="id" />
        <result column="name" property="name" />
        <result column="king_id" property="kId" />
    </resultMap>
    
    
    <select id="findKingById" resultMap="kingMap" useCache="true">
        SELECT
        k.id kid,
        k.`name` kname,
        q.id queen_id,
        q.`name` queen_name,
        k.id queen_king_id
        FROM
        king k
        LEFT JOIN queen q ON k.id = q.k_id
        WHERE
        k.id = 27
    </select>

解决一对多映射查询问题

实体类

    @Getter
    @Setter
    @ToString
    public class King {
        private Integer id;
        private String name;
        private List<Girl> girls;    // 一个对象的属性引用了若干个其他类型的对象
    }
    
    @Getter
    @Setter
    @ToString
    public class Girl {
        private Integer id;
        private Integer kId;
        private String name;
    }

映射文件

    <resultMap id="kingMap" type="king">
        <id column="kid" property="id" />
        <result column="kname" property="name" />
        <!-- 一对多映射关系 -->
        <collection property="girls" ofType="girl" resultMap="girlMap" columnPrefix="girl_" />
    </resultMap>
    
    <resultMap id="girlMap" type="girl">
        <id column="id" property="id" />
        <result column="name" property="name" />
        <result column="king_id" property="kId" />
    </resultMap>
    
    
    <select id="findKingById" resultMap="kingMap" useCache="true">
        SELECT
        k.id kid,
        k.`name` kname,
        g.id girl_id,
        g.`name` girl_name,
        k.id girl_king_id
        FROM
        king k
        LEFT JOIN girl g ON g.k_id = k.id
        WHERE
        k.id = 27
    </select>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值