MyBatis do zero - introdução ao MyBatis

1. Introdução ao MyBatis

1.1 Introdução ao MyBatis

MyBatis é uma excelente estrutura de camada de persistência, que suporta SQL customizado, procedimentos armazenados e mapeamento avançado. MyBatis elimina quase todo o código JDBC e o trabalho de definir parâmetros e obter conjuntos de resultados. MyBatis pode configurar e mapear tipos primitivos, interfaces e POJOs Java (Plain Old Java Objects) como registros no banco de dados através de XML simples ou anotações.

1.2 Criar um projeto Maven

Abra Arquivo-> Novo-> Outro no Eclipse para abrir e criar o projeto conforme mostrado abaixo:
Insira a descrição da imagem aqui

Selecione Projeto Maven em Maven e clique em Avançar;
Insira a descrição da imagem aqui

Selecione Criar um projeto simples (ignorar a seleção de arquétipo) e clique em Avançar (criar um projeto simples);
Insira a descrição da imagem aqui

Após concluir as operações acima, aguarde um momento e você obterá um projeto Maven com a seguinte estrutura;
Insira a descrição da imagem aqui

Abra o arquivo pom.xml, exclua o conteúdo redundante e adicione as informações específicas de dependência necessárias da seguinte maneira:

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

Depois de definir o pom.xml, selecione o projeto, clique com o botão direito e selecione Atualizar projeto no Maven para atualizar o pacote jar dependente externamente configurado na estrutura pom.xml.

1.3 A configuração simples faz o MyBatis funcionar

1.3.1 Prepare o banco de dados

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

Use XML para configuração, crie db.properties (informações do banco de dados de configuração) e arquivos de configuração mybatis-config.xml em src / main / resources;

Informações de db.properties:

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

Informações 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 Criar classe de entidade e arquivo Mapper.xml

MyBatis é uma estrutura de mapeamento objeto-relacional. A classe de entidade criada aqui é na verdade um objeto de valor de dados. Em aplicações práticas, uma tabela geralmente corresponde a uma entidade para INSERT, UPDATE, DELETE e SELECT simples.

Crie o pacote com.xiangty.bean em src / main / java e crie a classe de entidade Info.java com base nas informações da tabela do banco de dados. O código é o seguinte:

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

Crie um diretório com / xiangty / mapper em src / main / resources, em seguida, crie um arquivo Info.xml nesse diretório e adicione o seguinte conteúdo:

<?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>: O elemento raiz do XML, o namespace do atributo define o namespace do xml atual

Elemento <select>: uma consulta SELECT definida.

Atributo id: define o único id da consulta SELECT atual, o valor do atributo deste id será chamado quando chamado no programa;

ResultType: define o tipo de valor de retorno da consulta atual, aqui se refere à classe de entidade Info.

1.3.4 Configurar Log4j para visualizar o processo do banco de dados operacional 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 Escreva o código de teste para fazer o MyBatis funcionar

Em src / test / java, crie o pacote com.xiangty.test e escreva a classe de teste 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 saída:
Insira a descrição da imagem aqui

O processo de execução de código acima:

Leia o arquivo de configuração mybatis-config.xml no Reader por meio da classe de ferramenta Recursos.

Use o Reader para criar objetos de fábrica SqlSessionFactory por meio da classe de construção SqlSessionFactoryBuilder. No processo de criação do objeto SqlSessionFactory, o arquivo de configuração mybatis-config.xml é primeiro analisado. Depois de ler a configuração do mapeador no arquivo de configuração, todo o Mapper.xml será lido para análise do método específico. Após a análise ser concluída, o SqlSessionFactory contém todas as propriedades de configuração e informações sobre a execução de SQL.

SqlSession é obtido por meio da fábrica SqlSessionFactory quando em uso.

Encontre o método id = "selectAll" em InfoMapper.xml por meio do método selectList de SqlSession e execute a consulta SQL.

O JDBC usado pela camada inferior de MyBatis executa SQL e obtém o conjunto de resultados da consulta ResultSet, mapeia o resultado para a classe Info definida de acordo com a configuração de resultType e retorna o resultado da consulta.

Nota: Certifique-se de fechar sqlSession após o uso para evitar bloqueios de banco de dados ou exceções de sistema mais sérias causadas por muitas conexões que não são fechadas.

A estrutura atual do projeto:

[Falha na transferência da imagem do link externo. O site de origem pode ter um mecanismo de link anti-leech. É recomendável salvar a imagem e carregá-la diretamente (img-UvlNj4dM-1614512896816) (C: \ Users \ xiangty \ AppData \ Roaming \ Typora \ typora-user-images \ 1586444091807.png)]

Diretório do blog da série: diretório do blog MyBatis do zero

[Falha na transferência da imagem do link externo. O site de origem pode ter um mecanismo de link anti-leech. Recomenda-se salvar a imagem e carregá-la diretamente (img-zPA06dON-1614513937815) (C: \ Users \ xiangty \ Desktop \ s8.jpg )]

Se houver algum problema no documento, você pode entrar em contato comigo diretamente para que eu possa corrigir e fazer progressos. Espero que a documentação seja útil para você. Endereço GitHub do código no documento: https://gitee.com/xiangty1/learn-MyBatis/

Acho que você gosta

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