告别繁琐的数据库操作,MyBatis带你领略一键增删改查的魅力!

 

目录

一、引言

1.1MyBatis概念

1.2.为什么要使用MyBatis

二、搭建Mybatis环境

2.1.创建Maven项目

2.2.导入相关pom依赖

2.3.导入相关配置文件

2.4.Mybatis相关插件安装

2.5.Mybatis.cfg.xml配置 

三、基于ssm逆向工程的使用(IDEA)

3.1.安装Mybatis generator插件

3.2.配置generatorConfig.xml

四、结合Mybatis生成代码完成增删改查

 五、面试题SQLSession的作用


一、引言

1.1MyBatis概念

MyBatis是一个支持普通SQL查询、存储过程以及高级映射的持久层框架,它消除了几乎所有的JDBC代码和参数的手动设置以及对结果集的检索,并使用简单的XML或注解进行配置和原始映射,用以将接口和Java的POJO映射成数据库 。

MyBatis的主要特点包括:

  • 支持定制化SQL、存储过程以及高级映射。
  • 避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。
  • 可以使用简单的XML或注解来配置和映射原生类型、接口和Java的POJO为数据库中的记录。

1.2.为什么要使用MyBatis

使用MyBatis的主要优点是:

1. 通过简单的XML或注解配置,可以方便地将Java对象与数据库记录进行映射,避免了繁琐的JDBC代码。
2. MyBatis支持高级映射和存储过程,使得数据库操作更加简单、高效。
3. MyBatis可以自动映射结果集到Java对象,减少了手动处理结果集的代码量。
4. MyBatis支持事务管理,可以确保数据的一致性和完整性。
5. MyBatis具有很好的扩展性,可以通过插件或自定义拦截器来实现更多的功能。

以一个简单的查询操作为例,不使用MyBatis时,我们需要编写如下JDBC代码:

String sql = "SELECT * FROM user WHERE id = ?";
PreparedStatement pstmt = connection.prepareStatement(sql);
pstmt.setInt(1, userId);
ResultSet rs = pstmt.executeQuery();
while (rs.next()) {
    User user = new User();
    user.setId(rs.getInt("id"));
    user.setName(rs.getString("name"));
    // ...其他属性设置
}

而使用MyBatis时,我们只需要编写如下XML配置和Java对象:

<select id="getUserById" parameterType="int" resultType="User">
    SELECT * FROM user WHERE id = #{id}
</select>
User user = sqlSession.selectOne("getUserById", userId);

On peut voir qu'après avoir utilisé MyBatis, le code devient plus concis et clair.

2. Construire l'environnement Mybatis

2.1. Créer un projet Maven

Tout d'abord, nous créons un projet Maven de base avant d'apprendre mybatis 

        Faites un clic droit sur le nom du projet ➡nouveau➡module

         Sélectionnez le projet maven ➡ sélectionnez la version jdk ➡ sélectionnez l'application Web 

         Entrez le nom du projet 

Sélectionnez l'emplacement du fichier du projet maven ➡ cliquez sur le bouton ajouter ➡ configurez les paramètres 

2.2. Importer les dépendances pom liées

① Remplacez simplement le contenu des balises <properties> et <dependencies>.

 <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <dependencies>
        <!-- ********************** junit单元测试依赖 ********************** -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

        <!-- ********************** Java Servlet API  ********************** -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.0</version>
            <scope>provided</scope>
        </dependency>

        <!-- ********************** Mybatis依赖 ********************** -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.5</version>
        </dependency>

        <!-- ********************** Mysql JDBC驱动 ********************** -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.44</version>
        </dependency>

        <!-- **********************  日志配置  ********************** -->
        <!--记得修改mybatis.cfg.xml添加如下内容-->
        <!--<setting name="logImpl" value="LOG4J2"/>-->
        <!--核心log4j2jar包-->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.9.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.9.1</version>
        </dependency>
        <!--web工程需要包含log4j-web,非web工程不需要-->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-web</artifactId>
            <version>2.9.1</version>
        </dependency>
    </dependencies>

②Dans la balise <build>, supprimez la balise <pluginManagement> (déverrouillez la version) et ajoutez des <resources>.

