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>