[Mybatis da entrada ao tutorial de combate real] Capítulo 3 Explicação Detalhada dos Arquivos de Configuração Central do Mybatis

3. Arquivo de configuração principal do Mybatis

O arquivo de configuração global mybatis-config.xml do MyBatis, o conteúdo da configuração é o seguinte:

  • propriedades

  • settings (parâmetros de configuração globais)

  • typeAliases (aliases de tipo)

  • typeHandlers (manipuladores de tipo)

  • objectFactory (fábrica de objetos)

  • plugins

  • ambientes (objeto de atributo de coleção de ambiente)

    • ambiente (objeto de subpropriedade do ambiente)

      • transactionManager (gerenciamento de transações)

      • dataSource (fonte de dados)

  • mapeadores

3.1 atributo de propriedades

    Para configurar os parâmetros de conexão do banco de dados separadamente em db.properties, você só precisa carregar os valores de propriedade de db.properties em mybatis-config.xml. Não há necessidade de codificar permanentemente os parâmetros de conexão do banco de dados em mybatis-config.xml.

# Oracle相关配置
jdbc.oracle.driver=oracle.jdbc.driver.OracleDriver
jdbc.oracle.url=jdbc:oracle:thin:@localhost:1521:orcl
jdbc.oracle.username=scott
jdbc.oracle.password=tiger

# Mysql相关配置
jdbc.mysql.driver=com.mysql.jdbc.Driver
jdbc.mysql.url=jdbc:mysql://localhost:3306/ssm?characterEncoding=utf8&useSSL=false
jdbc.mysql.username=root
jdbc.mysql.password=root

Carregue o arquivo de propriedades usando <properties>a tag :

  • resource: lê arquivos de recursos do classpath

    • O classpath é o diretório src/main/resources + o diretório src/main/java no projeto maven e o diretório compilado é target/classes;

  • url: leia os recursos do sistema de arquivos do ambiente do sistema atual

    • windows: d:/conf/test.properties

    • linux: /home/tom/conf/test.properties

<!-- 加载外部资源文件 -->
<properties resource="db.properties">
    <!--properties中还可以配置一些属性-->
    <!--<property name="mysql.url" value="jdbc:mysql://localhost:3306/ssm"/>-->
</properties>

No ambiente use:

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

Observação: MyBatis carregará as propriedades na seguinte ordem

  1. As propriedades definidas no corpo da tag de propriedades são lidas primeiro;

  2. Então a propriedade carregada por recurso ou url na tag de propriedades será lida e sobrescreverá a propriedade lida de mesmo nome;

  3. Por fim, leia o atributo passado por parameterType, que irá sobrescrever o atributo read de mesmo nome;

sugestão:

  1. Não adicione nenhum valor de atributo no corpo da tag de propriedades, apenas defina os valores de atributo no arquivo de propriedades;

  2. Deve haver alguma particularidade na definição dos nomes das propriedades no arquivo de propriedades, como: XXXXX.XXXXX.XXXX;

3.2 configurações parâmetros de configuração globais

    A estrutura MyBatis pode ajustar alguns parâmetros operacionais durante o tempo de execução, como: habilitar cache secundário, habilitar carregamento lento.

Os parâmetros configuráveis ​​são os seguintes:

