mybatis mapper transfert de caractères spéciaux et requête conditionnelle SQL dynamique

avant-propos

Nous savons que l'utilisation de la requête de base de données avant le développement du projet est basée sur jdbcla requête de connexion, puis sur jdbcTemplatela requête avancée, mais nous avons constaté que ce n'est pas très pratique, il y a beaucoup d'instructions sql répétées, couplées avec du code, une faible efficacité, donc il est dérivé du ORMframework, tel Mybatis,Hibernate,que SpringBoot,Spring Data JPA

requête conditionnelle

Nous savons que mybatis mapperles caractères de requête conditionnels dans le fichier, tels >=,<,que similaires, ne peuvent pas être écrits directement et signaleront une erreur. Vous devez transférer le tableau suivant

Référence de contenu détaillée

Les opérations courantes de requête conditionnelle sont

sqlNous utilisons les balises uniques fournies par mybatis pour effectuer des jugements conditionnels afin d'obtenir des déclarations d'épissage dynamiques

si balise où balise choisir quand sinon balise pour chaque balise

démarrage rapide

si balise

grammaire:

<if test="xxx != null and xxx != ''">

Écrivez le paramètre de condition de jugement dans le test, directement paramN ou alias plusieurs conditions à utiliser andou orà connecter

Tant que la condition est vraie, elle sera épissée dans l'instruction Sql, et si elle est vraie, tout sera épissé

Notez que 1=1 est ajouté à la clause where pour éviter le risque de et

Par exemple:

<select id="selg" resultType="log">
    select * from log where 1=1
    <if test="param1!=null and param1!=''">
    and outno=#{param1}
    </if>
    <if test="param2!=null and param2!=''">
    and inno=#{param2}
    </if>
</select>

balise où

Après avoir traité la connexion ifde jugement de condition d'étiquette ci-dessus , il ajoutera automatiquement des mots-clés à la déclaration et supprimera le premierwhereSqlwhereand

Le sql ci-dessus peut être transformé en ce qui suit :

<select id="selg" resultType="log">
      select * from log 
  <where>
       <if test="param1!=null and param1!=''">
      and outno=#{param1}
      </if>
      <if test="param2!=null and param2!=''">
      and inno=#{param2}
      </if>
  </where>
     
</select>

choisir sinon Tags

Semblable à Javala grammaire, case,switchjugement de phrase

Tant que l'une des conditions est établie, l'autre ne sera pas jugée. Si aucune condition n'est remplie, otherwisele contenu en cours sera exécuté par défaut

Le sql ci-dessus peut être transformé en ce qui suit :

<select id="selg" resultType="log">
      select * from log 
  <where>
    <choose>
       <when test="param1!=null and param1!=''">
      and outno=#{param1}
      </when>
      <when test="param2!=null and param2!=''">
      and inno=#{param2}
      </when>
      <otherwise>
        and 1=1
      </otherwise>
    </choose>
  </where>
     
</select>

balise foreach

grammaire:

  <foreach collection="idList" item="id" open="(" separator="," close=")">
</foreach>
  1. collection : l'objet collection à parcourir
  2. item : enregistrer le résultat de chaque parcours
  3. open : ajouter du contenu à gauche du résultat
  4. séparateur : le contenu entre le résultat et le résultat
  5. close : le contenu ajouté à la fin

Il est souvent utilisé dans inles requêtes et 插入les opérations par lots comme suit :

<select id="selF" parameterType="list" resultType="account">
    select * from account where ano in
    <foreach collection="list" item="item" open="(" separator="," close=")">
    #{item}
    </foreach>
   </select>


