Configuración de entrada de MyBatis e implementación de CURD

Tabla de contenido

1. Introducción a MyBatis

1. ¿Qué es MyBatis? 

2. Características de MyBatis

3. ¿Qué es el marco de la capa de persistencia?

Dos, configuración del entorno MyBatis

2.1 Crear proyecto maven

2.2 Importar dependencias pom relacionadas

2.3 Importar archivo de configuración jdbc

2.4 Instalación de complementos relacionados con Mybatis

3.5 Configuración principal de Mybatis-cfg.xml

2.6 Presentación de archivos de registro Log4j2

2.7 generador de código de configuración generadorConfig.xml

3. MyBatis implementa adición, eliminación, modificación y consulta

3.1 MyBatis genera código automáticamente

3.2 Interpretación de los archivos y métodos de configuración generados

3.3 Escriba la capa de lógica empresarial para implementar la interfaz.

3.4 Escribir clase de fábrica

3.5 Pruebas de redacción de pruebas de clase


1. Introducción a MyBatis

1. ¿Qué es MyBatis? 

        MyBatis es un marco de capa de persistencia Java de código abierto que admite SQL personalizado, procedimientos almacenados y mapeo avanzado. MyBatis elimina casi todo el código JDBC y el trabajo de configurar parámetros y obtener conjuntos de resultados. MyBatis puede configurar y mapear tipos primitivos, interfaces y POJO de Java (objetos Java antiguos simples, objetos Java antiguos simples) como registros en la base de datos a través de XML simples o anotaciones.

2. Características de MyBatis

  1. Facilidad de uso: MyBatis utiliza XML simple o configuraciones de anotaciones para mapear objetos Java y declaraciones SQL, lo que facilita a los desarrolladores escribir y mantener códigos de acceso a bases de datos.

  2. Flexibilidad: MyBatis permite a los desarrolladores escribir declaraciones SQL personalizadas, que pueden manejar de manera flexible operaciones complejas de bases de datos. También admite SQL dinámico, que puede generar diferentes declaraciones SQL según diferentes condiciones.

  3. Alto rendimiento: MyBatis utiliza algunas técnicas de optimización, como declaraciones SQL precompiladas, almacenamiento en caché, etc., para mejorar el rendimiento del acceso a la base de datos.

  4. Fácil de integrar: MyBatis se puede integrar perfectamente con varios marcos Java populares (como Spring), lo que facilita a los desarrolladores el uso de MyBatis para operaciones de bases de datos.

        La función principal de MyBatis es simplificar la interacción entre aplicaciones Java y bases de datos relacionales. Al utilizar MyBatis, los desarrolladores pueden agregar, eliminar, modificar y consultar la base de datos mediante una configuración y escritura simples de declaraciones SQL. Al mismo tiempo, MyBatis también proporciona algunas funciones avanzadas, como consultas de paginación, operaciones por lotes, etc., lo que hace que el acceso a la base de datos sea más flexible y eficiente. En resumen, MyBatis es un marco de capa de persistencia potente y fácil de usar que se utiliza ampliamente en el desarrollo de Java.

3. ¿Qué es el marco de la capa de persistencia?

        El marco de la capa de persistencia es un marco de software que se utiliza para simplificar la interacción entre el programa de aplicación y la base de datos y la operación de persistencia de datos. En el desarrollo de software, las aplicaciones normalmente necesitan interactuar con bases de datos, incluidas operaciones como leer, escribir, actualizar y eliminar datos. El objetivo principal del marco de la capa de persistencia es proporcionar una forma simple, eficiente y fácil de mantener para manejar estas operaciones de bases de datos.

        Los métodos tradicionales de operación de bases de datos generalmente requieren que los desarrolladores escriban manualmente declaraciones SQL y manejen detalles como las conexiones de bases de datos y la gestión de transacciones. Hay algunos problemas de esta manera, como redundancia de código, propensión a errores, dificultad de mantenimiento, etc. La aparición del marco de la capa de persistencia resuelve estos problemas: proporciona una capa de abstracción que encapsula las operaciones de la base de datos, lo que permite a los desarrolladores realizar operaciones de la base de datos a través de llamadas API simples sin prestar atención a los detalles de la base de datos subyacente.

