使用Mybatis如何实现多个控制条件查询

目录
  • 实现多个控制条件查询
    • 扩展知识
    • 实现多个条件简单查询
    • 数据库的字段名和实体类的属性名不一致时
    • 实现多个条件复杂查询
  • MyBatis条件查询总结
    • 1.if条件语句
    • 2.choose(whenotherwise)
    • 4.in的用法
    • 5.模糊查询

实现多个控制条件查询

扩展知识

1.给包起别名用<typeAliases>标签

< typeAliases>
< typeAlias type=“MybatiesAnimal.Animal” alias=“animal”/>
< !-- 指定实体类在哪个包里 -->
< package name=“MybatiesAnimal”/>
< /typeAliases>

2.在<mappers>中通过<package>标签引Mapper.xml

如果想用package直接引入所有mapper/xml, 那么要求接口和xml在一个包里

实现多个条件简单查询

操作步骤如下:

1.在Mapper.xml中输入要查询的SQL语句

2.接口文件中参数用@Param接

语句如下:

public List selAnimalBy(@Param(“NAME”) String a,@Param(“kind”) String b);

如果传的是2个java简单类型 那么需要用@Param(“name”) 指定参数名

3.text文档中输出

语句如下:

List< Animal> animal1=sqlsession.getMapper(AnimalMapper.class).selAnimalBy(“老虎”, “猫科”);
System.out.println(animal1);

数据库的字段名和实体类的属性名不一致时

因为数据库命名多个单词之间用下划线连接,而Java命名规则为第二个字母大写,命名规则不同时,需要传值。

方法一:修改SQL语句

SELECT a_sid sid,kind,numbers,address,NAME FROM animal

给a_sid 取别名为sid

xml中语句修改如下:

方法二:通过配置resultMap标签

原查询语句:

< select id=“selAnimalBy” resultType=“animal” >
SELECT * FROM animal WHERE NAME=#{NAME} AND kind=#{kind}
< /select>

修改为:

实现多个条件复杂查询

例如:查询动物列表中猫科中包含虎字段的数据

SQL语句为:

SELECT * FROM animal WHERE 1=1 AND kind=“猫科” AND NAME LIKE ‘%虎%'

1.配置xml中的select标签

如下图:

2.添加接口中的执行语句

public List< Animal> selCon(Animal animal);

3.text文档检验结果

Animal animal1=new Animal();
animal1.setKind(“猫科”);
animal1.setName(“虎”);
List< Animal>animal2=sqlsession.getMapper(AnimalMapper.class).selCon(animal1);
System.out.println(animal2);

输出结果如下:

MyBatis条件查询总结

1.if条件语句

