美文网首页
MyBaits-基本使用

MyBaits-基本使用

作者: 石头耳东 | 来源:发表于2022-05-11 18:03 被阅读0次

    零、本文纲要

    • 一、 CRUD
    1. 结果映射
    2. 参数占位符
    3. parameterType
    4. 特殊字段处理
    5. 多条件查询
    6. 动态SQL
    7. 主键返回
    8. 批量删除
    9. 注解实现CRUD
    • 二、MyBatis参数传递
    1. 多个参数
    2. 单个参数

    一、 CRUD

    1. 结果映射

    数据库字段brand_name与实体类brandName不匹配,无法正确封装数据的问题处理。

    • ① 起别名
    <select id="selectAll" resultType="brand">
        select
        id, brand_name as brandName, company_name as companyName, ordered, description, status
        from tb_brand;
    </select>
    

    补充:SQL片段

    Ⅰ 使用<sql>标签抽取共用片段

    <sql id="brand_column">
        id, brand_name as brandName, company_name as companyName, ordered, description, status
    </sql>
    

    Ⅱ 使用<include>标签引用共用片段

    <select id="selectAll" resultType="brand">
        select
        <include refid="brand_column" />
        from tb_brand;
    </select>
    
    • ② 使用resultMap

    Ⅰ 使用<resultMap>标签配置数据映射

    <resultMap id="brandResultMap" type="brand">
        <!--
                id:完成主键字段的映射
                    column:表的列名
                    property:实体类的属性名
                result:完成一般字段的映射
                    column:表的列名
                    property:实体类的属性名
            -->
        <result column="brand_name" property="brandName"/>
        <result column="company_name" property="companyName"/>
    </resultMap>
    

    Ⅱ 引用<resultMap>于SQL中使用

    <select id="selectAll" resultMap="brandResultMap">
        select *
        from tb_brand;
    </select>
    

    2. 参数占位符

    • ① #{}

    执行SQL时,会将 #{} 占位符替换为?,底层使用的是 PreparedStatement

    • ② ${}

    拼接SQL。底层使用的是 Statement

    3. parameterType

    对于有参数的mapper接口方法,在映射配置文件中应该配置 ParameterType 来指定参数类型。可以省略。

    4. 特殊字段处理

    参考xml的处理方式

    • ① 实体引用

    &lt; < less than
    &gt; > greater than
    &amp; & ampersand
    &apos; ' apostrophe
    &quot; " quotation mark

    • ② CDATA区

    CDATA 部分由 "<![CDATA[" 开始,由 "]]>" 结束

    5. 多条件查询

    • ① 接口方法编写

    Ⅰ 使用 @Param("参数名称") 标记每一个参数

    List<Brand> selectByCondition(@Param("status") int status, @Param("companyName") String companyName,@Param("brandName") String brandName);
    

    Ⅱ 将多个参数封装成一个实体对象

    List<Brand> selectByCondition(Brand brand);
    

    Ⅲ 将多个参数封装到map集合中

    List<Brand> selectByCondition(Map map);
    
    • ② 编写SQL

    注意:此处参数占位符内的名称,需与上述方式的@Param("名称")实体类属性Map的Key值一致

    <select id="selectByCondition" resultMap="brandResultMap">
        select *
        from tb_brand
        where status = #{status}
        and company_name like #{companyName}
        and brand_name like #{brandName}
    </select>
    

    6. 动态SQL

    • ① <where> & <if> 标签

    Ⅰ <if>标签

    test属性:编写逻辑表达式,进行逻辑判断

    Ⅱ <where>标签

    会动态的去掉第一个条件前的 and
    如果所有的参数没有值则不加 where 关键字

    <select id="selectByCondition" resultMap="brandResultMap">
        select *
        from tb_brand
        <where>
            <if test="status != null">
                and status = #{status}
            </if>
            <if test="companyName != null and companyName != '' ">
                and company_name like #{companyName}
            </if>
            <if test="brandName != null and brandName != '' ">
                and brand_name like #{brandName}
            </if>
        </where>
    </select>
    
    • ② <where> & <choose><when> 标签

    Ⅰ <choose>标签

    相当于switch

    Ⅱ <when>标签

    相当于case
    test属性:编写逻辑表达式,进行逻辑判断

    <select id="selectByConditionSingle" resultMap="brandResultMap">
        select *
        from tb_brand
        <where>
            <choose><!--相当于switch-->
                <when test="status != null"><!--相当于case-->
                    status = #{status}
                </when>
                <when test="companyName != null and companyName != '' "><!--相当于case-->
                    company_name like #{companyName}
                </when>
                <when test="brandName != null and brandName != ''"><!--相当于case-->
                    brand_name like #{brandName}
                </when>
            </choose>
        </where>
    </select>
    
    • ③ <set><if> 标签
    <update id="update">
        update tb_brand
        <set>
            <if test="brandName != null and brandName != ''">
                brand_name = #{brandName},
            </if>
            <if test="companyName != null and companyName != ''">
                company_name = #{companyName},
            </if>
            <if test="ordered != null">
                ordered = #{ordered},
            </if>
            <if test="description != null and description != ''">
                description = #{description},
            </if>
            <if test="status != null">
                status = #{status}
            </if>
        </set>
        where id = #{id};
    </update>
    

    7. 主键返回

    数据添加成功后,获取数据库自增生成的主键

    Ⅰ 添加insert标签属性

    useGeneratedKeys:是否获取自动增长的主键值。true表示获取
    keyProperty:指定将获取到的主键值封装到哪个属性里

    <insert id="add" useGeneratedKeys="true" keyProperty="id">
        insert into tb_brand (brand_name, company_name, ordered, description, status)
        values (#{brandName}, #{companyName}, #{ordered}, #{description}, #{status});
    </insert>
    

    8. 批量删除

    • ① 编写接口方法
    /**
      * 批量删除
      */
    void deleteByIds(int[] ids);
    
    • ② 编写SQL语句

    <foreach>标签

    <delete id="deleteByIds">
        delete from tb_brand where id
        in
        <foreach collection="array" item="id" separator="," open="(" close=")">
            #{id}
        </foreach>
        ;
    </delete>
    

    9. 注解实现CRUD

    • 查询 :@Select
    • 添加 :@Insert
    • 修改 :@Update
    • 删除 :@Delete

    在注解value属性中编写SQL语句即可

    @Select(value = "select * from tb_user where id = #{id}")
    public User select(int id);
    

    二、MyBatis参数传递

    1. 多个参数

    User select(@Param("username") String username,@Param("password") String password);
    

    2. 单个参数

    • ① POJO 类型

    直接使用。要求 属性名参数占位符名称 一致

    • ② Map 集合类型

    直接使用。要求 map集合的键名参数占位符名称 一致

    • ③ Collection 集合类型

    Mybatis 会将集合封装到 map 集合中,如下:

    map.put("arg0",collection集合);

    map.put("collection",collection集合;

    可以使用 @Param 注解替换map集合中默认的 arg 键名。

    • ④ List 集合类型

    Mybatis 会将集合封装到 map 集合中,如下:

    map.put("arg0",list集合);

    map.put("collection",list集合);

    map.put("list",list集合);

    可以使用 @Param 注解替换map集合中默认的 arg 键名。

    • ⑤ Array 类型

    Mybatis 会将集合封装到 map 集合中,如下:

    map.put("arg0",数组);

    map.put("array",数组);

    可以使用 @Param 注解替换map集合中默认的 arg 键名。

    • ⑥ 其他类型

    比如int类型,参数占位符名称 叫什么都可以。

    三、结尾

    以上即为MyBaits-基本使用的全部内容,感谢阅读。

    相关文章

      网友评论

          本文标题:MyBaits-基本使用

          本文链接:https://www.haomeiwen.com/subject/pvfjurtx.html