[Mybatis desde la entrada hasta el tutorial de combate real] Capítulo 3 Explicación detallada de los archivos de configuración del núcleo de Mybatis

3. Archivo de configuración principal de Mybatis

El archivo de configuración global mybatis-config.xml de MyBatis, el contenido de configuración es el siguiente:

  • propiedades

  • settings (parámetros de configuración global)

  • typeAliases (tipo de alias)

  • typeHandlers (manejadores de tipo)

  • objectFactory (fábrica de objetos)

  • complementos

  • entornos (objeto de atributo de colección de entorno)

    • entorno (objeto de subpropiedad del entorno)

      • TransactionManager (gestión de transacciones)

      • fuente de datos (fuente de datos)

  • mapeadores

3.1 atributo de propiedades

    Para configurar los parámetros de conexión de la base de datos por separado en db.properties, solo necesita cargar los valores de propiedad de db.properties en mybatis-config.xml. No es necesario codificar los parámetros de conexión de la base de datos en 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

Cargue el archivo de propiedades usando <properties>la etiqueta :

  • recurso: leer archivos de recursos desde el classpath

    • El classpath es el directorio src/main/resources + el directorio src/main/java en el proyecto maven, y el directorio compilado es target/classes;

  • url: leer recursos del sistema de archivos del entorno del sistema actual

    • ventanas: 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>

En el medio ambiente uso:

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

Nota: MyBatis cargará las propiedades en el siguiente orden

  1. Las propiedades definidas en el cuerpo de la etiqueta de propiedades se leen primero;

  2. Luego se leerá la propiedad cargada por recurso o url en la etiqueta de propiedades, y sobrescribirá la propiedad de lectura del mismo nombre;

  3. Finalmente, lea el atributo pasado por parámetroTipo, que sobrescribirá el atributo de lectura del mismo nombre;

sugerencia:

  1. No agregue ningún valor de atributo en el cuerpo de la etiqueta de propiedades, solo defina los valores de atributo en el archivo de propiedades;

  2. Debe haber alguna particularidad en la definición de nombres de propiedades en el archivo de propiedades, tales como: XXXXX.XXXXX.XXXX;

3.2 ajustes parámetros de configuración global

    El framework MyBatis puede ajustar algunos parámetros operativos durante el tiempo de ejecución, tales como: habilitar el caché secundario, habilitar la carga diferida.

Los parámetros configurables son los siguientes:

