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
-
As propriedades definidas no corpo da tag de propriedades são lidas primeiro;
-
Então a propriedade carregada por recurso ou url na tag de propriedades será lida e sobrescreverá a propriedade lida de mesmo nome;
-
Por fim, leia o atributo passado por parameterType, que irá sobrescrever o atributo read de mesmo nome;
sugestão:
-
Não adicione nenhum valor de atributo no corpo da tag de propriedades, apenas defina os valores de atributo no arquivo de propriedades;
-
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>
要求:
-
必须使用mapper代理的开发方式;
-
mapper.xml文件的名称必须与dao接口的名称保持一致;
-
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 文件。