<insert id="insertBatch">
        INSERT INTO t_user
        (id, name, password)
        VALUES
        <foreach collection ="userList" item="user" separator =",">
            (#{user.id}, #{user.name}, #{user.password})
        </foreach >
    </insert>

D'autres balises utilisent la référence cliquez pour entrer·

Scénario

  1. Lorsque nous devons effectuer des requêtes conditionnelles dynamiques complexes sur les données associées de plusieurs tables, nous devons utiliser ifdes étiquettes pour juger comme suit

Selon le numéro de téléphone mobile, le nom, l'âge, le sexe, etc. de l'utilisateur, une récupération de condition dynamique est effectuée. À ce stade, nous devons ajuster dynamiquement l'épissage. Lorsque la condition répond à l'instruction sql sqlet que la condition correspondante est légèrement différente

<select id="findUsersByUser" resultType="cn.soboys.kmall.sys.entity.User">
        select tu.USER_ID,tu.USERNAME,tu.SSEX,td.DEPT_NAME,tu.MOBILE,tu.EMAIL,tu.STATUS,tu.CREATE_TIME,
        td.DEPT_ID
        from t_user tu left join t_dept td on tu.DEPT_ID = td.DEPT_ID
        where tu.ADMIN_TYPE_ID  &gt;= 0 AND tu.ADMIN_TYPE_ID  &lt;= #{userParams.adminType}
        <if test="userParams.roleId != null and userParams.roleId != ''">
           and (select group_concat(ur.ROLE_ID)
            from t_user u
            right join t_user_role ur on ur.USER_ID = u.USER_ID,
            t_role r
            where r.ROLE_ID = ur.ROLE_ID
            and u.USER_ID = tu.USER_ID and r.ROLE_ID=#{userParams.roleId})
        </if>


        <if test="userParams.mobile != null and userParams.mobile != ''">
            AND tu.MOBILE =#{userParams.mobile}
        </if>
        <if test="userParams.username != null and userParams.username != ''">
            AND tu.USERNAME   like CONCAT('%',#{userParams.username},'%')
        </if>
        <if test="userParams.ssex != null and userParams.ssex != ''">
            AND tu.SSEX  =#{userParams.ssex}
        </if>
        <if test="userParams.status != null and userParams.status != ''">
            AND tu.STATUS =#{userParams.status}
        </if>
        <if test="userParams.deptId != null and userParams.deptId != ''">
            AND td.DEPT_ID =#{userParams.deptId}
        </if>
        <if test="userParams.createTime != null and userParams.createTime != ''">
            AND DATE_FORMAT(tu.CREATE_TIME,'%Y%m%d') BETWEEN substring_index(#{userParams.createTime},'#',1) and substring_index(#{userParams.createTime},'#',-1)
        </if>
    </select>

La méthode correspondant au mappeur

<T> IPage<User> findUsersByUser(Page<T> page, @Param("userParams") SearchUserParams userParams);

Objet d'entité de paramètre correspondant

@Data
public class SearchUserParams {
    
    
    private String username;
    private String mobile;
    private String status;
    private String ssex;
    private Long deptId;
    private String createTime;
    private long adminType;
    private String roleId;
}

Utilisez ifl'étiquette pour juger si la condition est satisfaite, et si elle est satisfaite, elle sera épissée pour correspondresql

Notez que le premier épissage conditionnel que nous avons mentionné ci-dessus est whereune connexion, plutôt que andd'éviter et de risquer de s'assurer que la syntaxe sql est correcte comme suit

<select id="findSearchCouponsPage" parameterType="cn.soboys.kmall.bean.web.params.SearchCouponParams" resultType="coupon">
        select *
        from coupon c
        left join user_coupon uc on c.coupon_id = uc.coupon_id
        WHERE 1 = 1
        <if test="couponParams.userId != null and couponParams.userId != ''">
           and uc.user_id =#{couponParams.userId}
        </if>
        <if test="couponParams.status != null and couponParams.status != ''">
            and c.status =#{couponParams.status}
        </if>
        <if test="couponParams.couponId != null and couponParams.couponId != ''">
            and c.coupon_id =#{couponParams.couponId}
        </if>
        <if test="couponParams.couponType != null and couponParams.couponType != ''">
            and c.type =#{couponParams.couponType}
        </if>
    </select>

On peut WHERE 1 = 1le résoudre en supposant de lui donner une condition par défaut, ou en imbriquant wheredes balises

Je suppose que tu aimes

Origine blog.csdn.net/u011738045/article/details/120449564
conseillé
Classement