Los marcos de la capa de persistencia suelen proporcionar las siguientes funciones:

  1. Mapeo relacional de objetos (ORM): el marco de la capa de persistencia puede establecer una relación de mapeo entre las tablas de la base de datos y los objetos Java, de modo que los desarrolladores puedan operar en la base de datos manipulando objetos Java sin escribir declaraciones SQL directamente.

  2. Gestión de conexiones de bases de datos: el marco de la capa de persistencia es responsable de gestionar la creación y liberación de conexiones de bases de datos y la gestión de grupos de conexiones para mejorar el rendimiento y la eficiencia del acceso a las bases de datos.

  3. Gestión de transacciones: el marco de la capa de persistencia puede proporcionar funciones de gestión de transacciones para garantizar la coherencia e integridad de las operaciones de la base de datos.

  4. Gestión de caché: el marco de la capa de persistencia puede proporcionar un mecanismo de almacenamiento en caché para almacenar en caché los datos a los que se accede con frecuencia en la memoria para mejorar el rendimiento de lectura de datos.

        El uso del marco de la capa de persistencia puede simplificar el volumen de código de las operaciones de la base de datos, mejorar la eficiencia del desarrollo, reducir la dificultad del desarrollo y proporcionar algunas características avanzadas, como carga diferida, consulta de paginación, operaciones por lotes, etc., haciendo que las operaciones de la base de datos sean más flexibles y eficiente. Los marcos de capa de persistencia comunes incluyen Hibernate, MyBatis, etc.

Dos, configuración del entorno MyBatis

2.1 Crear proyecto maven

Estoy usando la versión idea2023 y la forma en que otras versiones crean Maven será diferente, solo como referencia:

2.2 Importar dependencias pom relacionadas

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.example</groupId>
  <artifactId>mybatis_01</artifactId>
  <packaging>war</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>mybatis_01 Maven Webapp</name>
  <url>http://maven.apache.org</url>

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

    <!-- **********************  日志配置  ********************** -->
    <!--核心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>

  <build>
    <finalName>mybatis_01</finalName>
    <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>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.7.0</version>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
          <encoding>UTF-8</encoding>
        </configuration>
      </plugin>
      <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>
    </plugins>

  </build>
</project>

2.3 Importar archivo de configuración jdbc

La versión mysql8.0 que uso necesita cambiar el contenido del archivo de configuración de acuerdo con sus propios requisitos de configuración.

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

2.4 Instalación de complementos relacionados con Mybatis

Las principales funciones del complemento Mybatis son:

  1. Proporcionar interfaz Mapper y navegación correspondiente a SQL en el archivo de configuración

  2. Autocompletado al editar archivos XML

  3. Según la interfaz de Mapper, use teclas de método abreviado para generar archivos xml y etiquetas SQL

  4. Las propiedades en ResultMap admiten la finalización automática y el uso en cascada (propiedad A. propiedad B. propiedad C)

  5. Las teclas de método abreviado generan anotaciones @Param

  6. Al editar SQL en XML, los corchetes se completan automáticamente

  7. Al editar SQL en XML, admite el autocompletado de parámetros (identifica los parámetros según la anotación @Param)

  8. Verifique automáticamente si hay conflictos de ID en archivos XML de Mapper

  9. Verifique automáticamente si hay valores de atributos incorrectos en archivos XML de Mapper

  10. Soporte Buscar uso

  11. Soporte para refactorizar desde nombrado

  12. alias de soporte

  13. Generar automáticamente propiedades de ResultMap

  14. Teclas de acceso directo: Opción + Intro (Mac) | Alt + Intro (Windows)

3.5 Configuración principal de Mybatis-cfg.xml

