L'une des fonctionnalités puissantes de MyBatis est son SQL dynamique. Si vous avez de l'expérience dans l'utilisation de JDBC ou d'autres frameworks similaires, vous comprendrez la difficulté de fusionner des instructions SQL en fonction de différentes conditions. Par exemple, lors de l'épissage, assurez-vous de ne pas oublier d'ajouter les espaces nécessaires et veillez à supprimer la virgule du dernier nom de colonne de la liste. Profitez de la fonctionnalité SQL dynamique pour vous débarrasser complètement de cette douleur.
Bien qu'il n'était pas facile d'utiliser le SQL dynamique dans le passé, MyBatis a amélioré cette situation en fournissant un langage SQL dynamique puissant qui peut être utilisé dans n'importe quelle instruction de mappage SQL.
Les éléments SQL dynamiques sont similaires aux processeurs de texte basés sur JSTL ou XML. Dans les versions précédentes de MyBatis, de nombreux éléments prenaient du temps à comprendre. MyBatis 3 a grandement simplifié les types d'éléments. Il ne vous reste plus qu'à apprendre la moitié des éléments originaux. MyBatis utilise de puissantes expressions basées sur OGNL pour éliminer la plupart des autres éléments.
Créez d'abord la classe d'entité Utilisateur
public class User { private Integer id; private String username; private String userEmail; private String userCity; private Integer age;}
Créez la table utilisateur
CREATE TABLE user ( id int(11) NOT NULL AUTO_INCREMENT, username varchar(255) DEFAULT NULL, user_email varchar(255) DEFAULT NULL, user_city varchar(255) DEFAULT NULL, age int(11) DEFAULT NULL, PRIMARY KEY (id))
Définir la méthode d'interface
public List<User> findByUser(User user);
La définition Mapper.xml correspondant à l'interface est la suivante
<select id="findByUser" resultType="com.example.mybatis.entity.User"> select id, username, user_email userEmail, user_city userCity, age from user where <if test="username != null and username != ''"> username = #{username} </if> <if test="userEmail != null and userEmail != ''"> and user_email = #{userEmail} </if> <if test="userCity != null and userCity != ''"> and user_city = #{userCity} </if></select>
Si le test sur la balise if est vrai, alors l'instruction SQL dans la balise if sera Splicing.
Si le nom d'utilisateur, userEmail et userCity ne sont pas vides, alors le SQL sera épissé comme suit
select id, username, user_email userEmail, user_city userCity, age from user where username = ? and user_email = ? and user_city = ?
Si seul le nom d'utilisateur n'est pas vide, alors le SQL sera épissé comme suit follow
select id, username, user_email userEmail, user_city userCity, age from user where username = ?
Cependant, cette méthode présente un inconvénient. Supposons que le nom d'utilisateur soit vide à ce moment-là, userEmail et userCity ne sont pas vides.
Analysons le code SQL dynamique. Maintenant, aucune valeur n'est attribuée au nom d'utilisateur, c'est-à-dire username==null, donc le code "username=#{username}" ne sera pas ajouté à l'instruction SQL, donc le Dynamic SQL épissé final ressemble à ceci :
select id, username, user_email userEmail, user_city userCity, age from user where and user_email = ? and user_city = ?
where est directement suivi de et, ce qui est une erreur de syntaxe évidente. Dans ce cas, le where
qui suit immédiatement and
doit être supprimé. Pour résoudre ce problème, vous pouvez utiliser la balise where
.
Modifiez le SQL ci-dessus par le
<select id="findByUser" resultType="com.example.mybatis.entity.User"> select id, username, user_email userEmail, user_city userCity, age from user <where> <if test="username != null and username != ''"> username = #{username} </if> <if test="userEmail != null and userEmail != ''"> and user_email = #{userEmail} </if> <if test="userCity != null and userCity != ''"> and user_city = #{userCity} </if> </where> </select>
Si la balise where
dans la balise if
remplit les conditions, alors la balise where
sera fusionnée dans une instruction Where. Si le SQL épissé avec la balise if
a une instruction and au début, alors le et sera supprimé. En utilisant cette méthode, les mots-clés inutiles dans SQL seront automatiquement supprimés, donc généralement si les balises et où les balises sont utilisées en combinaison.
trim
Les attributs prefix
et suffix
de la balise seront utilisés pour générer l'instruction SQL réelle, qui sera épissée avec la déclaration à l'intérieur de la balise .
Si la valeur spécifiée dans l'attribut prefixOverrides
ou suffixOverrides
est rencontrée avant ou après la déclaration, MyBatis les supprimera automatiquement. Lorsque vous spécifiez plusieurs valeurs, n'oubliez pas de laisser un espace après chaque valeur pour vous assurer qu'elle ne sera pas connectée au SQL ultérieur.
préfixe : Ajouter un préfixe à l'instruction SQL épissée
suffixe : Ajouter un suffixe à l'instruction SQL épissée
prefixOverrides : Si prefixOverrides
est rencontré avant l'instruction SQL épissée, MyBatis les supprimera automatiquement
suffixOverrides : Si suffixOverrides
est rencontrés après l'instruction SQL épissée, MyBatis les supprimera automatiquement
Utilisez la balise trim
ci-dessous pour implémenter la fonction de la balise where
<select id="findByUser" resultType="com.example.mybatis.entity.User"> select id, username, user_email userEmail, user_city userCity, age from user <trim prefix="where" prefixOverrides="and"> <if test="username != null and username != ''"> username = #{username} </if> <if test="userEmail != null and userEmail != ''"> and user_email = #{userEmail} </if> <if test="userCity != null and userCity != ''"> and user_city = #{userCity} </if> </trim> </select>
Si le nom d'utilisateur est vide, userEmail et userCity ne sont pas vides, alors la balise if
L'instruction SQL épissée est la suivante
and user_email = #{userEmail} and user_city = #{userCity}
Parce que la balise trim
est définie avec prefixOverrides="and", et le SQL ci-dessus a un et instruction devant, donc l'instruction ci-dessus et l'instruction doivent être supprimées, et parce que trim
L'étiquette est définie avec préfixe="where", vous devez donc ajouter une instruction Where devant l'instruction SQL épissée
Enfin, l'instruction SQL de la balise trim
est épissée comme suit
where user_email = #{userEmail} and user_city = #{userCity}
Parfois, nous ne voulons pas appliquer à toutes les instructions conditionnelles, mais je veux juste en choisir une. Pour cette situation, MyBatis fournit l'élément Choose, qui ressemble un peu à l'instruction switch en Java. La balise
<select id="findByUser" resultType="com.example.mybatis.entity.User"> select id, username, user_email userEmail, user_city userCity, age from user <where> <choose> <when test="username != null and username != ''"> username = #{username} </when> <when test="userEmail != null and userEmail != ''"> and user_email = #{userEmail} </when> <when test="userCity != null and userCity != ''"> and user_city = #{userCity} </when> </choose> </where> </select>
set est utilisée pour l'opération de mise à jour et générera automatiquement des instructions SQL basées sur la sélection des paramètres.
L'interface est définie comme suit
public int updateUser(User user);
La définition Mapper.xml correspondante de l'interface est la suivante
<update id="updateUser" parameterType="com.example.mybatis.entity.User"> update user <set> <if test="username != null and username != ''"> username=#{username}, </if> <if test="userEmail != null and userEmail != ''"> user_email=#{userEmail}, </if> <if test="userCity != null and userCity != ''"> user_city=#{userCity}, </if> <if test="age != null"> age=#{age} </if> </set> where id=#{id} </update>
La balise foreach peut être itérée Générer une série de valeurs
*pour SQL dans l'instruction*
接口定义如下所示
public List<User> getUsersByIds(List<Integer> ids);
接口对应的 Mapper.xml 定义如下所示
<!-- collection: 指定要遍历的集合 默认情况下 如果为Collection类型的,key为collection; 如果为List类型的,key为list 如果是数组类型,key为array 可以通过@Param("ids")来指定key item: 将当前遍历的元素赋值给指定的变量 open: 给遍历的结果添加一个开始字符 close: 给遍历的结果添加一个结束字符 separator: 每个元素之间的分隔符 --><select id="getUsersByIds" resultType="com.example.mybatis.entity.User"> select * from user where id in <foreach collection="list" item="id" open="(" close=")" separator=","> #{id} </foreach></select>
用于批量插入
接口定义如下所示
public int addUserList(List<User> users);
接口对应的 Mapper.xml 定义如下所示
<insert id="addUserList" parameterType="com.example.mybatis.entity.User"> insert into user (username, user_email, user_city, age) values <foreach item="user" collection="list" separator=","> (#{user.username}, #{user.userEmail}, #{user.userCity}, #{user.age}) </foreach></insert><!--返回自增主键--><insert id="addUserList" parameterType="com.example.mybatis.entity.User" useGeneratedKeys="true" keyProperty="id"> insert into user (username, user_email, user_city, age) values <foreach item="user" collection="list" separator=","> (#{user.username}, #{user.userEmail}, #{user.userCity}, #{user.age}) </foreach></insert><!--还可以这样写--><!-- 这种方式需要数据库连接属性设置allowMultiQueries=true 这种分号分隔多个SQL还可以用于其他的批量操作,如修改、删除 --><insert id="addUserList" parameterType="com.example.mybatis.entity.User"> <foreach item="user" collection="list" separator=";"> insert into user (username, user_email, user_city, age) values (#{user.username}, #{user.userEmail}, #{user.userCity}, #{user.age}) </foreach></insert><!--如果是Oracle数据库,则需要这样写--><insert id="addUserList" parameterType="com.example.mybatis.entity.User"> <foreach item="user" open="begin" close="end;" collection="list"> insert into user (username, user_email, user_city, age) values (#{user.username}, #{user.userEmail}, #{user.userCity}, #{user.age}); </foreach></insert>
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!