configuración describir valor efectivo valores predeterminados
cacheEnabled Habilite o deshabilite globalmente la configuración de caché para cualquier mapeador bajo esta configuración. verdadero Falso verdadero
lazyLoadingEnabled Habilite o deshabilite globalmente el escalado de latencia. Cuando está deshabilitado, todo se recargará en caliente. verdadero Falso FALSO
agresivoLazyLoading Cuando está habilitado, cualquier llamada de método cargará todas las propiedades del objeto. verdadero Falso FALSO
multipleResultSetsEnabled Ya sea para permitir que una sola declaración devuelva varios conjuntos de resultados (requiere compatibilidad con el controlador). verdadero Falso verdadero
useColumnLabel Use etiquetas de columna en lugar de nombres de columna. Los diferentes controladores tienen diferentes rendimientos en este sentido. Para obtener más información, consulte la documentación del controlador correspondiente o pruebe los dos modos diferentes para observar los resultados del controlador utilizado. verdadero Falso verdadero
useGeneratedKeys Permitir que JDBC admita la generación automática de claves primarias requiere compatibilidad con el controlador. Si se establece en verdadero, esta configuración fuerza el uso de claves primarias generadas automáticamente, aunque algunos controladores no admiten esto pero aún funcionan (por ejemplo, Derby). verdadero Falso FALSO
autoMappingBehavior Especifica cómo MyBatis debe mapear automáticamente columnas a campos o propiedades. NONE deshabilita la asignación automática; PARTIAL solo asignará automáticamente los conjuntos de resultados que no definen asignaciones de conjuntos de resultados anidados. FULL mapea automáticamente conjuntos de resultados arbitrariamente complejos (anidados o no). NINGUNO, PARCIAL, COMPLETO PARCIAL
AutoMappingUnknownColumnBehavior Especifica el comportamiento de descubrir columnas desconocidas (o tipos de atributos desconocidos) de destinos de asignación automática. NINGUNO: Sin respuesta; ADVERTENCIA: Registro de recordatorio de salida (el nivel de registro de 'AutoMappingUnknownColumnBehavior' debe establecerse en WARN); FALLA: Error en la asignación (lanza SqlSessionException). NINGUNO, ADVERTENCIA, FALLA NINGUNO
defaultExecutorType Configura el ejecutor predeterminado. SIMPLE es un ejecutor normal; el ejecutor REUSE reutilizará declaraciones preparadas; el ejecutor BATCH reutilizará declaraciones y realizará actualizaciones por lotes. SIMPLE, REUTILIZAR, LOTE SIMPLE
defaultStatementTimeout Establece el tiempo de espera, que determina la cantidad de segundos que el controlador espera una respuesta de la base de datos. cualquier entero positivo no establecido
predeterminadoFetchSize Establece un valor de sugerencia para el tamaño de recuperación del conjunto de resultados del controlador (fetchSize). Este parámetro solo se puede anular en la configuración de consulta. cualquier entero positivo no establecido
SafeRowBoundsEnabled Permite la paginación (RowBounds) en declaraciones anidadas. Establecer en falso si está permitido. verdadero Falso FALSO
SafeResultHandlerEnabled Permite la paginación (ResultHandler) en sentencias anidadas. Establecer en falso si está permitido. verdadero Falso verdadero
mapUnderscoreToCamelCase Si habilitar la asignación automática de mayúsculas y minúsculas, es decir, una asignación similar del nombre de columna de base de datos clásico A_COLUMN al nombre de propiedad de Java clásico aColumn. verdadero Falso FALSO
localCacheScope MyBatis utiliza el mecanismo de caché local (Local Cache) para evitar referencias circulares (referencias circulares) y acelerar las consultas anidadas repetidas. El valor predeterminado es SESSION, en cuyo caso se almacenan en caché todas las consultas ejecutadas en una sesión. Si el valor de configuración es STATEMENT, la sesión local solo se usa para la ejecución de instrucciones y las diferentes llamadas a la misma SqlSession no compartirán datos. SESIÓN, DECLARACIÓN SESIÓN
jdbcTypeForNull Especifique el tipo de JDBC para el valor nulo cuando no se proporcione ningún tipo de JDBC específico para el parámetro. Algunos controladores necesitan especificar el tipo JDBC de la columna. En la mayoría de los casos, solo use el tipo general, como NULL, VARCHAR u OTHER. JdbcType constante, valores comunes: NULL, VARCHAR u OTROS OTRO
LazyLoadTriggerMethods Especifica qué método de objeto desencadena una carga diferida. lista de métodos separados por comas es igual a, clonar, hashCode, toString
lenguaje de secuencias de comandos predeterminado Especifica el idioma predeterminado para la generación de SQL dinámico. un alias de tipo o un nombre de clase completo org.apache.ibatis.scripting.xmltags.XMLLanguageDriver
predeterminadoEnumTypeHandler Especifica el TypeHandler predeterminado que usa Enum. un alias de tipo o un nombre de clase completo org.apache.ibatis.type.EnumTypeHandler
callSettersOnNulls Especifica si llamar al método setter (o put) del objeto de mapa cuando el valor en el conjunto de resultados es nulo, lo cual es útil cuando se confía en Map.keySet() o en la inicialización de valor nulo. Tenga en cuenta que los tipos primitivos (int, boolean, etc.) no se pueden establecer en nulo. verdadero Falso FALSO
returnInstanceForEmptyRow MyBatis devuelve nulo por defecto cuando todas las columnas de la fila devuelta están vacías. Cuando esta configuración está activada, MyBatis devolverá una instancia vacía. Tenga en cuenta que también funciona con conjuntos de resultados anidados (como colecciones o asociaciones). verdadero Falso FALSO
logPrefix Especifica el prefijo que MyBatis añade a los nombres de los logs. cualquier cadena no establecido
logImpl Especifique la implementación específica del registro utilizado por MyBatis, y lo encontrará automáticamente si no se especifica. SLF4J, LOG4J, LOG4J2, JDK_LOGGING, COMMONS_LOGGING, STDOUT_LOGGING, NO_LOGGING no establecido
fábrica de proxy Especifique la herramienta de proxy utilizada por Mybatis para crear objetos con capacidades de carga diferida. CGLIB, JAVASSIST ASISTENTE DE JAVA
vfsImpl Especifica la implementación de VFS. Nombres de clase totalmente calificados para implementaciones VFS personalizadas, separados por comas no establecido
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 文件。

Supongo que te gusta

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