configurar descrever valor efetivo Padrões
cache ativado Ative ou desative globalmente a configuração de cache para qualquer mapeador nesta configuração. verdadeiro falso verdadeiro
lazyLoadingEnabled Ative ou desative globalmente o escalonamento de latência. Quando desativado, todos serão recarregados a quente. verdadeiro falso falso
AgressividadeLazyLoading Quando habilitada, qualquer chamada de método carregará todas as propriedades do objeto. verdadeiro falso falso
multipleResultSetsEnabled Se deve permitir que uma única instrução retorne vários conjuntos de resultados (requer suporte de driver). verdadeiro falso verdadeiro
useColumnLabel Use rótulos de coluna em vez de nomes de coluna. Drivers diferentes têm desempenhos diferentes a esse respeito. Para obter detalhes, consulte a documentação do driver relevante ou teste os dois modos diferentes para observar os resultados do driver usado. verdadeiro falso verdadeiro
useGeneratedKeys Permitir que JDBC suporte a geração automática de chaves primárias requer suporte de driver. Se definido como true, essa configuração força o uso de chaves primárias geradas automaticamente, embora alguns drivers não suportem isso, mas ainda funcionem (por exemplo, Derby). verdadeiro falso falso
autoMappingBehavior Especifica como o MyBatis deve mapear automaticamente colunas para campos ou propriedades. NONE desativa o automapeamento; PARTIAL mapeia automaticamente apenas conjuntos de resultados que não definem mapeamentos de conjuntos de resultados aninhados. FULL mapeia automaticamente conjuntos de resultados arbitrariamente complexos (aninhados ou não). NENHUM, PARCIAL, COMPLETO PARCIAL
autoMappingUnknownColumnBehavior Especifica o comportamento de descoberta de colunas desconhecidas (ou tipos de atributos desconhecidos) de destinos de automapeamento. NONE: Sem resposta; AVISO: Log de lembrete de saída (o nível de log de 'AutoMappingUnknownColumnBehavior' deve ser definido como WARN); FALHA: Falha no mapeamento (gera SqlSessionException). NENHUM, AVISO, FALHA NENHUM
defaultExecutorType Configure o executor padrão. SIMPLE é um executor normal; o executor REUSE reutilizará instruções preparadas; o executor BATCH reutilizará instruções e executará atualizações em lote. SIMPLES, REUTILIZAR, LOTE SIMPLES
defaultStatementTimeout Define o tempo limite, que determina o número de segundos que o driver espera por uma resposta do banco de dados. qualquer inteiro positivo não configurado
defaultFetchSize Define um valor de dica para o tamanho de busca do conjunto de resultados do driver (fetchSize). Este parâmetro só pode ser substituído nas configurações de consulta. qualquer inteiro positivo não configurado
safeRowBoundsEnabled Permite paginação (RowBounds) em instruções aninhadas. Defina como falso se permitido. verdadeiro falso falso
safeResultHandlerEnabled Permite paginação (ResultHandler) em instruções aninhadas. Defina como falso se permitido. verdadeiro falso verdadeiro
mapUnderscoreToCamelCase Se o mapeamento camel case automático deve ser ativado, ou seja, um mapeamento semelhante do nome clássico da coluna do banco de dados A_COLUMN para o nome clássico da propriedade Java aColumn. verdadeiro falso falso
localCacheScope MyBatis usa o mecanismo de cache local (Local Cache) para evitar referências circulares (referências circulares) e acelerar consultas aninhadas repetidas. O valor padrão é SESSION, caso em que todas as consultas executadas em uma sessão são armazenadas em cache. Se o valor de configuração for STATEMENT, a sessão local será usada apenas para execução de instrução e chamadas diferentes para a mesma SqlSession não compartilharão dados. SESSÃO, DECLARAÇÃO SESSÃO
jdbcTypeForNull Especifique o tipo de JDBC para o valor nulo quando nenhum tipo de JDBC específico for fornecido para o parâmetro. Alguns drivers precisam especificar o tipo JDBC da coluna, na maioria dos casos, basta usar o tipo geral, como NULL, VARCHAR ou OTHER. Constante JdbcType, valores comuns: NULL, VARCHAR ou OTHER OUTRO
lazyLoadTriggerMethods Especifica qual método do objeto aciona um carregamento lento. lista separada por vírgulas de métodos igual,clone,hashCode,toString
defaultScriptingLanguage Especifica o idioma padrão para geração de SQL dinâmico. um alias de tipo ou nome de classe totalmente qualificado org.apache.ibatis.scripting.xmltags.XMLLanguageDriver
defaultEnumTypeHandler Especifica o TypeHandler padrão usado pelo Enum. um alias de tipo ou nome de classe totalmente qualificado org.apache.ibatis.type.EnumTypeHandler
callSettersOnNulls Especifica se o método setter (ou put) do objeto de mapa deve ser chamado quando o valor no conjunto de resultados for nulo, o que é útil ao contar com Map.keySet() ou inicialização de valor nulo. Observe que os tipos primitivos (int, boolean, etc.) não podem ser definidos como nulos. verdadeiro falso falso
returnInstanceForEmptyRow MyBatis retorna nulo por padrão quando todas as colunas da linha retornada estão vazias. Quando esta configuração estiver ativada, MyBatis retornará uma instância vazia. Observe que ele também funciona com conjuntos de resultados aninhados (como coleções ou associações). verdadeiro falso falso
logPrefix Especifica o prefixo que MyBatis adiciona aos nomes de log. qualquer string não configurado
logImpl Especifique a implementação específica do log usado pelo MyBatis e o encontrará automaticamente se não for especificado. SLF4J, LOG4J, LOG4J2, JDK_LOGGING, COMMONS_LOGGING, STDOUT_LOGGING, NO_LOGGING não configurado
proxyFactory Especifique a ferramenta de proxy usada por Mybatis para criar objetos com recursos de carregamento lento. CGLIB, JAVASSIST JAVASSIST
vfsImpl Especifica a implementação do VFS. Nomes de classe totalmente qualificados para implementações VFS personalizadas, separados por vírgulas não configurado
useActualParamName 允许使用方法签名中的名称作为语句参数名称。 为了使用该特性,你的项目必须采用 Java 8 编译,并且加上 -parameters 选项。 true, false true
configurationFactory 指定一个提供 Configuration 实例的类。 这个被返回的 Configuration 实例用来加载被反序列化对象的延迟加载属性值。 这个类必须包含一个签名为static Configuration getConfiguration() 的方法。 类型别名或者全类名 未设置

