MyBatis desde cero: introducción a MyBatis

1. Empezando con MyBatis

1.1 Introducción a MyBatis

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

1.2 Crear un proyecto Maven

Abra Archivo-> Nuevo-> Otro en Eclipse para abrir y crear el proyecto como se muestra a continuación:
Inserte la descripción de la imagen aquí

Seleccione Proyecto Maven en Maven y haga clic en Siguiente;
Inserte la descripción de la imagen aquí

Seleccione Crear un proyecto simple (omitir la selección de arquetipos) y haga clic en Siguiente (crear un proyecto simple);
Inserte la descripción de la imagen aquí

Después de completar las operaciones anteriores, espere un momento y obtendrá un proyecto Maven con la siguiente estructura;
Inserte la descripción de la imagen aquí

Abra el archivo pom.xml, elimine el contenido redundante y agregue la información específica de dependencia necesaria de la siguiente manera:

<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/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>com.xiangty</groupId>
	<artifactId>learn-MyBatis</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>learn-MyBatis</name>
	<description>learn-MyBatis</description>
	
	<properties>
		<!-- 设置源码编译码方式UTF-8 -->
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<java.version>1.8</java.version>
	</properties>
	
	<dependencies>
		<!-- 单元测试 -->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.12</version>
			<scope>test</scope>
		</dependency>

		<!-- MyBatis核心依赖 -->
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis</artifactId>
			<version>3.3.1</version>
		</dependency>

		<!-- MySQL数据库 -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>5.1.38</version>
		</dependency>
		
		<!-- 日志相关 -->
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
			<version>1.7.12</version>
		</dependency>
		
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-log4j12</artifactId>
			<version>1.7.12</version>
		</dependency>
		
		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>1.2.17</version>
		</dependency>
	</dependencies>
	
	<build>
		<plugins>
		<!-- 设置编译源代码的JDK版本,为了增大兼容范围,这里指定JDK版本1.8 -->
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<configuration>
					<source>1.8</source>
					<target>1.8</target>
				</configuration>
			</plugin>
		</plugins>
	</build>
    
</project>

Después de configurar pom.xml, seleccione el proyecto, haga clic con el botón derecho y seleccione Actualizar proyecto en Maven para actualizar el paquete jar dependiente externamente configurado en la estructura pom.xml.

1.3 La configuración simple hace que MyBatis se ejecute

1.3.1 Preparar la base de datos

DROP TABLE IF EXISTS `info`;
CREATE TABLE `info` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(40) DEFAULT NULL,
  `password` varchar(40) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COMMENT='信息表';

---------------------------------
INSERT INTO `info` VALUES ('1', 'admin', 'admin');
INSERT INTO `info` VALUES ('2', '路人甲', '123456');
INSERT INTO `info` VALUES ('3', '炮兵乙', '111111');

1.3.2 Configurar MyBatis

Utilice XML para la configuración, cree los archivos de configuración db.properties (información de la base de datos de configuración) y mybatis-config.xml en src / main / resources;

Información de db.properties:

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test
jdbc.username=root
jdbc.password=123456

Información de mybatis-config.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>

	<!-- db.properties与src/main/resources下的db.properties对应 -->
	<properties resource="db.properties"></properties>

	<settings>
		<!-- 输出LOG4J日志 -->
		<setting name="logImpl" value="LOG4J"></setting>
		<!-- 驼峰命名 -->
		<setting name="mapUnderscoreToCamelCase" value="true"></setting>
	</settings>

	<!-- 
		typeAliase配置放在xml的靠前的位置,在mybatis-config.xml文件中配置之后, 在mapper.xml文件中resultType可以只写类名 
		例: 没配置的时候,需要写成 resultType="com.xiangty.bean.Info" 配置之后,可以简写成resultType="Info"
	-->