Il peut garantir que mybatis-generator-maven-plugin peut copier correctement les fichiers requis dans le dossier cible au moment de l'exécution, évitant ainsi le problème des fichiers manquants ou des erreurs de configuration.

   <resources>
            <!--解决mybatis-generator-maven-plugin运行时没有将XxxMapper.xml文件放入target文件夹的问题-->
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
            </resource>
            <!--解决mybatis-generator-maven-plugin运行时没有将jdbc.properites文件放入target文件夹的问题-->
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>jdbc.properties</include>
                    <include>*.xml</include>
                </includes>
            </resource>
        </resources>

③Configuration du plug-in Maven pour utiliser le plug-in MyBatis Generator

Le plug-in MyBatis Generator peut être utilisé pendant le processus de construction de Maven pour générer du code Java, y compris l'interface Mapper et les fichiers de mappage XML, afin de simplifier le processus de développement des opérations de base de données.

 <plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.3.2</version>
                <dependencies>
                    <!--使用Mybatis-generator插件不能使用太高版本的mysql驱动 -->
                    <dependency>
                        <groupId>mysql</groupId>
                        <artifactId>mysql-connector-java</artifactId>
                        <version>5.1.44</version>
                    </dependency>
                </dependencies>
                <configuration>
                    <overwrite>true</overwrite>
                </configuration>
            </plugin>

2.3. Importer les fichiers de configuration associés

Nous savons que Mybatis est un framework lié aux bases de données, nous devons donc également importer des fichiers de configuration sur les connexions à la base de données.

 jdbc.properties:

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis_ssm?useUnicode=true&characterEncoding=UTF-8
jdbc.username=root
jdbc.password=123456

Modifier le fichier web.xml

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >
 
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
 
         version="3.1"></web-app>

2.4. Installation du plug-in lié à Mybatis

Un total de quatre plugins doivent être installés

Plugin mybatis gratuit

Générateur Mybatis _

outils mybatis

assistant maven 

Conseils:

  1. Plugin MyBatis gratuit : Ce plugin réalise principalement le saut rapide entre mapper et XML, sans avoir à effectuer une recherche globale à chaque fois que vous recherchez SQL. La deuxième fonction est couramment utilisée : passer rapidement du code XML au fichier mapper et du fichier mapper au code XML.

  2. Générateur Mybatis : ce plug-in peut générer automatiquement les classes d'entités correspondantes, les interfaces Mapper et les fichiers de mappage XML en fonction de la structure des tables de base de données. Cela peut réduire considérablement la charge de travail des développeurs et améliorer l'efficacité du développement.

  3. Outils Mybatis : ce plugin fournit certains outils liés à MyBatis, tels que des générateurs de code, des analyseurs de code, etc.

  4. Assistant Maven : Ce plugin est principalement utilisé pour résoudre les conflits maven. Une fois l'installation terminée, ouvrez le fichier pom.xml et il y aura un onglet Dependency Analyzer supplémentaire. L'élément de conflit est sélectionné par défaut et la liste des conflits est affichée à gauche. Il suffit de cliquer sur un élément et d'afficher le bouton rouge droit pour l'exclure. Cliquez ensuite sur le bouton Actualiser l'interface utilisateur dans le coin supérieur gauche pour voir qu'il a été exclu et le code d'exclusion sera automatiquement ajouté au pom.

2.5.Configuration de Mybatis.cfg.xml 

Comme nous le savons tous, un framework doit avoir son propre fichier de configuration, et Mybatis possède également un fichier de configuration

Monbatis.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!-- 引入外部配置文件 -->
    <properties resource="jdbc.properties"/>

    <settings>
        <setting name="logImpl" value="LOG4J2"/>
    </settings>

    <!-- 别名 -->
    <typeAliases>
        <!--<typeAlias type="com.javaxl.model.Book" alias="Book"/>-->
    </typeAliases>


    <!-- 配置mybatis运行环境 -->
    <environments default="development">
        <environment id="development">
            <!-- type="JDBC" 代表使用JDBC的提交和回滚来管理事务 -->
            <transactionManager type="jdbc"/>

            <!-- mybatis提供了3种数据源类型,分别是:POOLED,UNPOOLED,JNDI -->
            <!-- POOLED 表示支持JDBC数据源连接池 -->
            <!-- UNPOOLED 表示不支持数据源连接池 -->
            <!-- JNDI 表示支持外部数据源连接池 -->
            <dataSource type="POOLED">
                <property name="driver"
                          value="${jdbc.driver}"/>
                <property name="url"
                          value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
      <!--  <mapper resource="com/javaxl/mapper/BookMapper.xml"/>-->
    </mappers>