开启下划线与驼峰命名的转换:

<settings>
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>

3.3 typeAliases类型别名

    在mapper.xml中,定义很多的statement。statement需要parameterType指定输入参数的类型、需要resultType指定输出结果的映射类型。如果在指定类型时输入类型全路径,不方便进行开发,可以针对parameterType或resultType指定的类型定义一些别名,在mapper.xml中通过别名定义,方便开发。

3.3.1 MyBatis默认支持别名

别名 映射的类型 别名 映射的类型
_byte byte byte java.lang.Byte
_short short short java.lang.Short
_int int int java.lang.Integer
_integer int integer java.lang.Integer
_long long long java.lang.Long
_float float float java.lang.Float
_double double double java.lang.Double
_boolean boolean boolean java.lang.Boolean
string java.lang.String date java.util.Date
map java.util.Map hashmap java.util.HashMap
list java.util.List arraylist java.util.ArrayList
object java.lang.Object

3.3.2 自定义别名

单个定义别名:

    单个类型的别名配置:typeAlias。
        type:类型,java中类的全限定名;
        alias:别名;

<typeAliases>
    <typeAlias type="com.newcapec.entity.Dept" alias="dd"/>
</typeAliases>

批量定义别名:

    批量类型别名的配置:package。
        name:需要配置别名的类所在的包;
        设置包名之后,此包下所有的类都拥有类型别名,其别名为:该类的类名,首字母大小均可。

<typeAliases>
    <!--
        <package> 批量别名配置
        name:需要配置别名的实体类所在包的包名
        默认别名为该类的类名,其首字母大小均可
    -->
    <package name="com.newcapec.entity"/>
</typeAliases>

注解定义别名:

    在实体类上可以使用 @Alias("name") 注解来标识该类的别名。

@Alias("depart")
public class Dept {
    //...
}

注意:配置和注解仅能使用一种方式,当注解存在时,则其别名为其注解值。

3.3.3 应用

实体类:

public class Dept {

    private Integer deptno;
    private String dname;
    private String loc;

    public Integer getDeptno() {
        return deptno;
    }

    public void setDeptno(Integer deptno) {
        this.deptno = deptno;
    }

    public String getDname() {
        return dname;
    }

    public void setDname(String dname) {
        this.dname = dname;
    }

    public String getLoc() {
        return loc;
    }

    public void setLoc(String loc) {
        this.loc = loc;
    }

    @Override
    public String toString() {
        return "Dept{" +
            "deptno=" + deptno +
            ", dname='" + dname + '\'' +
            ", loc='" + loc + '\'' +
            '}';
    }
}

接口:

package com.newcapec.mapper;

import com.newcapec.entity.Dept;

