Heim >Datenbank >SQL >Lernen Sie das dynamische SQL von MyBatis

Lernen Sie das dynamische SQL von MyBatis

coldplay.xixi
coldplay.xixinach vorne
2020-12-09 17:46:132802Durchsuche

SQL-TutorialEinführung in die leistungsstarken Funktionen von SQL MyBatis SQL

Lernen Sie das dynamische SQL von MyBatis

Empfohlen (kostenlos): SQL-Tutorial

Dynamisches SQL

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.

Vorbereitung: Erstellen Sie zuerst die Benutzer-Entitätsklasse ee

Wenn der if-Tag-Test wahr ist, werden die SQL-Anweisungen im if-Tag gespleißt.

Wenn Benutzername, Benutzer-E-Mail und Benutzerstadt nicht leer sind, wird die SQL wie unten gezeigt gespleißt

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.

Lassen Sie uns den dynamischen SQL-Code analysieren. Dem Benutzernamen ist kein Wert zugewiesen, d ​Dynamic SQL sieht so aus:

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 != &#39;&#39;">
        username = #{username}    </if>
    <if test="userEmail != null and userEmail != &#39;&#39;">
        and user_email = #{userEmail}    </if>
    <if test="userCity != null and userCity != &#39;&#39;">
        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.

trim

where后面的and删掉。为了解决这个问题,可以使用where标签。

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

trim标签中的 prefixsuffix属性会被用于生成实际的 SQL 语句,会和标签内部的语句拼接。

如果语句的前面或后面遇到 prefixOverridessuffixOverrides属性中指定的值,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语句

最后trimDie 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.

Wenn die in den Attributen 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 strong>: Splice Wenn 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 != &#39;&#39;">
                username = #{username}
            </if>
            <if test="userEmail != null and userEmail != &#39;&#39;">
                and user_email = #{userEmail}
            </if>
            <if test="userCity != null and userCity != &#39;&#39;">
                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 != &#39;&#39;">
                username = #{username}            </if>
            <if test="userEmail != null and userEmail != &#39;&#39;">
                and user_email = #{userEmail}            </if>
            <if test="userCity != null and userCity != &#39;&#39;">
                and user_city = #{userCity}            </if>
        </trim>
    </select>

choose

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:learnku.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen