MyBatis多条件查询

  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.转义字符: &lt ==>  <
                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->执行方法

posted @   Resign~as  阅读(568)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示