<!-- 
	<typeAliases>
		<package name="com.xiangty.bean"></package>
	</typeAliases>
 -->	
 
 	<!-- 此处 <environment>标签可以配置多个,default="environment",是默认优先加载id="environment" -->
	<environments default="development">
		<environment id="development">
			<transactionManager type="JDBC" />
			<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>
	
	<!-- 
		映射器
		官方提供有四种方式:参考网址  "http://www.mybatis.org/mybatis-3/zh/configuration.html"
		1.使用相对于类路径的资源引用
		2.使用完全限定资源定位符(URL)
		3.使用映射器接口实现类的完全限定类名
		4.将包内的映射器接口实现全部注册为映射器
		此处用的是第一种
	-->
	<mappers>
        <!-- 此处mapper配置,是使用mapper的配置实例-->
		<mapper resource="com/xiangty/mapper/InfoMapper.xml" />
        <!-- 实际开发中xml太多,使用mapper配置的话路径太多了,可以使用package这种简洁配置 -->
		<package name="com.xiangty.mapper"/>
	</mappers>
	
</configuration>

1.3.3 Crear clase de entidad y archivo Mapper.xml

MyBatis es un marco de mapeo relacional de objetos. La clase de entidad creada aquí es en realidad un objeto de valor de datos. En aplicaciones prácticas, una tabla generalmente corresponde a una entidad para INSERT, UPDATE, DELETE y SELECT simple.

Cree el paquete com.xiangty.bean en src / main / java y cree la clase de entidad Info.java según la información de la tabla de la base de datos. El código es el siguiente:

public class Info {
    
    
	private Integer id;
	private String username;
	private String password;

	public Info(){
    
    }
	
	public Integer getId() {
    
    
		return id;
	}
	public void setId(Integer id) {
    
    
		this.id = id;
	}
	public String getUsername() {
    
    
		return username;
	}
	public void setUsername(String username) {
    
    
		this.username = username;
	}
	public String getPassword() {
    
    
		return password;
	}
	public void setPassword(String password) {
    
    
		this.password = password;
	}
	
	@Override
	public String toString() {
    
    
		return "Info [id=" + id + ", username=" + username + ", password=" + password + "]";
	}
	