Los archivos de configuración de MyBatis contienen configuraciones de comportamiento e información de propiedades de MyBatis. La estructura de nivel superior del documento de configuración es la siguiente:

  • configuración
  • propiedades
  • ajustes
  • typeAliases (tipo alias)
  • typeHandlers (controladores de tipos)
  • objectFactory (fábrica de objetos)
  • complementos
  • entornos (configuración del entorno)
    • entorno (variable de entorno)
      • transactionManager (administrador de transacciones)
      • fuente de datos (fuente de datos)
  • DatabaseIdProvider (ID del proveedor de la base de datos)
  • mapeadores
<?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/ycxw/mapper/BookMapper.xml"/>
    </mappers>
</configuration>

2.6 Presentación de archivos de registro Log4j2

  • Log4j es un proyecto de código abierto de Apache . Al usar Log4j, podemos controlar el destino de la transmisión de información de registro para que sea la consola , el archivo, el componente GUI o incluso el servidor de socket , el registrador de eventos NT, el demonio Syslog de UNIX , etc.
  • log4j puede controlar el formato de salida de cada registro
  • log4j se puede configurar de manera flexible a través de un archivo de configuración sin modificar el código de la aplicación.
<?xml version="1.0" encoding="UTF-8"?>

<!-- status : 指定log4j本身的打印日志的级别.ALL< Trace < DEBUG < INFO < WARN < ERROR 
	< FATAL < OFF。 monitorInterval : 用于指定log4j自动重新配置的监测间隔时间,单位是s,最小是5s. -->
