Diga adeus às tediosas operações de banco de dados, MyBatis mostrará o charme de adicionar, excluir, modificar e verificar com um clique!

 

Índice

I. Introdução

1.1 Conceito MyBatis

1.2. Por que usar MyBatis

2. Construir ambiente Mybatis

2.1. Crie um projeto Maven

2.2. Importar dependências pom relacionadas

2.3. Importe arquivos de configuração relacionados

2.4. Instalação do plug-in relacionado ao Mybatis

2.5. Configuração Mybatis.cfg.xml 

3. Uso de engenharia reversa baseada em ssm (IDEA)

3.1. Instale o plugin gerador Mybatis

3.2. Configurar geradorConfig.xml

4. Combinando Mybatis para gerar código para completar adições, exclusões, modificações e consultas

 Quinto, o papel das perguntas da entrevista SQLSession


I. Introdução

1.1 Conceito MyBatis

MyBatis é uma estrutura de camada de persistência que oferece suporte a consultas SQL comuns, procedimentos armazenados e mapeamento avançado. Ele elimina quase todas as configurações manuais de códigos e parâmetros JDBC e recuperação de conjuntos de resultados e usa XML simples ou anotações para configuração e mapeamento original. mapear interfaces e POJOs Java em bancos de dados.

Os principais recursos do MyBatis incluem:

  • Suporta SQL personalizado, procedimentos armazenados e mapeamento avançado.
  • Evita quase todo o código JDBC, configuração manual de parâmetros e obtenção de conjuntos de resultados.
  • XML simples ou anotações podem ser usadas para configurar e mapear tipos nativos, interfaces e POJOs Java como registros no banco de dados.

1.2. Por que usar MyBatis

As principais vantagens de usar MyBatis são:

1. Por meio de XML simples ou configuração de anotação, você pode mapear facilmente objetos Java e registros de banco de dados, evitando códigos JDBC complicados.
2. MyBatis suporta mapeamento avançado e procedimentos armazenados, tornando as operações de banco de dados mais fáceis e eficientes.
3. MyBatis pode mapear automaticamente conjuntos de resultados para objetos Java, reduzindo a quantidade de código para processar manualmente conjuntos de resultados.
4. MyBatis oferece suporte ao gerenciamento de transações para garantir consistência e integridade dos dados.
5. MyBatis tem boa escalabilidade e mais funções podem ser realizadas por meio de plug-ins ou interceptadores personalizados.

Tomemos como exemplo uma operação de consulta simples: quando não estivermos usando MyBatis, precisamos escrever o seguinte código 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"));
    // ...其他属性设置
}

Ao usar MyBatis, precisamos apenas escrever a seguinte configuração XML e objetos Java:

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

Percebe-se que após usar o MyBatis, o código fica mais conciso e claro.

2. Construir ambiente Mybatis

2.1. Crie um projeto Maven

Primeiro, criamos um projeto maven básico antes de aprender mybatis 

        Clique com o botão direito no nome do projeto ➡new➡module

         Selecione o projeto maven ➡ selecione a versão do jdk ➡ selecione webapp 

         Digite o nome do projeto 

Selecione o local do arquivo do projeto maven ➡ clique no botão adicionar ➡ configure os parâmetros 

2.2. Importar dependências pom relacionadas

① Basta substituir o conteúdo das tags <properties> e <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>

②Na tag <build>, exclua a tag <pluginManagement> (desbloqueie a versão) e adicione <resources>.

Ele pode garantir que o mybatis-generator-maven-plugin possa copiar corretamente os arquivos necessários para a pasta de destino em tempo de execução, evitando o problema de arquivos ausentes ou erros de configuração.

   <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>

③Configuração do plug-in Maven para usar o plug-in MyBatis Generator

Você pode usar o plug-in MyBatis Generator durante o processo de construção do Maven para gerar código Java, incluindo interface Mapper e arquivos de mapeamento XML, para simplificar o processo de desenvolvimento de operações de banco de dados.

 <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. Importe arquivos de configuração relacionados

Sabemos que Mybatis é um framework relacionado a banco de dados, então também precisamos importar arquivos de configuração sobre conexões de banco de dados

 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

Modifique o arquivo 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. Instalação do plug-in relacionado ao Mybatis

Um total de quatro plug-ins precisam ser instalados

Plug-in mybatis grátis

Geração Mybatis ou

ferramentas mybatis

ajudante especialista 

Pontas:

  1. Plugin MyBatis gratuito: Este plugin realiza principalmente o salto rápido entre mapeador e xml, sem ter que pesquisar globalmente toda vez que você pesquisa por sql. A segunda função é comumente usada: pular rapidamente do código xml para o arquivo mapeador e do arquivo mapeador para o código xml.

  2. Gerador Mybatis: Este plug-in pode gerar automaticamente classes de entidade correspondentes, interfaces Mapper e arquivos de mapeamento XML de acordo com a estrutura da tabela do banco de dados. Isso pode reduzir bastante a carga de trabalho dos desenvolvedores e melhorar a eficiência do desenvolvimento.

  3. Ferramentas Mybatis: Este plugin fornece algumas ferramentas relacionadas ao MyBatis, como geradores de código, analisadores de código e muito mais.

  4. Ajudante Maven: Este plugin é usado principalmente para resolver conflitos maven. Após a conclusão da instalação, abra o arquivo pom.xml e haverá uma guia adicional do Analisador de Dependência. O item de conflito é selecionado por padrão e a lista de conflitos é exibida à esquerda, basta clicar em um e exibir o botão vermelho direito para excluí-lo. Em seguida, clique no botão Atualizar UI no canto superior esquerdo para ver se ela foi excluída e o código de exclusão será adicionado automaticamente ao pom.

