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 jdbc
la requête de connexion, puis sur jdbcTemplate
la 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 ORM
framework, tel Mybatis,Hibernate,
que SpringBoot,Spring Data JPA
requête conditionnelle
Nous savons que mybatis mapper
les 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
sql
Nous 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 and
ou 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 if
de jugement de condition d'étiquette ci-dessus , il ajoutera automatiquement des mots-clés à la déclaration et supprimera le premierwhere
Sql
where
and
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 à Java
la grammaire, case,switch
jugement de phrase
Tant que l'une des conditions est établie, l'autre ne sera pas jugée. Si aucune condition n'est remplie, otherwise
le 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>
- collection : l'objet collection à parcourir
- item : enregistrer le résultat de chaque parcours
- open : ajouter du contenu à gauche du résultat
- séparateur : le contenu entre le résultat et le résultat
- close : le contenu ajouté à la fin
Il est souvent utilisé dans in
les 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
- Lorsque nous devons effectuer des requêtes conditionnelles dynamiques complexes sur les données associées de plusieurs tables, nous devons utiliser
if
des é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 sql
et 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 >= 0 AND tu.ADMIN_TYPE_ID <= #{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 if
l'é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
where
une connexion, plutôt queand
d'é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 = 1
le résoudre en supposant de lui donner une condition par défaut, ou en imbriquant where
des balises