1. 查询-多条件 查询:
    1.编写接口方法:Mapper接口
    参数:所有查询条件
    结论:List<Brand>
    1.创建BrandMapper类
public interface BrandMapper {



    /**
     * 查询所有
     */
    List<Brand> selectAll();

    /**
     * 查看详情:根据Id查询
     */
    Brand selectById(int id);

    /**
     * 条件查询
     *  *参数接收
     *      1.散装参数:如果方法中有多个参数,需要使用@Param("SQL参数占位符")
     *      2.对象参数
     *      3.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);
}

2.编写SQL语句:SQL映射文件

创建BrandMapper.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<!--
    namespace:名称空间
 -->
<mapper namespace="com.uestc.mapper.BrandMapper">

    <!--
        数据库表的字段名称,和 实体类的属性名称 不一样,则不能自动封装数据
            * 起别名: 对不一样的列名起别名,让别名和实体类的属性名一样
                   *缺点:每次查询都要定义一次别名
                        *sql片段
                            *缺点:不灵活
            * resultMap
                1.定义<resultMap>标签
                2.在<select>标签中使用resultMap属性替换 resultType属性
    -->

    <!--
        id:唯一标识
        type:映射的类型,支持别名
    -->

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

    </resultMap>

        <select id="selectAll" resultMap="brandResultMap">

            select
                   *
            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" />-->
<!--        from tb_brand;-->

<!--    </select>-->

<!--    <select id="selectAll" resultType="brand">-->

<!--        select *-->
<!--        from tb_brand;-->

<!--    </select>-->

    <!--
        *参数占位符:
            1.#{}:会将其替换为 ? 为了放在SQL注入
            2.${}:拼SQL,会存在SQL注入问题
            3.使用时机:
                * 参数传递的时候:#{}
                * 表名或者列名不固定的情况下:${}
        *参数类型:parameterType:可以省略
        *特殊字符处理:
            1.转义字符: < ==>  <
            2.CDATA区:  <![CDATA[
                        <
                        ]]>
    -->
<!--    <select id="selectById" resultMap="brandResultMap">-->
<!--        select *-->
<!--        from tb_brand where id = #{id};-->
<!--    </select>-->

    <select id="selectById" resultMap="brandResultMap">
        select *
        from tb_brand where id
        <![CDATA[
        <
        ]]>
        #{id};
    </select>

    <!--
        条件查询
    -->
    <select id="selectByCondition" resultMap="brandResultMap">
        select *
        from tb_brand
        where status = #{status}
            and company_name like #{companyName}
            and brand_name like #{brandName};
    </select>

</mapper>

3.执行方法,测试

创建MyBatisTest类

@Test
    public void testSelectByCondition() throws IOException {

        //接收参数
        int status = 1;
        String companyName = "华为";
        String brandName = "华为";

        //处理参数
        companyName = "%" + companyName + "%";
        brandName = "%" + brandName + "%";

        //封装对象
//        Brand brand = new Brand();
//        brand.setStatus(status);
//        brand.setCompanyName(companyName);
//        brand.setBrandName(brandName);

        //Map处理
        Map map = new HashMap();
        map.put("status",status);
        map.put("companyName",companyName);
        map.put("brandName",brandName);

        //1.获取SqlSessionFactory
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        //2.获取SqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();

        //3.获取Mapper接口的代理对象
        BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);

        //4.执行方法
        //List<Brand> brands = brandMapper.selectByCondition(status, companyName, brandName);
        //List<Brand> brands = brandMapper.selectByCondition(brand);
        List<Brand> brands = brandMapper.selectByCondition(map);
        System.out.println(brands);

        //5.释放资源
        sqlSession.close();

    }

查询-多条件-动态条件查询:

SQL语句会随着用户的输入或外部条件的变化而变化,我们称为动态SQL。

MyBatis对动态SQL有很强大的支撑:

if
choose(when,otherwise)
trim(where,set)
foreach

查询-单条件-动态条件查询:

从多个条件中选择一个

choose(when,where):选择,类似于Java中的switch语句

总结:SQL语句设置多个参数有几种方式?

(1)散装参数:需要使用@Param("SQL中的参数占位符名称")

(2)实体类封装参数:只需要保证SQL中的参数名和实体类属性名对应上,即可设置成功。

(3)map集合:只需要保证SQL中的参数名和map集合的键的名称对应上,即可设置成功。

MyBatis完成操作需要几步?三步:编写接口方法->编写SQL->执行方法