Mybatis的基本使用-一、查询

1、查询所有

实体类属性名和数据库表的列名不一致,则idea不能自动封装数据

解决方法:

 * 方法一: 起别名 :对不一样的字段名起别名,让别名和实体类的属性名一样
           - 缺点:每次查询都要定义一次别名
<select id="selectAll" resultType="brand">
        select id , brand_name as brandName, company_name as companyName, ordered,description,status  from tb_brand;
</select>
              * 解决方法:使用sql片段
                <sql id="brand_column">
                   id , brand_name as brandName, company_name as companyName, ordered,description,status
                </sql>
                <select id="selectAll" resultType="brand">
                    select  <include refid="brand_column"></include> from tb_brand;
                </select>
                * 缺点:sql片段不灵活
                   -解决:方法二

        * 方法二:resultMap:
          1. 在<mapper namespace="com.itheima.mapper.BrandMapper"></mapper>标签中定义resultMap标签
          2. 在<select>标签中使用resultMap属性替换resultType属性
 
 <!--
      id: 唯一标识
      type:映射的类型(支持别名)
    -->
    <resultMap id="brandResultMap" type="brand">
        <!--
          id:完成主键字段的映射
          result:完成一般字段的映射
              column: 该字段在数据库中的列名
              property: 该字段在实体类pojo的属性名
             <id column="brand_name" property="brandName"/>//主键字段的映射
        -->
         <result column="brand_name" property="brandName"/>
        <result column="company_name" property="companyName"/>
    </resultMap>

2、Id查询

<!--
       *参数占位符:
        1. #{};会替换为 ?, 为了防止SQl注入
        2. ${}; 拼sql语句,会存在sql注入问题
        3. 使用时机:
            * 参数传递的时候,使用#{}
            * 数据库表名或者列名不固定的时候,使用${}
            
            
         * 参数类型:
             parameterType="int";可以省略
             <select id="selectById" parameterType="int" resultMap="brandResultMap">
                 select * from tb_brand where id = ${id};
             </select>
         * 特殊字符处理:
            1. 转移字符:
             <select id="selectById" resultMap="brandResultMap">
                     select * from tb_brand where id &lt; ${id};
              </select>
            2. CDATA区://其实就相当于文本框;<![CDATA[ 这里就是填数据的地方 ]]>
             <select id="selectById" resultMap="brandResultMap">
                 select * from tb_brand where id <![CDATA[ < ]]> ${id};
              </select>
    -->

3、多条件查询

//    多条件查询

    /**
     *  * 参数接收:
     *      1. 散装参数:如果方法中有!!!多个参数!!!,需要使用@Param("sql参数占位符名称")
     *      2. 对象参数: 对象的属性名称要和参数占位符名称一致
     *      3. map集合: 只需保证sql中的参数名和map集合的键的名称对应上
     * @param status
     * @param companyName
     * @param brandName
     * @return
     */
//    List<Brand> selectByCondition(@Param("status") int status, @Param("companyName") String companyName, @Param("brandName") String brandName);
//    List<Brand> selectByCondition(Brand brand);
    List<Brand> selectByCondition(Map map);

一、动态查询

  • 动态sql:sql语句会随着用户的输入或者外部条件的变化而变化
<!--动态条件查询
       * if : 条件查询
        * test : 逻辑表达式
          * 产生的问题:第一个条件不需要逻辑运算符
           <if test="companyName !=null and companyName !='' ">
                and company_name like #{companyName}
            </if>
            
               *解决1: 多写一个恒等式: 1=1
                   <select id="selectByCondition" resultMap="brandResultMap">
                        select * from tb_brand
                        where 1=1
                            <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>

                    </select>
              *解决二:where标签替换where

  -->


 <select id="selectByCondition" resultMap="brandResultMap">
        select * from tb_brand
        where
            <if test="status != null">
                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>
    </select>
//上面的一段代码单单用一个if标签是不能满足需求的),存在的问题是where后面的第一个条件不需要and,所以很难满足
//使用动态sql就可以解决

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

一、动态查询——单条件查询

<select id="selectByConditionSingle" resultMap="brandResultMap">
        select * from tb_brand
   where
       <choose> <!--相当于swith-->

           <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>
           <otherwise> <!--相当于default-->
               1=1
           </otherwise>
       </choose>
    </select>


//查询单个的
<select id="selectByConditionSingle" resultMap="brandResultMap">
        select * from tb_brand
   where
       <choose> <!--相当于swith-->

           <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>
           <otherwise> <!--相当于defaut-->
               1=1
           </otherwise>
       </choose>
    </select>
//使用where标签的改进
<select id="selectByConditionSingle" resultMap="brandResultMap">
        select * from tb_brand
        <where>
            <choose> <!--相当于swith-->

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

上一篇:SpringBoot--yml配置文件的时间/大小的单位转换


下一篇:海信新风空调小氧吧X7:解锁母婴级标准认证的防直吹神器