import java.util.List;

public interface DeptMapper {

    List<Dept> select();

    Dept selectById(Integer deptno);

    List<Dept> selectByDname(String dname);
}

mapper文件:

<?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.newcapec.mapper.DeptMapper">

    <select id="select" resultType="dd">
        select deptno,dname,loc from dept
    </select>

    <select id="selectById" parameterType="int" resultType="dept">
        select deptno,dname,loc from dept where deptno=#{deptno}
    </select>

    <select id="selectByDname" parameterType="string" resultType="Dept">
        select deptno,dname,loc from dept where dname=#{dname}
    </select>
</mapper>

测试:

package com.newcapec;

import com.newcapec.entity.Dept;
import com.newcapec.mapper.DeptMapper;
import com.newcapec.util.MybatisUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.List;

/**
 * 别名测试
 */
public class TypeAliasTest {

    @Test
    public void testSelect() {
        SqlSession sqlSession = MybatisUtil.getSession();
        DeptMapper deptMapper = sqlSession.getMapper(DeptMapper.class);
        List<Dept> list = deptMapper.select();
        for (Dept dept : list) {
            System.out.println(dept);
        }
        sqlSession.close();
    }

    @Test
    public void testSelectById() {
        SqlSession sqlSession = MybatisUtil.getSession();
        DeptMapper deptMapper = sqlSession.getMapper(DeptMapper.class);
        Dept dept = deptMapper.selectById(10);
        System.out.println(dept);
        sqlSession.close();
    }

    @Test
    public void testSelectByDname() {
        SqlSession sqlSession = MybatisUtil.getSession();
        DeptMapper deptMapper = sqlSession.getMapper(DeptMapper.class);
        List<Dept> list = deptMapper.selectByDname("ACCOUNTING");
        System.out.println(list);
        sqlSession.close();
    }
}

3.4 typeHandlers类型处理器

    MyBatis中通过typeHandlers完成jdbc类型和Java类型的转换,MyBatis自带的类型处理器基本上满足日常需求,不需要单独定义。

MyBatis支持类型处理器:

类型处理器 Java类型 JDBC类型
BooleanTypeHandler Boolean,boolean 任何兼容的布尔值
ByteTypeHandler Byte,byte 任何兼容的数字或字节类型
ShortTypeHandler Short,short 任何兼容的数字或短整型
IntegerTypeHandler Integer,int 任何兼容的数字和整型
LongTypeHandler Long,long 任何兼容的数字或长整型
FloatTypeHandler Float,float 任何兼容的数字或单精度浮点型
DoubleTypeHandler Double,double 任何兼容的数字或双精度浮点型
BigDecimalTypeHandler BigDecimal 任何兼容的数字或十进制小数类型
StringTypeHandler String CHAR和VARCHAR类型
ClobTypeHandler String CLOB和LONGVARCHAR类型
NStringTypeHandler String NVARCHAR和NCHAR类型
NClobTypeHandler String NCLOB类型
ByteArrayTypeHandler byte[] 任何兼容的字节流类型
BlobTypeHandler byte[] BLOB和LONGVARBINARY类型
DateTypeHandler java.util.Date TIMESTAMP类型
DateOnlyTypeHandler java.util.Date DATE类型
TimeOnlyTypeHandler java.util.Date TIME类型
SqlTimestampTypeHandler java.sql.Timestamp TIMESTAMP类型
SqlDateTypeHandler java.sql.Date DATE类型
SqlTimeTypeHandler java.sql.Time TIME类型
ObjectTypeHandler 任意 其他或未指定类型
EnumTypeHandler Enumeration类型 VARCHAR-任何兼容的字符串类型,作为代码存储(而不是索引)

3.5 mappers映射器

    mappers:映射器,加载mapper文件。

3.5.1 单个加载映射文件

    单个映射文件的加载:mapper。

  • resource: 从classpath下加载mapper文件

<mappers>
    <!--
        <mapper>单个加载映射文件
        resource:通过相对路径加载文件(项目源目录下的文件)
        url:通过绝对路径加载文件(文件系统中文件)
    -->
    <mapper resource="mapper/DeptMapper.xml"/>
    <mapper resource="mapper/EmpMapper.xml"/>
