Grundlegendes Arbeitsprinzip von MyBatis + Einführung in den Kernprozess + allgemeine Anmerkungen + allgemeine Schlüsselwörter (ausführliche Erklärung) + Datenänderung zur Implementierung von dynamischem SQL

1. MyBatisEinführung in die grundlegenden Arbeitsprinzipien 

[Das grundlegende Arbeitsprinzip von MyBatis ist]:

Kapseln Sie zuerst SQL, rufen Sie dann JDBC auf, um die Datenbank zu betreiben, und kapseln Sie schließlich die von der Datenbank zurückgegebenen Tabellenergebnisse in Java-Klassen.

        
[Funktion]:
Das Mybatis-Framework löst Probleme im Zusammenhang mit der Datenbankprogrammierung und vereinfacht hauptsächlich die Datenbankprogrammierung.
Wenn Sie das Mybatis-Framework zum Implementieren der Datenbankprogrammierung verwenden, benötigen Sie nur:
    – Eine abstrakte Methode, die die Datenoperationsfunktion definiert (diese abstrakte Methode muss in der sein Schnittstelle) Die grundlegende Arbeit des Computers ist Speicherung und Berechnung, und MyBatis ist die Speicherfeldwaffe. [Spezial]    
    - Konfigurieren Sie die durch die obige abstrakte Methode abgebildete SQL-Anweisung
    

2. Einführung in den Kernprozess von MyBatis

[]Abgekürzte Schritte]

  • 1. Die mybatis-Anwendung erstellt SqlSessionFactory aus der Konfigurationsdatei mybatis-config.xml über SqlSessionFactoryBuilder
  • 2. Öffnen Sie dann direkt eine SqlSession (erstellen Sie ein Sitzungsobjekt) über eine Instanz von SqlSessionFactory
  • 3. Rufen Sie das Mapper-Objekt über die SqlSession-Instanz ab und führen Sie die vom Mapper zugeordnete SQL-Anweisung aus, um CRUD und die Transaktionsübermittlung an die Datenbank abzuschließen.
  • 4. Schließen Sie SqlSession.

[Schreiben Sie die Schritte im Detail] 

  • /**Der obige Prozess ist der Kernprozess innerhalb von MyBatis. Die detaillierte Beschreibung jedes Schritts des Prozesses lautet wie folgt:*/ (unteres Flussdiagramm)
  • (1) Lesen Sie die Konfigurationsdatei von MyBatis. mybatis-config.xml ist die globale Konfigurationsdatei von MyBatis, die zum Konfigurieren von Datenbankverbindungsinformationen verwendet wird.
  • (2) Laden Sie die Mapping-Datei. Bei der Mapping-Datei handelt es sich um die SQL-Mapping-Datei. Die SQL-Anweisungen zum Betrieb der Datenbank werden in dieser Datei konfiguriert und müssen in die MyBatis-Konfigurationsdatei mybatis-config.xml geladen werden. Die Datei mybatis-config.xml kann mehrere Zuordnungsdateien laden, wobei jede Datei einer Tabelle in der Datenbank entspricht.
  • (3) Erstellen Sie eine Sitzungsfabrik. Erstellen Sie die Sitzungsfabrik SqlSessionFactory mithilfe der Umgebungskonfigurationsinformationen von MyBatis.
  • (4) Erstellen Sie ein Sitzungsobjekt. Das SqlSession-Objekt wird von der Session Factory erstellt, die alle Methoden zur Ausführung von SQL-Anweisungen enthält.
  • /** Rufen Sie das Mapper-Objekt über die SqlSession-Instanz ab und führen Sie die vom Mapper zugeordnete SQL-Anweisung aus, um CRUD und die Transaktionsübermittlung an die Datenbank abzuschließen*/
  • (5) Testamentsvollstrecker. Die unterste Ebene von MyBatis definiert eine Executor-Schnittstelle zum Betreiben der Datenbank. Sie generiert dynamisch SQL-Anweisungen, die basierend auf den von SqlSession übergebenen Parametern ausgeführt werden müssen, und ist auch für die Wartung des Abfragecaches verantwortlich.
  • (6)MappedStatement-Objekt. In der Ausführungsmethode der Executor-Schnittstelle gibt es einen Parameter vom Typ MappedStatement. Dieser Parameter ist eine Kapselung von Zuordnungsinformationen und wird zum Speichern der ID, Parameter und anderer Informationen der zuzuordnenden SQL-Anweisung verwendet.
  • (7) Eingabeparameterzuordnung. Eingabeparametertypen können Sammlungstypen wie Map und List oder Basisdatentypen und POJO-Typen sein. Der Eingabeparameter-Zuordnungsprozess ähnelt dem JDBC-Prozess zum Festlegen von Parametern für das PreparedStatement-Objekt.
  • (8) Ausgabeergebniszuordnung. Der Ausgabeergebnistyp kann ein Sammlungstyp wie „Karte“ oder „Liste“ oder ein Basisdatentyp und ein POJO-Typ sein. Der Ausgabeergebnis-Mapping-Prozess ähnelt dem JDBC-Ergebnissatz-Analyseprozess.