</configuration>

3. Utilisation de l'ingénierie inverse basée sur ssm (IDEA)

L'utilisation de l'ingénierie inverse basée sur SSM (IDEA) fait référence à l'utilisation de l'outil MyBatisGenerator dans l'environnement de développement intégré d'IntelliJ IDEA pour générer automatiquement les classes d'entités correspondantes, les interfaces Mapper et les fichiers de mappage XML en fonction de la structure des tables de base de données. Cela peut réduire considérablement la charge de travail des développeurs et améliorer l'efficacité du développement.

3.1. Installer le plugin générateur Mybatis

Nous avons déjà terminé cette étape et l'avons ignorée directement

3.2. Configurer GeneratorConfig.xml

générateurConfig.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd" >
<generatorConfiguration>
    <!-- 引入配置文件 -->
    <properties resource="jdbc.properties"/>

    <!--指定数据库jdbc驱动jar包的位置-->
    <classPathEntry location="D:\\initPath\\mvn_repository\\mysql\\mysql-connector-java\\5.1.44\\mysql-connector-java-5.1.44.jar"/>

    <!-- 一个数据库一个context -->
    <context id="infoGuardian">
        <!-- 注释 -->
        <commentGenerator>
            <property name="suppressAllComments" value="true"/><!-- 是否取消注释 -->
            <property name="suppressDate" value="true"/> <!-- 是否生成注释代时间戳 -->
        </commentGenerator>

        <!-- jdbc连接 -->
        <jdbcConnection driverClass="${jdbc.driver}"
                        connectionURL="${jdbc.url}" userId="${jdbc.username}" password="${jdbc.password}"/>

        <!-- 类型转换 -->
        <javaTypeResolver>
            <!-- 是否使用bigDecimal, false可自动转化以下类型(Long, Integer, Short, etc.) -->
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>

        <!-- 01 指定javaBean生成的位置 -->
        <!-- targetPackage:指定生成的model生成所在的包名 -->
        <!-- targetProject:指定在该项目下所在的路径  -->
        <javaModelGenerator targetPackage="com.javaxl.model"
                            targetProject="src/main/java">
            <!-- 是否允许子包,即targetPackage.schemaName.tableName -->
            <property name="enableSubPackages" value="false"/>
            <!-- 是否对model添加构造函数 -->
            <property name="constructorBased" value="true"/>
            <!-- 是否针对string类型的字段在set的时候进行trim调用 -->
            <property name="trimStrings" value="false"/>
            <!-- 建立的Model对象是否 不可改变  即生成的Model对象不会有 setter方法,只有构造方法 -->
            <property name="immutable" value="false"/>
        </javaModelGenerator>

        <!-- 02 指定sql映射文件生成的位置 -->
        <sqlMapGenerator targetPackage="com.javaxl.mapper"
                         targetProject="src/main/java">
            <!-- 是否允许子包,即targetPackage.schemaName.tableName -->
            <property name="enableSubPackages" value="false"/>
        </sqlMapGenerator>

        <!-- 03 生成XxxMapper接口 -->
        <!-- type="ANNOTATEDMAPPER",生成Java Model 和基于注解的Mapper对象 -->
        <!-- type="MIXEDMAPPER",生成基于注解的Java Model 和相应的Mapper对象 -->
        <!-- type="XMLMAPPER",生成SQLMap XML文件和独立的Mapper接口 -->
        <javaClientGenerator targetPackage="com.javaxl.mapper"
                             targetProject="src/main/java" type="XMLMAPPER">
            <!-- 是否在当前路径下新加一层schema,false路径com.oop.eksp.user.model, true:com.oop.eksp.user.model.[schemaName] -->
            <property name="enableSubPackages" value="false"/>
        </javaClientGenerator>

        <!-- 配置表信息 -->
        <!-- schema即为数据库名 -->
        <!-- tableName为对应的数据库表 -->
        <!-- domainObjectName是要生成的实体类 -->
        <!-- enable*ByExample是否生成 example类 -->
        <!--<table schema="" tableName="t_book" domainObjectName="Book"-->
               <!--enableCountByExample="false" enableDeleteByExample="false"-->
               <!--enableSelectByExample="false" enableUpdateByExample="false">-->
            <!--&lt;!&ndash; 忽略列,不生成bean 字段 &ndash;&gt;-->
            <!--&lt;!&ndash; <ignoreColumn column="FRED" /> &ndash;&gt;-->
            <!--&lt;!&ndash; 指定列的java数据类型 &ndash;&gt;-->
            <!--&lt;!&ndash; <columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" /> &ndash;&gt;-->
        <!--</table>-->

        <table schema="" tableName="t_mvc_Book" domainObjectName="Book"
               enableCountByExample="false" enableDeleteByExample="false"
               enableSelectByExample="false" enableUpdateByExample="false">
            <!-- 忽略列,不生成bean 字段 -->
            <!-- <ignoreColumn column="FRED" /> -->
            <!-- 指定列的java数据类型 -->
            <!-- <columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" /> -->
        </table>

    </context>
