Princípio básico de Mybatis e análise de configuração

Análise de configuração

Arquivo de configuração do núcleo

arquivo de configuração principal do sistema mybatis-config.xml

O arquivo de configuração do MyBatis contém configurações e informações de atributos que afetarão profundamente o comportamento do MyBatis.

Os conteúdos que podem ser configurados são os seguintes:

configuration(配置)
properties(属性)
settings(设置)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境配置)
environment(环境变量)
transactionManager(事务管理器)
dataSource(数据源)
databaseIdProvider(数据库厂商标识)
mappers(映射器)
<!-- 注意元素节点的顺序!顺序不对会报错 -->

Podemos ler o arquivo de cabeçalho dtd acima mybatis-config.xml!

elemento de ambientes

<environments default="development">
 <environment id="development">
   <transactionManager type="JDBC">
     <property name="..." value="..."/>
   </transactionManager>
   <dataSource type="POOLED">
     <property name="driver" value="${driver}"/>
     <property name="url" value="${url}"/>
     <property name="username" value="${username}"/>
     <property name="password" value="${password}"/>
   </dataSource>
 </environment>
</environments>

Configure vários conjuntos de ambientes operacionais MyBatis, mapeie SQL para vários bancos de dados diferentes, e um deles deve ser designado como o ambiente operacional padrão (especificado por padrão)

Nó do elemento filho: ambiente

O elemento dataSource usa a interface de origem de dados JDBC padrão para configurar os recursos do objeto de conexão JDBC.

A fonte de dados deve ser configurada.

Existem três tipos de fonte de dados integrados

type="[UNPOOLED|POOLED|JNDI]")
  1. unpooled: A implementação desta fonte de dados apenas abre e fecha a conexão cada vez que é solicitada.

  2. Pooled: a realização desta fonte de dados usa o conceito de "pooling" para organizar objetos de conexão JDBC, que é um método de processamento popular que permite que aplicativos da Web simultâneos respondam rapidamente às solicitações.

  3. jndi: esta fonte de dados é implementada para ser usada em contêineres como Spring ou servidores de aplicativos.O contêiner pode configurar a fonte de dados central ou externamente e, em seguida, colocar uma referência ao contexto JNDI.

Existem também muitas implementações de fontes de dados de terceiros, como dbcp, c3p0, druid, etc ...

Nenhum tipo de gerenciador de transações requer a definição de qualquer propriedade.

Um conjunto específico de ambientes pode ser distinguido definindo o id, e o id é garantido como único!

Nó do elemento filho: transactionManager- [Gerenciador de transações]

<!-- 语法 -->
<transactionManager type="[ JDBC | MANAGED ]"/>

Nó do elemento filho: fonte de dados (dataSource)

elemento mappers

mapeadores
mapeador: define o arquivo de instrução SQL de mapeamento

Agora que os outros elementos do comportamento de MyBatis foram configurados, vamos agora definir a instrução de mapeamento SQL. Mas primeiro precisamos dizer ao MyBatis onde encontrar essas frases.