<!--  if(判断参数) - 将实体类不为空的属性作为where条件 -->
    <select id="getStudentList_if" resultMap="resultMap_studentEntity" parameterType="liming.student.manager.data.model.StudentEntity">
        SELECT ST.STUDENT_ID,
               ST.STUDENT_NAME,
               ST.STUDENT_SEX,
               ST.STUDENT_BIRTHDAY,
               ST.STUDENT_PHOTO,
               ST.CLASS_ID,
               ST.PLACE_ID
          FROM STUDENT_TBL ST
         WHERE
        <if test="studentName !=null ">
            ST.STUDENT_NAME LIKE CONCAT(CONCAT('%', #{studentName, jdbcType=VARCHAR}),'%')
        </if>
        <if test="studentSex != null and studentSex != '' ">
            AND ST.STUDENT_SEX = #{studentSex, jdbcType=INTEGER}
        </if>
        <if test="studentBirthday != null ">
            AND ST.STUDENT_BIRTHDAY = #{studentBirthday, jdbcType=DATE}
        </if>
        <if test="classId != null and classId!= '' ">
            AND ST.CLASS_ID = #{classId, jdbcType=VARCHAR}
        </if>
        <if test="classEntity != null and classEntity.classId !=null and classEntity.classId !=' ' ">
            AND ST.CLASS_ID = #{classEntity.classId, jdbcType=VARCHAR}
        </if>
        <if test="placeId != null and placeId != '' ">
            AND ST.PLACE_ID = #{placeId, jdbcType=VARCHAR}
        </if>
        <if test="placeEntity != null and placeEntity.placeId != null and placeEntity.placeId != '' ">
            AND ST.PLACE_ID = #{placeEntity.placeId, jdbcType=VARCHAR}
        </if>
        <if test="studentId != null and studentId != '' ">
            AND ST.STUDENT_ID = #{studentId, jdbcType=VARCHAR}
        </if>
    </select> 

2.choose (when otherwise)

<!--  choose(判断参数) - 按顺序将实体类 User 第一个不为空的属性作为:where条件 -->
<select id="getUserList_choose" resultMap="resultMap_user" parameterType="com.yiibai.pojo.User">
    SELECT *
      FROM User u
    <where>
        <choose>
            <when test="username !=null ">
                u.username LIKE CONCAT(CONCAT('%', #{username, jdbcType=VARCHAR}),'%')
            </when >
            <when test="sex != null and sex != '' ">
                AND u.sex = #{sex, jdbcType=INTEGER}
            </when >
            <when test="birthday != null ">
                AND u.birthday = #{birthday, jdbcType=DATE}
            </when >
            <otherwise>
            </otherwise>
        </choose>
    </where>
</select>  
<select id="dynamicChooseTest" parameterType="Blog" resultType="Blog">
        select * from t_blog where 1 = 1
        <choose>
            <when test="title != null">
                and title = #{title}
            </when>
            <when test="content != null">
                and content = #{content}
            </when>
            <otherwise>
                and owner = "owner1"
            </otherwise>
        </choose>
</select>

4.in的用法

    <select id="getNewListByLabelID" resultMap="BaseResultMap" parameterType="arraylist">
        SELECT
        <include refid="Base_Column_List"/>
        FROM tb_problem
        WHERE id IN
        <foreach collection="ids" index="index" item="id" separator="," close=")" open="(">
            #{id}
        </foreach>
    </select>

还可以这样

<select id="queryAllOpenProduct" parameterType="com.tims.open.domain.OpenProductQueryCondition"
    resultType="com.tims.open.domain.OpenProduct">
    SELECT
         *
    FROM
        product_db.product p
    WHERE
        p.isvalid = 1
    <if test="list != null">
        <foreach collection="list" index="index" item="item" separator="," open="AND p.id IN (" close=")">
               #{item}
        </foreach>
    </if>
</select>
//查询condition类
Public OpenProductQueryCondition{
    private Integer productId;  
    private List<Integer> list;
}

5.模糊查询

<!-- ******************** 模糊查询的常用的3种方式:********************* -->
    <select id="getUsersByFuzzyQuery" parameterType="User" resultType="User">
        select <include refid="columns"/> from users
        <where>
            <!--
                方法一: 直接使用 % 拼接字符串 
                注意:此处不能写成  "%#{name}%" ,#{name}就成了字符串的一部分,
                会发生这样一个异常: The error occurred while setting parameters,
                应该写成: "%"#{name}"%",即#{name}是一个整体,前后加上%
            -->
            <if test="name != null">
                name like "%"#{name}"%"
            </if>
            <!--方法二: 使用concat(str1,str2)函数将两个参数连接 -->
            <if test="phone != null">
                and phone like concat(concat("%",#{phone}),"%")
            </if>
            <!--方法三: 使用 bind 标签,对字符串进行绑定,然后对绑定后的字符串使用 like 关键字进行模糊查询 -->
            <if test="email != null">
                <bind name="pattern" value="'%'+email+'%'"/>
                and email like #{pattern}
            </if>
        </where>
    </select>

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 利用MyBatis实现条件查询的方法汇总

    SQL映射文件 Mybatis真正强大的是在于它的SQL映射语句,也是它的流弊之处. 它的功能强大,SQL映射文件的配置却比较简单. 使用SQL映射文件可以减少50%以上的代码量. Mybatis专注于SQL,对于开发人员来说可极大限度地进行SQL调优,以保证性能,下面是SQL映射文件的几个顶级元素配置 1.mapper 它是映射文件的根节点,只有一个属性就是 namespace(命名空间)它的作用是区分不同的mapper,里面的参数是全局唯一的,绑定DAO层接口,即面向接口编程 namespa

  • mybatis collection 多条件查询的实现方法

    mybatis collection 多条件查询的实现方法 前言: 业务需要通过mybatis 查询返回嵌套集合,嫌多次查询太麻烦,用自带的高级查询解决问题,下边是代码,已测试通过. 说下自己的理解,就是一个主查询结果集里面嵌套了子查询的结果集,可以是多个子查询,每个子查询的条件从主查询结果集中获取,返回值各自定义.collection 标签的property是主查询里面集合的名字,如果有多个就再写个collection,column是子查询参数,单参数直接写主查询结合返回结果,例如直接写上us

  • MyBatis中多条件查询商品的三种方法及区别

    目录 一.Sql语句设置多个参数有几种方式 二.代码附上 一.Sql语句设置多个参数有几种方式 1.散装参数:需要使用@Param标记Sql语句中占位符处的名称例如 #{name} 2.实体类封装参数 只需要保证Sql中的参数名和实体类属性名对应上,即可设置成功BrandMapper.xml中的SQL语句不用动,把TestBrandMapper中的代码修改即可 3.Map集合 只需要保证Sql中的参数名和Map集合的键的名称对应上,即可设置成功.BrandMapper.xml中Sql语句不用改

  • 使用Mybatis如何实现多个控制条件查询

    目录 实现多个控制条件查询 扩展知识 实现多个条件简单查询 数据库的字段名和实体类的属性名不一致时 实现多个条件复杂查询 MyBatis条件查询总结 1.if条件语句 2.choose(whenotherwise) 4.in的用法 5.模糊查询 实现多个控制条件查询 扩展知识 1.给包起别名用<typeAliases>标签 < typeAliases> < typeAlias type="MybatiesAnimal.Animal" alias="

  • Mybatis 条件查询 批量增删改查功能

    模糊查询: @Select({ "SELECT * FROM account where account like CONCAT('%',#{query},'%') or email like CONCAT('%',#{query},'%')" }) Account findAccountByAccountOrMail(@Param("query") String query); 批量添加: @Insert({ "<script>"

  • 对python中的控制条件、循环和跳出详解

    对python中的控制条件.循环和跳出详解 代码缩进(代码块): python用缩进表示代码块,没有其他语言的大括号 缩进是强制检查,整个代码缩进必须一致,否则无法运行 用2.4个空格或者tab缩进 ide自动保证缩进一致 If.elif和else的条件分支: if if...else if...elif..else 没有switch.case语法 空的列表.元祖.字符串.0都被评估为False None被评估为False 控制条件后面必须加":" a=100 if a > 80

  • 微信小程序利用button控制条件标签的变量问题

    问题描述 在小程序中如何利用button按钮来实现控制条件标签的变量呢?这也许是许多小伙伴们的问题,今天就来简单的给大家演示一遍. 解决方案 第一步: 首先打开微信公众平台,将一个 primary 的 button 按钮代码复制到开发平台上,再为其绑定一个名为 " bindfirst " 的事件.(当然这个 bindfirst 的事件需要在 js 中去定义,下面的步骤将会去定义) 代码如下: <view> <button type="primary"

  • Mybatis中的Criteria条件查询方式

    Mybatis Criteria条件查询 Criterion Criterion是最基本,最底层的Where条件,用于字段级的筛选. Criteria Criteria包含一个Cretiron的集合,每一个Criteria对象内包含的Cretiron之间是由AND连接的,是逻辑与的关系. 其它 Example类的distinct字段用于指定DISTINCT查询. orderByClause字段用于指定ORDER BY条件,这个条件没有构造方法,直接通过传递字符串值指定. 代码示例 import

  • mybatis的mapper特殊字符转移及动态SQL条件查询小结

    目录 前言 条件查询 快速入门 if标签 where标签 choose when otherwise标签 foreach标签 场景案例 前言 我们知道在项目开发中之前使用数据库查询,都是基于jdbc,进行连接查询,然后是高级一点jdbcTemplate进行查询,但是我们发现还是不是很方便,有大量重复sql语句,与代码偶合,效率低下,于是就衍生出来ORM框架,如Mybatis,Hibernate,还有SpringBoot的,Spring Data JPA 条件查询 我们知道在mybatis map

  • Mybatis Criteria使用and和or进行联合条件查询的操作方法

    之前用Mybatis框架反向的实体,还有实体里面的Example,之前只是知道Example里面放的是条件查询的方法,可以一直不知道怎么用,到今天才开始知道怎么简单的用.在我们前台查询的时候会有许多的条件传过来:先看个例子: public List<Contact> searchByExample(Contact contact) { System.out.println("searchByExampleContact"); ContactExample example =

  • mybatis中的count()按条件查询方式

    目录 mybatis count()按条件查询 1.sql count()函数 2.mybatis中count()按条件查询 在查询时使用count(*),total为1,结果为0 mybatis count()按条件查询 1.sql count()函数 count()函数返回匹配指定条件的行数. sql count(column_name)语法: count(column_name)函数返回指定列的值的数目(null)不计入. select count(column_name) from ta

随机推荐