Eine der leistungsstarken Funktionen von MyBatis ist das dynamische SQL. Wenn Sie Erfahrung mit JDBC oder anderen ähnlichen Frameworks haben, werden Sie verstehen, wie schwierig es ist, SQL-Anweisungen basierend auf unterschiedlichen Bedingungen zusammenzufügen. Vergessen Sie beispielsweise beim Zusammenfügen nicht, die erforderlichen Leerzeichen einzufügen, und achten Sie darauf, das Komma aus dem letzten Spaltennamen in der Liste zu entfernen. Nutzen Sie die dynamische SQL-Funktion, um dieses Problem vollständig zu beseitigen.
Obwohl es in der Vergangenheit nicht einfach war, dynamisches SQL zu verwenden, hat MyBatis diese Situation durch die Bereitstellung einer leistungsstarken dynamischen SQL-Sprache verbessert, die in jeder SQL-Zuordnungsanweisung verwendet werden kann.
Dynamische SQL-Elemente ähneln JSTL- oder XML-basierten Textprozessoren. In früheren Versionen von MyBatis gab es viele Elemente, deren Verständnis einige Zeit in Anspruch nahm. MyBatis 3 hat die Elementtypen stark vereinfacht. Jetzt müssen Sie nur noch die Hälfte der ursprünglichen Elemente erlernen. MyBatis verwendet leistungsstarke OGNL-basierte Ausdrücke, um die meisten anderen Elemente zu eliminieren.
public class User { private Integer id; private String username; private String userEmail; private String userCity; private Integer age;}Wenn nur Benutzername nicht leer ist, wird die SQL wie unten gezeigt gespleißt
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))Aber es gibt Ein Problem mit dieser Methode. Nachteil: Angenommen, der Benutzername ist zu diesem Zeitpunkt leer, weder userEmail noch userCity sind leer.
public List<User> findByUser(User user);where folgt direkt und, was ein offensichtlicher grammatikalischer Fehler ist. Zu diesem Zeitpunkt sollten
und
direkt auf where
folgen gelöscht. Um dieses Problem zu lösen, können Sie das Tag where
verwenden.
whereÄndern Sie die obige SQL wie folgt:
<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>Wenn das
if
-Tag im where
-Tag die Bedingungen erfüllt, dann where Das -Tag wird in eine where-Anweisung gespleißt. Wenn das mit dem <code>if
-Tag gespleißte SQL eine and-Anweisung am Anfang hat, wird das and gelöscht. Mit dieser Methode werden unnötige Schlüsselwörter in SQL automatisch gelöscht, also im Allgemeinen, wenn Tags und Where-Tags in Kombination verwendet werden.
trimwhere
后面的and
删掉。为了解决这个问题,可以使用where
标签。
将上面的SQL改成如下所示
select id, username, user_email userEmail, user_city userCity, age from user where username = ? and user_email = ? and user_city = ?
如果where
标签里面的if
标签有满足条件的,那么where
标签就会被拼接成where语句,若if
标签拼接的SQL最前面有and语句,那么这个and将会被删除。使用这种方法, 会自动删除SQL中不需要的关键字,所以一般 if 标签和 where 标签会组合起来使用。
trim
标签中的 prefix
和 suffix
属性会被用于生成实际的 SQL 语句,会和标签内部的语句拼接。
如果语句的前面或后面遇到 prefixOverrides
或 suffixOverrides
属性中指定的值,MyBatis 会自动将它们删除。在指定多个值的时候,别忘了每个值后面都要有一个空格,保证不会和后面的 SQL 连接在一起。
prefix:给拼接的SQL语句加一个前缀
suffix:给拼接的SQL语句加一个后缀
prefixOverrides:拼接的SQL语句前面遇到 prefixOverrides
,MyBatis 会自动将它们删除
suffixOverrides:拼接的SQL语句后面遇到 suffixOverrides
,MyBatis 会自动将它们删除
下面使用trim
标签来实现where
标签的功能
select id, username, user_email userEmail, user_city userCity, age from user where username = ?
如果username为空,userEmail和userCity不为空,那么if
标签拼接的SQL语句如下所示
select id, username, user_email userEmail, user_city userCity, age from user where and user_email = ? and user_city = ?
因为trim
标签设置了prefixOverrides=”and”,而上面的SQL前面有and语句,所以需要将上面的and语句删掉,又因为trim
标签设置了prefix=”where”,所以需要在拼接的SQL语句前面加一个where语句
最后trim
Die Attribute prefix
und suffix
im Tag trim
werden verwendet, um die eigentliche SQL-Anweisung zu generieren kombiniert mit der Innenseite des Tag-Satz-Spleißens.
prefixOverrides
oder suffixOverrides
angegebenen Werte vor oder nach der Anweisung gefunden werden, löscht MyBatis sie automatisch. Wenn Sie mehrere Werte angeben, vergessen Sie nicht, nach jedem Wert ein Leerzeichen einzufügen, um sicherzustellen, dass er nicht mit nachfolgendem SQL verbunden wird. Präfix: Fügen Sie der gespleißten SQL-Anweisung ein Präfix hinzu. Suffix: Fügen Sie der gespleißten SQL-Anweisung ein Suffix hinzu.
prefixOverrides
vor der SQL-Anweisung auftritt, löscht MyBatis sie automatisch. suffixOverrides: Wenn suffixOverrides
nach dem Splice auftritt SQL-Anweisung, MyBatis löscht sie automatisch. Verwenden Sie das Tag trim
unten, um die Funktion des Tags where
zu implementieren nicht leer sind, dann if Die SQL-Anweisung für das Tag-Spleißen lautet wie folgt
<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>
Weil das trim
-Tag mit prefixOverrides="and" festgelegt ist und die obige SQL eine and-Anweisung enthält davor, daher muss die obige „and“-Anweisung gelöscht werden. Da das trim
-Tag mit dem Präfix „where“ festgelegt ist, muss vor dem gespleißten eine „where“-Anweisung hinzugefügt werden SQL-Anweisung
Abschließend wird die SQL-Anweisung des trim
-Tags gespleißt. Wie unten gezeigt
<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>
Manchmal möchten wir es nicht auf alle bedingten Anweisungen anwenden, sondern einfach nur eine davon auszuwählen. Für diese Situation stellt MyBatis das Element „select“ bereit, das der switch-Anweisung in Java ähnelt. Das
and user_email = #{userEmail} and user_city = #{userCity}
set
🎜set-Tag wird für den Update-Vorgang verwendet, der automatisch SQL-Anweisungen basierend auf der Parameterauswahl generiert. 🎜🎜Die Schnittstelle ist wie folgt definiert:🎜where user_email = #{userEmail} and user_city = #{userCity}🎜Der entsprechende Mapper.
接口定义如下所示
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>
Das obige ist der detaillierte Inhalt vonLernen Sie das dynamische SQL von MyBatis. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!