</mappers>
  • class: 配置dao接口的全限定名,通过Java中的dao接口的名称加载mapper.xml文件

<mappers>
    <!--
        <mapper>单个加载映射文件
        class : 配置mapper接口的全限定名,通过Java中的Mapper接口来加载映射文件
    -->
    <mapper class="com.newcapec.mapper.DeptMapper"/>
    <mapper class="com.newcapec.mapper.EmpMapper"/>
</mappers>

要求:

  1. 必须使用mapper代理的开发方式;

  2. mapper.xml文件的名称必须与dao接口的名称保持一致;

  3. mapper.xml文件必须与dao接口放在同一个目录下;

    注意:同一个目录是指编译之后的目录,并非开发时的目录。

3.5.2 批量加载映射文件

    批量映射文件的加载:package。

  • name:dao接口与mapper文件存放的共同的目录名称

    此种配置使mapper扫描指定包,并在此包下获取所有的接口以及与接口名称相同mapper文件,并加载;

<mappers>
    <!--
        <package>批量加载映射文件
        name:存放Mapper接口与mapper.xml文件的包名
    -->
    <package name="com.newcapec.mapper"/>
</mappers>

要求:与mapper接口加载单个映射文件(class方式)一致。

3.5.3 应用

实体类:

public class Emp {

    private Integer empno;
    private String ename;
    private String job;
    private Integer mgr;
    private Date hiredate;
    private Double sal;
    private Double comm;
    private Integer deptno;
    private String gender;

    public Integer getEmpno() {
        return empno;
    }

    public void setEmpno(Integer empno) {
        this.empno = empno;
    }

    public String getEname() {
        return ename;
    }

    public void setEname(String ename) {
        this.ename = ename;
    }

    public String getJob() {
        return job;
    }

    public void setJob(String job) {
        this.job = job;
    }

    public Integer getMgr() {
        return mgr;
    }

    public void setMgr(Integer mgr) {
        this.mgr = mgr;
    }

    public Date getHiredate() {
        return hiredate;
    }

    public void setHiredate(Date hiredate) {
        this.hiredate = hiredate;
    }

    public Double getSal() {
        return sal;
    }

    public void setSal(Double sal) {
        this.sal = sal;
    }

    public Double getComm() {
        return comm;
    }

    public void setComm(Double comm) {
        this.comm = comm;
    }

    public Integer getDeptno() {
        return deptno;
    }

    public void setDeptno(Integer deptno) {
        this.deptno = deptno;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    @Override
    public String toString() {
        return "Emp{" +
                "empno=" + empno +
                ", ename='" + ename + '\'' +
                ", job='" + job + '\'' +
                ", mgr=" + mgr +
                ", hiredate=" + hiredate +
                ", sal=" + sal +
                ", comm=" + comm +
                ", deptno=" + deptno +
                ", gender='" + gender + '\'' +
                '}';
    }
}

接口:

public interface EmpMapper {

    List<Emp> select();
}

mapper文件:

<?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.newcapec.mapper.EmpMapper">

    <select id="select" resultType="Emp">
        select empno,ename,job,mgr,hiredate,sal,comm,deptno from emp
    </select>
</mapper>

测试:

/**
 * Mappers测试
 */
public class MappersTest {
    @Test
    public void testSelectEmp() {
        SqlSession sqlSession = MybatisUtil.getSession();
        EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);
        List<Emp> list = empMapper.select();
        for (Emp emp : list) {
            System.out.println(emp);
        }
        sqlSession.close();
    }
}

3.6 Mybatis配置文件的标签顺序

Mybatis配置文件中各标签的位置顺序如下:

	properties?,
    settings?, 
    typeAliases?, 
    typeHandlers?, 
    objectFactory?, 
    objectWrapperFactory?, 
    reflectorFactory?, 
    plugins?, 
    environments?, 
    databaseIdProvider?, 
    mappers?
        
    具体可以参考 http://mybatis.org/dtd/mybatis-3-config.dtd 文件。

Acho que você gosta

Origin blog.csdn.net/ligonglanyuan/article/details/124301709
Recomendado
Clasificación