2.5. Configuração Mybatis.cfg.xml 

Como todos sabemos, um framework deve ter seu próprio arquivo de configuração, e Mybatis também possui um arquivo de configuração

Mybatis.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. Uso de engenharia reversa baseada em ssm (IDEA)

O uso de engenharia reversa baseada em SSM (IDEA) refere-se ao uso da ferramenta MyBatisGenerator no ambiente de desenvolvimento integrado do IntelliJ IDEA para gerar automaticamente classes de entidade correspondentes, interfaces Mapper e arquivos de mapeamento XML de acordo com a estrutura da tabela do banco de dados. Isso pode reduzir bastante a carga de trabalho dos desenvolvedores e melhorar a eficiência do desenvolvimento.

3.1. Instale o plugin ou gerador Mybatis

Já concluímos esta etapa e a pulamos diretamente

3.2. Configurar geradorConfig.xml

geradorConfig.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>

Precauções:

① Modifique a localização do driver Mysql

 Copie para o local <classPathEntry>, observe que uma barra precisa ser adicionada.

 ②Modifique o local onde o JavaBean é gerado

 ③ Modifique o endereço de geração do arquivo de configuração correspondente ao SQL

  ④ Modifique o endereço gerado do endereço do código da camada Dao

⑤Modificação especifica que uma tabela correspondente à adição, exclusão, modificação e código de consulta precisa ser gerada 

 Se quiser gerar várias tabelas de uma vez, você pode copiar várias tabelas.

Clique duas vezes no plug-in que baixamos para executar o código gerado

 Neste ponto o código é gerado

4. Combinando Mybatis para gerar código para completar adições, exclusões, modificações e consultas

①Crie um pacote utilitário e uma 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();
    }
}

Pontas:

  • A função desta classe de ferramenta é criar e gerenciar o objeto SqlSession do MyBatis. Ele inicializa um SqlSessionFactory lendo o arquivo de configuração mybatis.cfg.xml e, em seguida, usa essa fábrica para criar um SqlSession. O objeto SqlSession é usado para realizar operações de banco de dados como consulta, inserção, atualização e exclusão.
  • No método openSession(), primeiro verifique se o thread atual já possui um objeto SqlSession, caso contrário, crie um novo SqlSession e configure-o para o thread atual. Se já existir um objeto SqlSession, basta retornar esse objeto diretamente.
  • No método main(), chame o método openSession() para obter um objeto SqlSession, imprima as informações de conexão desse objeto e, finalmente, feche o objeto SqlSession.

②Crie a camada de negócios e a interface do BookBiz (basta copiar aquela gerada pelo mapeador)

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);
}

③Criar camada impl e implementar BookBiz com 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);
    }
}

Nota: Os métodos set e get do bookMapper precisam ser fornecidos

④ teste

As tags Junit de anotação <scope>são usadas para especificar o escopo de uma dependência para indicar que a dependência é válida na compilação, teste e tempo de execução.

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));
    }

}

Duas coisas representativas são testadas aqui, uma exclui uma consulta

Foi reportado um erro durante a execução, informando que getMapper não tem valor, neste momento lembramos que como o código não havia sido gerado antes, comentamos o conteúdo do arquivo de mapeamento de configuração em <mappers> para evitar erros, e agora mudamos de volta.

Consultar resultados do teste:

 Excluir resultados de teste:

Excluímos os dados numerados 1

 O valor de retorno aqui é 1, indicando que a exclusão foi bem-sucedida, mas voltamos ao banco de dados para verificar se os dados ainda estão lá, por que isso acontece?

Como nosso Mybatis não tem a capacidade de enviar itens automaticamente, podemos escrever os itens enviados no método de teste @After

Depois de escrever, estamos testando e nossos dados são excluídos neste momento. 

 Quinto, o papel das perguntas da entrevista SQLSession

SQLSession é uma interface do framework MyBatis e sua principal função é executar instruções SQL e gerenciar transações. No MyBatis, uma instância SqlSessionFactory cria uma instância SqlSession, e cada instância SqlSession tem sua própria transação para executar operações SQL. Quando várias instâncias de SqlSession são executadas simultaneamente, elas compartilham a mesma transação, o que pode garantir a consistência dos dados.

Resumindo, a função do SQLSession é a seguinte:

  1. Executar instruções SQL;
  2.  assuntos de gestão;
  3.  Operações simultâneas são suportadas.
  4. sqlsession pode obter o objeto mapeador
  5. Usado como cache, o cache de primeiro nível, o cache que será habilitado por padrão,
  6. Por questões de desempenho, o cache de segundo nível será usado e o cache de segundo nível precisa ser habilitado manualmente

Meu compartilhamento está aqui, bem-vindo à área de comentários para discutir e comunicar! !

Se você achar útil, por favor, dê um joinha ♥ ♥

Acho que você gosta

Origin blog.csdn.net/weixin_74318097/article/details/132378387
Recomendado
Clasificación