</generatorConfiguration>

Précautions:

① Modifier l'emplacement du pilote Mysql

 Copiez à l'emplacement de <classPathEntry>, notez qu'une barre oblique doit être ajoutée.

 ②Modifier l'emplacement JavaBean est généré

 ③ Modifier l'adresse de génération du fichier de configuration correspondant à SQL

  ④ Modifier l'adresse générée de l'adresse du code de couche Dao

⑤Modification spécifie qu'un tableau correspondant au code d'ajout, de suppression, de modification et de requête doit être généré 

 Si vous souhaitez générer plusieurs tables à la fois, vous pouvez copier plusieurs tables.

Double-cliquez sur le plug-in que nous avons téléchargé pour exécuter le code généré

 À ce stade, le code est généré

4. Combiner Mybatis pour générer du code pour effectuer des ajouts, des suppressions, des modifications et des demandes de renseignements

①Créez un package util et une classe SessionUtil

package com.csdn.xw.util;
 
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
 

public class SessionUtil {
    private static SqlSessionFactory sessionFactory;
    private static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<SqlSession>();
    static {
        sessionFactory = new SqlSessionFactoryBuilder().build(SessionUtil.class.getResourceAsStream("/mybatis.cfg.xml"));
    }
 
    public static SqlSession openSession() {
        SqlSession session = threadLocal.get();
        if (null == session) {
            session = sessionFactory.openSession();
            threadLocal.set(session);
        }
        return session;
    }
 
    public static void main(String[] args) {
        SqlSession session = openSession();
        System.out.println(session.getConnection());
        session.close();
    }
}

Conseils:

  • La fonction de cette classe d'outils est de créer et de gérer l'objet SqlSession de MyBatis. Il initialise une SqlSessionFactory en lisant le fichier de configuration mybatis.cfg.xml, puis utilise cette fabrique pour créer une SqlSession. L'objet SqlSession est utilisé pour effectuer des opérations de base de données telles que des requêtes, des insertions, des mises à jour et des suppressions.
  • Dans la méthode openSession(), vérifiez d'abord si le thread actuel a déjà un objet SqlSession, sinon, créez une nouvelle SqlSession et définissez-la sur le thread actuel. S'il existe déjà un objet SqlSession, renvoyez simplement cet objet directement.
  • Dans la méthode main(), appelez la méthode openSession() pour obtenir un objet SqlSession, puis imprimez les informations de connexion de cet objet, et enfin fermez l'objet SqlSession.

②Créez la couche biz et l'interface BookBiz (copiez simplement celle générée par le mappeur)

package com.csdn.xw.biz;

import com.csdn.xw.model.Book;

public interface BookBiz {
    int deleteByPrimaryKey(Integer bid);

    int insert(Book record);

    int insertSelective(Book record);

    Book selectByPrimaryKey(Integer bid);

    int updateByPrimaryKeySelective(Book record);

    int updateByPrimaryKey(Book record);
}

③Créez une couche impl et implémentez BookBiz avec bookbizimpl

package com.csdn.xw.biz.Impl;

import com.csdn.xw.biz.BookBiz;
import com.csdn.xw.mapper.BookMapper;
import com.csdn.xw.model.Book;

/**
 * @author Java方文山
 * @compay csdn_Java方文山
 * @create 2023-08-19-13:41
 */
public class BookBizImpl implements BookBiz {
    private BookMapper bookMapper;

    public BookMapper getBookMapper() {
        return bookMapper;
    }

    public void setBookMapper(BookMapper bookMapper) {
        this.bookMapper = bookMapper;
    }

    @Override
    public int deleteByPrimaryKey(Integer bid) {
        return bookMapper.deleteByPrimaryKey(bid);
    }