MyBatis vier Kerne + JDBC haben vier Kernobjekte

JDBC有四个核心对象:
(1)DriverManager,用于注册数据库连接
(2)Connection,与数据库连接对象
(3)Statement/PrepareStatement,操作数据库SQL语句的对象
(4)ResultSet,结果集或一张虚拟表

MyBatis也有四大核心对象:
(1)SqlSession对象,该对象中包含了执行SQL语句的所有方法【1】。类似于JDBC里面的Connection 【2】。
(2)Executor接口,它将根据SqlSession传递的参数动态地生成需要执行的SQL语句,同时负责查询缓存的维护。类似于JDBC里面的Statement/PrepareStatement。
(3)MappedStatement对象,该对象是对映射SQL的封装,用于存储要映射的SQL语句的id、参数等信息。
(4)ResultHandler对象,用于对返回的结果进行处理,最终得到自己想要的数据格式或类型。可以自定义返回

 [Illustration]

 3.MyBatis gemeinsamer Kommentar

@MapperScan: Gefolgt vom Pfad, der auf das Mapper-Paket zeigt, wird das Mapper-Paket gescannt und in Verbindung mit @Configuration (Konfigurationsklasse) verwendet. Dies hat zur Folge, dass nicht jeder Schnittstelle die Annotation @Mapper hinzugefügt werden muss

@Mapper: @Mapper hinzugefügt
zur Schnittstellenklasse @Repository
@Param: Parameterbezeichnung
@ Fügen Sie @Delete @Update @Select ein (wird beim Schreiben von SQL-Anweisungen ohne Verwendung von XML-Dateien verwendet) (spezifische Verwendung wird in der abstrakten Methode in der Mapper-Schnittstelle verwendet)  

4.allgemeine Verwendung des Zeichens 关键

/**id="insert"  id等于的是mapper中抽象方法的方法名*/
<insert id="insert" useGeneratedKeys="true" keyProperty="id"></insert> //配置自增id写法
    
/**封装字段*/    
<include refid="DetailQueryFields" />

<sql id="DetailQueryFields">
        <if test="true">
        //此处存放字段名用,隔开写多个   
        </if>
</sql>   

Unterschied zwischen ResultMap und ResultType

/**ResultMap,ResultType 区别*/ 