Java não fornece uma boa maneira de encontrar isso automaticamente, então a melhor maneira é dizer ao MyBatis onde encontrar o arquivo de mapeamento. Você pode usar referências de recursos relativas ao caminho de classe ou localizadores de recursos totalmente qualificados (incluindo file: /// URLs) ou nomes de classes e pacotes, etc.

O mapeador é um dos principais componentes do MyBatis, antes do MyBatis 3, apenas o mapeador xml era suportado, ou seja, todas as instruções SQL devem ser configuradas no arquivo xml. A partir de MyBatis 3, também são suportados mapeadores de interface Este método mapper permite anotar e definir instruções SQL em código Java, que é muito conciso.

Apresentando recursos

<!-- 使用相对于类路径的资源引用 -->
<mappers>
 <mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>
<!-- 使用完全限定资源定位符(URL) -->
<mappers>
 <mapper url="file:///var/mappers/AuthorMapper.xml"/>
</mappers>
<!--
使用映射器接口实现类的完全限定类名
需要配置文件名称和接口名称一致,并且位于同一目录下
-->
<mappers>
 <mapper class="org.mybatis.builder.AuthorMapper"/>
</mappers>
<!--
将包内的映射器接口实现全部注册为映射器
但是需要配置文件名称和接口名称一致,并且位于同一目录下
-->
<mappers>
 <package name="org.mybatis.builder"/>
</mappers>

Arquivo mapeador

<?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.kuang.mapper.UserMapper">
   
</mapper>

Namespace chinês significa: namespace, a função é a seguinte:

O nome do namespace deve ser o mesmo de uma interface

O método na interface deve corresponder ao id da instrução sql no arquivo de mapeamento um a um

O ID do namespace e do elemento filho são garantidos em conjunto como únicos, distinguindo diferentes mapeadores

Interface DAO Bind

regras de nomenclatura de namespace: nome do pacote + nome da classe

O verdadeiro poder do MyBatis reside em sua declaração de mapeamento, que é sua magia. Por causa de seu poder excepcional, o arquivo XML do mapeador é relativamente simples. Se você compará-lo com o código JDBC com a mesma função, você descobrirá imediatamente que quase 95% do código é salvo.

Otimização de propriedades

Essas propriedades do banco de dados são configuráveis ​​externamente e substituíveis dinamicamente, podendo ser configuradas em um arquivo de propriedades Java típico ou passadas pelos subelementos do elemento properties.

1. Crie um novo db.properties no diretório de recursos

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=utf8
username=root
password=123456

2. Importe o arquivo para o arquivo de configuração de propriedades

<configuration>
   <!--导入properties文件-->
   <properties resource="db.properties"/>

   <environments default="development">
       <environment id="development">
           <transactionManager type="JDBC"/>
           <dataSource type="POOLED">
               <property name="driver" value="${driver}"/>
               <property name="url" value="${url}"/>
               <property name="username" value="${username}"/>
               <property name="password" value="${password}"/>
           </dataSource>
       </environment>
   </environments>
   <mappers>
       <mapper resource="mapper/UserMapper.xml"/>
   </mappers>
</configuration>

Problemas de prioridade do arquivo de configuração

Novo recurso: use marcadores de posição

otimização de typeAliases

O alias de tipo é para definir um nome abreviado para o tipo Java. Ele está relacionado apenas à configuração XML e seu significado é apenas para reduzir a redundância do nome totalmente qualificado da classe.

<!--配置别名,注意顺序-->
<typeAliases>
   <typeAlias type="com.kuang.pojo.User" alias="User"/>
</typeAliases>

Quando configurado dessa forma, User pode ser usado onde quer que com.kuang.pojo.User seja usado.

Você também pode especificar um nome de pacote, MyBatis pesquisará o Java Bean necessário sob o nome do pacote, como:

<typeAliases>
   <package name="com.kuang.pojo"/>
</typeAliases>

Cada Java Bean no pacote com.kuang.pojo, sem anotações, usará o nome não qualificado da primeira letra do Bean e minúsculas como seu alias.

Se houver uma anotação, o alias é o valor da anotação. Veja o exemplo abaixo:

@Alias("user")
public class User {
    
    
  ...
}

Ciclo de vida e escopo

Escopo e ciclo de vida

É importante entender os diferentes escopos e classes de ciclo de vida que discutimos até agora, porque o uso incorreto pode levar a problemas de simultaneidade muito sérios.

Insira a descrição da imagem aqui
Compreensão do escopo

  • A função de SqlSessionFactoryBuilder é criar SqlSessionFactory. Após a criação ser bem-sucedida, SqlSessionFactoryBuilder perde sua função, portanto, só pode existir no método de criação de SqlSessionFactory, em vez de permitir que exista por muito tempo. Portanto, o melhor escopo da instância SqlSessionFactoryBuilder é o escopo do método (ou seja, a variável do método local).

  • SqlSessionFactory pode ser considerado um conjunto de conexões de banco de dados e sua função é criar objetos de interface SqlSession. Como a essência do MyBatis é a operação Java do banco de dados, o ciclo de vida de SqlSessionFactory existe em todo o aplicativo MyBatis, então, uma vez que o SqlSessionFactory é criado, deve ser armazenado por um longo tempo até que o aplicativo MyBatis não seja mais usado. pode ser considerado como a vida de SqlSessionFactory O ciclo é equivalente ao ciclo de aplicação de MyBatis.

  • Como SqlSessionFactory é um pool de conexão com o banco de dados, ele ocupa os recursos de conexão do banco de dados. Se você criar vários SqlSessionFactory, haverá vários pools de conexão de banco de dados, o que não é propício para o controle de recursos de banco de dados, também fará com que os recursos de conexão de banco de dados sejam consumidos, tempo de inatividade do sistema, etc., então tente evitar tal situação .

  • Portanto, em aplicativos gerais, geralmente queremos SqlSessionFactory como um singleton , para que possa ser compartilhado no aplicativo. Portanto, o melhor escopo de SqlSessionFactory é o escopo do aplicativo.

  • Se SqlSessionFactory for equivalente a um pool de conexão de banco de dados, então SqlSession será equivalente a uma conexão de banco de dados (objeto Connection). Você pode executar vários SQLs em uma transação e, em seguida, enviar ou reverter a transação por meio de sua confirmação, reversão e outros métodos. Portanto, ele deve residir em uma solicitação de negócios. Após processar a solicitação completa, a conexão deve ser fechada e retornada para SqlSessionFactory, caso contrário, os recursos do banco de dados serão consumidos rapidamente e o sistema ficará paralisado, então tente ... pegar ... finalmente … Declaração para garantir que fecha corretamente.

  • Portanto, o melhor escopo de SqlSession é o escopo de solicitação ou método.

Insira a descrição da imagem aqui

Acho que você gosta

Origin blog.csdn.net/david2000999/article/details/115106618
Recomendado
Clasificación