	/*
	 * 参照阿里的开发规范,集合处理
	 * 关于 hashCode 和 equals 的处理,遵循如下规则:
	 * 1) 只要重写 equals ,就必须重写 hashCode 。
	 * 2) 因为 Set存储的是不重复的对象,依据 hashCode 和 equals 进行判断,所以 Set 存储的
	 * 对象必须重写这两个方法。
	 * 3) 如果自定义对象作为 Map 的键,那么必须重写 hashCode 和 equals 。
	 * 说明: String 重写了 hashCode 和 equals 方法,所以我们可以非常愉快地使用 String 对象作为 key 来使用。
	 */
	@Override
	public int hashCode() {
    
    
		final int prime = 31;
		int result = 1;
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		result = prime * result + ((password == null) ? 0 : password.hashCode());
		result = prime * result + ((username == null) ? 0 : username.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
    
    
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Info other = (Info) obj;
		if (id == null) {
    
    
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		if (password == null) {
    
    
			if (other.password != null)
				return false;
		} else if (!password.equals(other.password))
			return false;
		if (username == null) {
    
    
			if (other.username != null)
				return false;
		} else if (!username.equals(other.username))
			return false;
		return true;
	}
	
}

Cree un directorio com / xiangty / mapper en src / main / resources, luego cree un archivo Info.xml en este directorio y agregue el siguiente contenido:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xiangty.bean.Info">

	<!-- 
		根据id查询Info信息
		resultType的属性值简写,可以参见mybatis-config.xml文件typeAliase属性说明
		如果typeAliase属性没有做特定配置,那么这里的resultType的属性值就需要写全称
	 -->
	<select id="selectAllInfo" resultType="com.xiangty.bean.Info">
		select * from Info 
	</select>
	
</mapper>

<mapper>: el elemento raíz de XML, el espacio de nombres de atributo define el espacio de nombres del xml actual

Elemento <select>: una consulta SELECT definida.

Atributo id: define el único id de la consulta SELECT actual, el valor del atributo de este id se llamará cuando se llame en el programa;

ResultType: define el tipo de valor de retorno de la consulta actual, aquí se refiere a la clase de entidad Info.

1.3.4 Configurar Log4j para ver el proceso de la base de datos operativa MyBatis

log4j.rootLogger=ERROR, stdout

#MyBatis log config
log4j.logger.com.xiangty.mapper=TRACE

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

1.3.5 Escribir código de prueba para ejecutar MyBatis

En src / test / java, cree el paquete com.xiangty.test y escriba la clase de prueba InfoTest

import java.io.IOException;
import java.io.Reader;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.BeforeClass;
import org.junit.Test;

import com.xiangty.bean.Info;

public class InfoTest {
    
    

	private static SqlSessionFactory sqlSessionFactory;

	@BeforeClass // 必须配合static一起用
	public static void init() {
    
    
		try(Reader reader = Resources.getResourceAsReader("mybatis-config.xml");){
    
    
			sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
		} catch (IOException e) {
    
    			
			e.printStackTrace();
		}
	}
	
	
	@Test
	public void testSelectAll(){
    
    
		SqlSession sqlSession = sqlSessionFactory.openSession();
		try {
    
    
			List<Info> infoList = sqlSession.selectList("com.xiangty.bean.Info.selectAllInfo");
			if (infoList != null && infoList.size() > 0) {
    
    
				infoList.forEach(info -> {
    
    
					System.out.println(info);
				});
			}
		} finally {
    
    
			sqlSession.close();
		}
	}
	
}

Resultado de salida:
Inserte la descripción de la imagen aquí

El proceso de ejecución de código anterior:

Lea el archivo de configuración mybatis-config.xml en Reader a través de la clase de herramienta Recursos.

Utilice Reader para crear objetos de fábrica SqlSessionFactory a través de la clase de construcción SqlSessionFactoryBuilder. En el proceso de creación del objeto SqlSessionFactory, primero se analiza el archivo de configuración mybatis-config.xml. Después de leer la configuración del asignador en el archivo de configuración, se leerán todos los Mapper.xml para el análisis de métodos específicos. Una vez completado el análisis, el SqlSessionFactory contiene todas las propiedades de configuración e información sobre la ejecución de SQL.

SqlSession se obtiene a través de la fábrica SqlSessionFactory cuando está en uso.

Busque el método id = "selectAll" en InfoMapper.xml mediante el método selectList de SqlSession y ejecute la consulta SQL.

El JDBC utilizado por la capa inferior de MyBatis ejecuta SQL y obtiene el conjunto de resultados de la consulta ResultSet, asigna el resultado al conjunto de clases Info de acuerdo con la configuración de resultType y devuelve el resultado de la consulta.

Nota: asegúrese de cerrar sqlSession después de su uso para evitar bloqueos de la base de datos o excepciones más graves del sistema causadas por demasiadas conexiones que no están cerradas.

La estructura actual del proyecto:

[Error en la transferencia de la imagen del enlace externo. El sitio de origen puede tener un mecanismo de enlace anti-sanguijuela. Se recomienda guardar la imagen y subirla directamente (img-UvlNj4dM-1614512896816) (C: \ Users \ xiangty \ AppData \ Roaming \ Typora \ typora-user-images \ 1586444091807.png)]

Directorio de blogs de la serie: directorio de blogs MyBatis desde cero

[Error en la transferencia de la imagen del enlace externo. El sitio de origen puede tener un mecanismo de enlace anti-sanguijuela. Se recomienda guardar la imagen y subirla directamente (img-zPA06dON-1614513937815) (C: \ Users \ xiangty \ Desktop \ s8.jpg )]

Si hay algún problema en el documento, puede contactarme directamente para que pueda corregirlo y avanzar. Espero que la documentación te sea de ayuda. Dirección de GitHub del código en el documento: https://gitee.com/xiangty1/learn-MyBatis/

Supongo que te gusta

Origin blog.csdn.net/qq_33369215/article/details/114238796
Recomendado
Clasificación