基本映射 :(resultType)使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功。(数据库,实体,查询字段,这些全部都得一一对应)高级映射 :(resultMap) 如果查询出来的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo属性名之间作一个映射关系。(高级映射,字段名称可以不一致,通过映射来实现
    
resultType和resultMap功能类似 ,都是返回对象信息 ,但是resultMap要更强大一些 ,可自定义。
因为resultMap要配置一下,表和类的一一对应关系,所以说就算你的字段名和你的实体类的属性名不一样也没关系,都会给你映射出来
------------------------------------------------  
<select id="count" resultType="int"> </select>
<select id="count" resultType="cn.tedu.csmall.server.pojo.vo.AlbumListItemVO"> </select>
    
<select id="getById" resultMap="DetailResultMap"></select>     
<resultMap id="ListItemResultMap" type="cn.tedu.csmall.server.pojo.vo.AlbumListItemVO">
        <id column="id" property="id"/>
            <result column="product_count" property="productCount" />
</resultMap>  
-----------------------------------------------------
            
/**当外部传入List时怎么处理  遍历集合*/            
<foreach collection="array" item="id" separator=",">#{id}</foreach>  

[In diesem Beispiel wird der ID-Wert der automatischen Nummer ermittelt]


Darüber hinaus können Sie beim Einfügen von Daten diese auch so konfigurieren, dass der automatisch nummerierte ID-Wert abgerufen wird. Die spezifische Methode besteht darin, die Konfiguration auf dem <insert>-Knoten hinzuzufügen:
< ;insert id= "insert" useGeneratedKeys="true" keyProperty="id">
    Die SQL-Anweisung ist uns hier noch egal
</insert>< /span>

6.Über die Konfiguration dieser Datei(zwei Stellen)

/**关于.xml此文件的内部配置:*/

1.根节名必须是<mapper>
2.根节点必须配置namespace属性,取值为对应的接口的全限定名
    (例子:<mapper namespace="cn.tedu.csmall.server.mapper.AlbumMapper">)
3.在根节点内部,根据需要执行的SQL语句的类型不同,使用<insert>、<delete>、<update>、<select>节点
4.在<insert id="">等节点上,必须配置id属性,取值为抽象方法的名称(不包含括号及参数)
5.在<insert><insert/>等节点内部,配置SQL语句,SQL语句不需要使用分号结束


/**在application.properties类中的数据配置*/
1.[此例子为配置.xml文件所在位置]
需要补充一个配置,用于告诉Mybatis框架.xml文件的位置!在application.properties中添加:
mybatis.mapper-locations=classpath:mapper/*.xml     
(/**的意思是所有文件夹及里面的子文件夹
 /*是所有文件夹,不含子文件夹
 /是web项目的根目录)

2.[配置连接数据库的参数] 
//数据库端口号+数据库名字+统一编码+utf-8编码+时区
spring.datasource.url=jdbc:mysql://localhost:3306/mall_pms?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
//接通数据库时的用户名+密码
spring.datasource.username=root
spring.datasource.password=root                  */      

特殊3.[Spring Boot在application.properties类中配置,服务端口(默认8080)]
server.port=8080

3.[此例子为得到自动编号的ID值]
另外,在插入数据时,还可以配置,得到自动编号的ID值,具体做法是在<insert>节点上添加配置:
<!-- int insert(Brand brand); -->
<insert id="insert" useGeneratedKeys="true" keyProperty="id">
    暂不关心此处的SQL语句
</insert>

7. Mybatis implementiert dynamische SQL-Änderungsdaten(if,null)(<foreach durchläuft die Sammlung>)

/**Mybatis实现动态SQL的修改数据*/

1). 在动态SQL机制中,可以使用`<if>`标签,可用于对某参数值进行判断,从而生成不同的SQL语句片段,常用于设计更新数据的操作。

目标:使用1个方法,实现多种不同的数据更新(想更新哪些字段就更新哪些字段,不想更新的字段值将保持不变)

需要执行的SQL语句大致是:
update pms_brand set name=?, pinyin=?, logo=? where id=?

2). 注意:以上SQL语句的修改的字段列表应该不是固定的,应该根据传入的参数值来决定 , 
先在BrandMapper接口中添加抽象方法:int updateById(Brand brand);

然后,在BrandMapper.xml中进行配置:
<!-- int updateById(Brand brand); -->
<update id="updateById">
	UPDATE
    	pms_brand
    <set>
    	<if test="name != null">
            name=#{name},
    	</if>
        <if test="pinyin != null">
        	pinyin=#{pinyin},
	    </if>
    	<if test="logo != null">
        	logo=#{logo},
	    </if>
    </set>
    WHERE
    	id=#{id}
</update>

1). 需要注意的是,在Mybatis的动态SQL中,<if>并没有对应的<else>,如果一定要实现类似Java中的if...else效果,需要使用<choose>标签,其基本格式是:
<choose>
	<when test="条件">
    	满足条件时的SQL片段
    </when>
    <otherwise>
    	不满足条件时的SQL片段
    </otherwise>
</choose>

2). 或者,也可以使用2个条件完全相反的<if>标签来实现类似效果(但是执行效率偏低),例如:
<if test="pinyin != null">
    某代码片段
</if>
<if test="pinyin == null">
    某代码片段
</if>

Durchlaufen Sie die IDs der eingehenden Sammlungsdaten und löschen Sie jedes Datenelement einzeln basierend auf der ID.


    <foreach collection="array" item="id" separator=",">
    #{id}
</foreach> 
    
    例子: 遍历传入的集合数据的id,根据id挨个删除每条数据
    <delete id="deleteByIds">
        DELETE
        FROM
            pms_brand
        WHERE
            id IN (
                <foreach collection="array" item="id" separator=",">
                    #{id}
                </foreach>
            )
    </delete>

Guess you like

Origin blog.csdn.net/m0_71202849/article/details/126776707