MyBaits-基本使用

2022-05-11  本文已影响0人  石头耳东

零、本文纲要

  1. 结果映射
  2. 参数占位符
  3. parameterType
  4. 特殊字段处理
  5. 多条件查询
  6. 动态SQL
  7. 主键返回
  8. 批量删除
  9. 注解实现CRUD
  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 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[" 开始,由 "]]>" 结束

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);

注意:此处参数占位符内的名称,需与上述方式的@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

Ⅰ <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>

Ⅰ <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>
<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);

<foreach>标签

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

9. 注解实现CRUD

在注解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. 单个参数

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

三、结尾

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

上一篇下一篇

猜你喜欢

热点阅读