<Configuration status="WARN" monitorInterval="30">
	<Properties>
		<!-- 配置日志文件输出目录 ${sys:user.home} -->
		<Property name="LOG_HOME">/root/workspace/lucenedemo/logs</Property>
		<property name="ERROR_LOG_FILE_NAME">/root/workspace/lucenedemo/logs/error</property>
		<property name="WARN_LOG_FILE_NAME">/root/workspace/lucenedemo/logs/warn</property>
		<property name="PATTERN">%d{yyyy-MM-dd HH:mm:ss.SSS} [%t-%L] %-5level %logger{36} - %msg%n</property>
	</Properties>

	<Appenders>
		<!--这个输出控制台的配置 -->
		<Console name="Console" target="SYSTEM_OUT">
			<!-- 控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) -->
			<ThresholdFilter level="trace" onMatch="ACCEPT"
				onMismatch="DENY" />
			<!-- 输出日志的格式 -->
			<!-- %d{yyyy-MM-dd HH:mm:ss, SSS} : 日志生产时间 %p : 日志输出格式 %c : logger的名称 
				%m : 日志内容,即 logger.info("message") %n : 换行符 %C : Java类名 %L : 日志输出所在行数 %M 
				: 日志输出所在方法名 hostName : 本地机器名 hostAddress : 本地ip地址 -->
			<PatternLayout pattern="${PATTERN}" />
		</Console>

		<!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,这个也挺有用的,适合临时测试用 -->
		<!--append为TRUE表示消息增加到指定文件中,false表示消息覆盖指定的文件内容,默认值是true -->
		<File name="log" fileName="logs/test.log" append="false">
			<PatternLayout
				pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
		</File>
		<!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size, 则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档 -->
		<RollingFile name="RollingFileInfo" fileName="${LOG_HOME}/info.log"
			filePattern="${LOG_HOME}/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log">
			<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) -->
			<ThresholdFilter level="info" onMatch="ACCEPT"
				onMismatch="DENY" />
			<PatternLayout
				pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
			<Policies>
				<!-- 基于时间的滚动策略,interval属性用来指定多久滚动一次,默认是1 hour。 modulate=true用来调整时间:比如现在是早上3am,interval是4,那么第一次滚动是在4am,接着是8am,12am...而不是7am. -->
				<!-- 关键点在于 filePattern后的日期格式,以及TimeBasedTriggeringPolicy的interval, 日期格式精确到哪一位,interval也精确到哪一个单位 -->
				<!-- log4j2的按天分日志文件 : info-%d{yyyy-MM-dd}-%i.log -->
				<TimeBasedTriggeringPolicy interval="1"
					modulate="true" />
				<!-- SizeBasedTriggeringPolicy:Policies子节点, 基于指定文件大小的滚动策略,size属性用来定义每个日志文件的大小. -->
				<!-- <SizeBasedTriggeringPolicy size="2 kB" /> -->
			</Policies>
		</RollingFile>

		<RollingFile name="RollingFileWarn" fileName="${WARN_LOG_FILE_NAME}/warn.log"
			filePattern="${WARN_LOG_FILE_NAME}/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log">
			<ThresholdFilter level="warn" onMatch="ACCEPT"
				onMismatch="DENY" />
			<PatternLayout
				pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
			<Policies>
				<TimeBasedTriggeringPolicy />
				<SizeBasedTriggeringPolicy size="2 kB" />
			</Policies>
			<!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了20 -->
			<DefaultRolloverStrategy max="20" />
		</RollingFile>

		<RollingFile name="RollingFileError" fileName="${ERROR_LOG_FILE_NAME}/error.log"
			filePattern="${ERROR_LOG_FILE_NAME}/$${date:yyyy-MM}/error-%d{yyyy-MM-dd-HH-mm}-%i.log">
			<ThresholdFilter level="error" onMatch="ACCEPT"
				onMismatch="DENY" />
			<PatternLayout
				pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
			<Policies>
				<!-- log4j2的按分钟 分日志文件 : warn-%d{yyyy-MM-dd-HH-mm}-%i.log -->
				<TimeBasedTriggeringPolicy interval="1"
					modulate="true" />
				<!-- <SizeBasedTriggeringPolicy size="10 MB" /> -->
			</Policies>
		</RollingFile>

	</Appenders>

	<!--然后定义logger,只有定义了logger并引入的appender,appender才会生效 -->
	<Loggers>
		<!--过滤掉spring和mybatis的一些无用的DEBUG信息 -->
		<logger name="org.springframework" level="INFO"></logger>
		<logger name="org.mybatis" level="INFO"></logger>

		<!-- 第三方日志系统 -->
		<logger name="org.springframework" level="ERROR" />
		<logger name="org.hibernate" level="ERROR" />
		<logger name="org.apache.struts2" level="ERROR" />
		<logger name="com.opensymphony.xwork2" level="ERROR" />
		<logger name="org.jboss" level="ERROR" />


		<!-- 配置日志的根节点 -->
		<root level="all">
			<appender-ref ref="Console" />
			<appender-ref ref="RollingFileInfo" />
			<appender-ref ref="RollingFileWarn" />
			<appender-ref ref="RollingFileError" />
		</root>

	</Loggers>

</Configuration>

2.7 generador de código de configuración generadorConfig.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:\\Tools\\MavenHouse\\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.ycxw.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.ycxw.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.ycxw.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>

Aviso:

1. Modifique la ubicación del paquete jar del controlador jdbc en la ruta local 

<!--Especifique la ubicación del paquete jar del controlador jdbc de la base de datos--> 
<classPathEntry ubicación=" D:\\Tools\\MavenHouse\\mvn_repository\\mysql\\mysql-connector-java\\5.1.44 \\ mysql-conector-java-5.1.44.jar"/>

2. Modifique la ubicación donde se genera el javaBean especificado

<javaModelGenerator targetPackage=" com.ycxw.model " 
                    targetProject="src/main/java"> 
        ...... 
</javaModelGenerator>

3. Modifique la ubicación donde se genera el archivo de mapeo sql especificado

<sqlMapGenerator targetPackage=" com.ycxw.mapper " 
                 targetProject="src/main/java"> 
        ...... 
</sqlMapGenerator>

 4. Modifique la ubicación del archivo de interfaz del asignador generado especificado

<javaClientGenerator targetPackage=" com.ycxw.mapper " 
                     targetProject="src/main/java" type="XMLMAPPER"> 
        ...... 