    @Override
    public int insert(Book record) {
        return bookMapper.insert(record);
    }

    @Override
    public int insertSelective(Book record) {
        return bookMapper.insertSelective(record);
    }

    @Override
    public Book selectByPrimaryKey(Integer bid) {
        return bookMapper.selectByPrimaryKey(bid);
    }

    @Override
    public int updateByPrimaryKeySelective(Book record) {
        return bookMapper.updateByPrimaryKeySelective(record);
    }

    @Override
    public int updateByPrimaryKey(Book record) {
        return bookMapper.updateByPrimaryKey(record);
    }
}

Remarque : Les méthodes set et get de bookMapper doivent être fournies

④essai

Les balises d'annotation Junit <scope>sont utilisées pour spécifier la portée d'une dépendance afin d'indiquer que la dépendance est valide au moment de la compilation, du test et de l'exécution.

package demo;

import com.csdn.xw.biz.Impl.BookBizImpl;
import com.csdn.xw.mapper.BookMapper;
import com.csdn.xw.util.SessionUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

/**
 * @author Java方文山
 * @compay csdn_Java方文山
 * @create 2023-08-19-13:46
 */
public class demo1 {

    private BookBizImpl bookBiz = new BookBizImpl();
    SqlSession sqlSession;

    @Before
    public void setUp() throws Exception {
        System.out.println("初始换方法。。。");
        //工具类中获取session对象
        sqlSession = SessionUtil.openSession();
        //从session对象中获取mapper对象
        BookMapper mapper = sqlSession.getMapper(BookMapper.class);
        bookBiz.setBookMapper(mapper);
    }

    @After
    public void tearDown() throws Exception {
        System.out.println("方法测试结束。。");
    }

    @Test
    public void deleteByPrimaryKey() {
        System.out.println("测试删除业务方法");
        System.out.println(bookBiz.deleteByPrimaryKey(1));
    }

    @Test
    public void selectByPrimaryKey() {

        System.out.println("测试的查询业务方法。。。");
        //System.out.println(bookBiz.getBookMapper());
        System.out.println(bookBiz.selectByPrimaryKey(44));
    }

}

Deux choses représentatives sont testées ici, on supprime une requête

Une erreur a été signalée lors de l'exécution, indiquant que getMapper n'a aucune valeur. À ce moment-là, nous nous sommes souvenus que comme le code n'avait pas été généré auparavant, nous avions commenté le contenu du fichier de mappage de configuration dans <mappers> pour éviter les erreurs, et maintenant nous le modifions.

Résultats des tests de requête :

 Supprimer les résultats des tests :

Nous supprimons les données numérotées 1

 La valeur de retour ici est 1, indiquant que la suppression a réussi, mais nous retournons à la base de données pour vérifier, les données sont toujours là, pourquoi ?

Parce que notre Mybatis n'a pas la capacité de soumettre automatiquement les éléments, nous pouvons écrire les éléments soumis dans la méthode de test @After

Après écriture, nous testons et nos données sont supprimées à ce moment-là. 

 Cinquièmement, le rôle des questions d'entrevue SQLSession

SQLSession est une interface du framework MyBatis, et sa fonction principale est d'exécuter des instructions SQL et de gérer les transactions. Dans MyBatis, une instance SqlSessionFactory crée une instance SqlSession et chaque instance SqlSession possède sa propre transaction pour exécuter des opérations SQL. Lorsque plusieurs instances de SqlSession s'exécutent simultanément, elles partagent la même transaction, ce qui peut garantir la cohérence des données.

Pour résumer, le rôle de SQLSession est le suivant :

  1. Exécuter des instructions SQL ;
  2.  affaires de gestion;
  3.  Les opérations simultanées sont prises en charge.
  4. sqlsession peut obtenir l'objet mappeur
  5. Utilisé comme cache, le cache de premier niveau, le cache qui sera activé par défaut,
  6. Pour des raisons de performances, le cache de deuxième niveau sera utilisé et le cache de deuxième niveau doit être activé manuellement

Mon partage est par ici, bienvenue dans l'espace commentaire pour discuter et communiquer ! !

Si vous le trouvez utile, n'hésitez pas à mettre un pouce bleu ♥ ♥

Je suppose que tu aimes

Origine blog.csdn.net/weixin_74318097/article/details/132378387
conseillé
Classement