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:
Selecione Projeto Maven em Maven e clique em Avançar;
Selecione Criar um projeto simples (ignorar a seleção de arquétipo) e clique em Avançar (criar um projeto simples);
Após concluir as operações acima, aguarde um momento e você obterá um projeto Maven com a seguinte estrutura;
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:
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:
Diretório do blog da série: diretório do blog MyBatis do zero
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/