</javaClientGenerator>

5. Modifique el nombre de la tabla de la base de datos a la que se debe hacer referencia.

<table esquema="" tableName=" t_mvc_Book " domainObjectName="Libro" 
       enableCountByExample="false" enableDeleteByExample="false" 
       enableSelectByExample="false" enableUpdateByExample="false"> 
        ...... 
</table>

3. MyBatis implementa adición, eliminación, modificación y consulta

3.1 MyBatis genera código automáticamente

1. Busque el complemento MyBatis configurado e inicie mybatis-general

2. Luego generará la carpeta de configuración de la entidad y la interfaz e implementación CRUD:

3.2 Interpretación de los archivos y métodos de configuración generados

  • ​ id: el nombre del método en la interfaz correspondiente
  • ​ resultType: el tipo de valor de retorno de la ejecución de la instrucción SQL
  • ​ tipo de parámetro: tipo de parámetro

3.3 Escriba la capa de lógica empresarial para implementar la interfaz.

1. Escriba la clase de interfaz BookBiz

package com.ycxw.biz;

import com.ycxw.model.Book;

/**
 * @author 云村小威
 * @site blog.csdn.net/Justw320
 * @create 2023-08-20 17:52
 */
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);
}

2. Escriba la clase de implementación de la interfaz BookBizImpl.

package com.ycxw.biz.impl;

import com.ycxw.biz.BookBiz;
import com.ycxw.mapper.BookMapper;
import com.ycxw.model.Book;

/**
 * @author 云村小威
 * @site blog.csdn.net/Justw320
 * @create 2023-08-20 17:52
 */
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);
    }
}

3.4 Escribir clase de fábrica

        Esta clase es principalmente para implementar una clase de herramienta de administración MyBatis SqlSession simple. El objeto SqlSession del hilo actual se puede obtener a través del método openSession (), que es conveniente para las operaciones de la base de datos.

package com.ycxw.utils;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

/**
 * 工厂类
 * @author 云村小威
 * @site blog.csdn.net/Justw320
 * @create 2023-08-20 17:58
 */
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();
//        System.out.println(session.getConnection());
    }

}

3.5 Pruebas de redacción de pruebas de clase

package com.ycxw.demo;

import com.ycxw.biz.BookBiz;
import com.ycxw.biz.impl.BookBizImpl;
import com.ycxw.mapper.BookMapper;
import com.ycxw.model.Book;
import com.ycxw.utils.SessionUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

/**
 * @author 云村小威
 * @site blog.csdn.net/Justw320
 * @create 2023-08-20 18:05
 */
public class CURDTest {
    private BookBiz bookBiz;
    private SqlSession sqlSession;

    @Before
    public void before(){
        System.out.println("执行测试方法之前会执行的初始化代码块方法");
        //获取一个数据库会话对象,并将其赋值给sqlSession变量
        this.sqlSession = SessionUtil.openSession();
        //实例化业务逻辑层
        BookBizImpl book = new BookBizImpl();
        //获取接口实例
        BookMapper mapper = this.sqlSession.getMapper(BookMapper.class);
        book.setBookMapper(mapper);
        //最后赋值给bookBiz接口,便于对数据库进行增删改查操作
        this.bookBiz = book;
    }
    @After
    public void after(){
        System.out.println("执行测试方法之后的后执行的方法");
        //提交事务
        this.sqlSession.commit();
    }

    @Test
    public void text1(){
        System.out.println("测试查询方法方法..");
        Book book = bookBiz.selectByPrimaryKey(25);
        System.out.println(book);
    }
    @Test
    public void text2(){
        System.out.println("测试新增方法");
        int insert = bookBiz.insert(new Book(1,"Mybatis宝典",9.9f));
        System.out.println("所影响的行数"+insert);
    }
}

Ejecute la prueba: 

 Verificación de la base de datos:

Supongo que te gusta

Origin blog.csdn.net/Justw320/article/details/132392672
Recomendado
Clasificación