美文网首页
MyBatis学习笔记(二):配置介绍

MyBatis学习笔记(二):配置介绍

作者: 简单一点点 | 来源:发表于2018-12-19 22:53 被阅读2次

Mybatis的配置文件如下所示。

<?xml version="1.0" encoding="UTF-8" ?>
<configuration> <!--配置 -->
    <properties/> <!--属性 -->
    <settings/> <!--设置 -->
    <typeAliases /> <!--类型命名 -->
    <typeHandlers /> <!--类型处理器 -->
    <objectFactory /> <!--对象工厂 -->
    <plugins /> <!--插件 -->
    <environments> <!-- 配置环境 -->
        <environment> <!--环境变量 -->
            <transactionManager /> <!--事务管理器 -->
            <dataSource /> <!--数据源 -->
        <environment>
    <environments>
    <databaseIdProvider /> <!--数据库厂商标识 -->
    <mappers /> <!--映射器 -->
</configuration>

需要注意的是:MyBatis配置项的顺序不能颠倒!

properties配置

properties属性可以给系统配置一些运行参数,供其它配置使用。一共有3种方式使用properties:

  • property子元素
  • properties文件
  • 程序代码传递
    这里主要讲解前两种。

property子元素

如下所示,使用property子元素将数据库连接的相关配置放到一起。好处是可以一次定义,到处引用。但如果需要配置的参数过多的时候就不太合适。

<?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>
    <properties>
        <property name="database.driver" value="com.mysql.jdbc.Driver" />
        <property name="database.url" value="jdbc:mysql://localhost:3306/mybatis_demo?characterEncoding=utf-8" />
        <property name="database.uaername" value="root" />
        <property name="databse.password" value="123" />
    </properties>
    <settings>
        <!-- 日志 -->
        <setting name="logImpl" value="LOG4J" />
    </settings>
    <environments default="development">
        <environment id="development">
            <!-- 使用JDBC事务管理 -->
            <transactionManager type="JDBC"></transactionManager>
            <!-- 数据库连接池 -->
            <dataSource type="POOLED">
                <property name="driver" value="${database.driver}"/>
                <property name="url" value="${database.url}"/>
                <property name="username" value="${database.username}" />
                <property name="password" value="${database.password}" />
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/wyk/mybatisDemo/mapper/userMapper.xml" />
    </mappers>
</configuration>

properties文件

这种方法使用较多,文件也便于维护。

在classpath下创建一个properties文件jdbc.properties。

database.driver=com.mysql.jdbc.Driver
database.url=jdbc:mysql://localhost:3306/mybatis_demo?characterEncoding=utf-8
database.username=root
database.username=123

同时修改MyBatis配置文件properties属性。

<properties resource="jdbc.properties" />

程序传递

这种方式一般应用在文件需要加密的场景,通过程序进行解密在传递进去。

settings配置

settings属性本身较为复杂,但大部分情况使用默认值即可,不需要配置。只需修改一些常用规则,比如自动映射、驼峰命名映射、级联规则、是否启动缓存、执行器类型等。

有关该项可以直接查看 MyBatis中文开发文档

typeAliases别名

typeAliases属性用来为SQL映射文件中的输入输出参数设置类型别名。

配置方式如下:

<typeAliases>
    <typeAlias alias="user" type="com.wyk.mybatisDemo.pojo.User">
</typeAliases>

MyBatis还提供了批量注释的方法,指定包名,程序会为该包下的所有包装类加上别名。别名规范是对应包装类的类名首字母小写。

<typeAliases>
    <package name="com.wyk.mybatisDemo.pojo" />
</typeAliases>

如果不想使用批量自动使用的别名规则,别可以通过注解"@Alias"来使用自定义别名。注意:只有typeAliases属性中的包名下的类使用"@Alias"才会有效。

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

typeHandler类型转换器

类型处理器(typeHandler)负责数据库类型(jdbcType)和Java类型(javaType)之间的相互转换。一般情况下,使用默认的系统定义typeHandler即可满足需求。少部分特殊场景需要使用自定义的typeHandler,比如一些枚举类型。

自定义typeHandler

自定义typehandler需要实现TypeHandler接口,需要实现以下4个方法:

public void setParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType)
public String getResult(ResultSet rs, String columnName)
public String getResult(ResultSet rs, int columnIndex)
public String getResult(CallableStatement cs, int columnIndex) 

写一个自定义的typeHandler,实现String的转换。

package com.wyk.mybatisDemo.typehandler;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.TypeHandler;
import org.apache.log4j.Logger;

/**
 * 自定义TypeHandler
 * @author yunkai
 *
 */
public class MyTypeHandler implements TypeHandler<String>{

    Logger logger = Logger.getLogger(MyTypeHandler.class);

    public void setParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
        logger.info("设置string参数[" + parameter + "]");
        ps.setString(i, parameter);
    }

    public String getResult(ResultSet rs, String columnName) throws SQLException {
        String result = rs.getString(columnName);
        logger.info("读取string参数1[" + result + "]");
        return result;
    }   

    public String getResult(ResultSet rs, int columnIndex) throws SQLException {
        String result = rs.getString(columnIndex);
        logger.info("读取string参数2[" + result + "]");
        return result;
    }

    public String getResult(CallableStatement cs, int columnIndex) throws SQLException {
        String result = cs.getString(columnIndex);
        logger.info("读取string参数3[" + result + "]");
        return result;
    }   
}

在配置文件中配置typeHandler

<typeHandlers>
    <typeHandler jdbcType="VARCHAR" javaType="string" 
        handler="com.wyk.mybatisDemo.typehandler.MyTypeHandler"/>
</typeHandlers>

在映射文件中显式使用typeHandler。

<select id="findUserByUsername2" resultType="user" >
    SELECT * FROM T_USERS WHERE username LIKE CONCAT('%', 
        #{value, typeHandler=com.wyk.mybatisDemo.typehandler.MyTypeHandler}, '%')
</select>

MyBatis还支持数据库的Blob字段,提供BlobTypeHandler将byte[]转换为blob。
一般在实际中使用文件流的形式来减小服务器的压力,使用BlobInputStreamTypeHandler将InputStream转为blob,更多的情况是使用文件服务器。

ObjectFactory对象工厂

创建结果集时,MyBatis会使用一个对象工厂来完成创建这个结果集实例。自己创建对象工厂比较复杂且容易出错,一般继承系统实现好的DefaultObjectFactory。

package com.wyk.mybatisDemo.objectfactory;

import java.util.List;
import java.util.Properties;

import org.apache.ibatis.reflection.factory.DefaultObjectFactory;
import org.apache.log4j.Logger;

public class MyObjectFactory extends DefaultObjectFactory {

    private static final long serialVersionUID = -7370040641835916468L;
    
    Logger log = Logger.getLogger(MyObjectFactory.class);
    
    private Object temp = null;
    
    //处理参数
    @Override
    public void setProperties(Properties properties) {
        super.setProperties(properties);
        log.info("初始化参数:[" + properties.toString() + "]");
    }
    
    //方法2
    @Override
    public <T> T create(Class<T> type) {
        T result = super.create(type);
        log.info("创建对象:" + result.toString());
        log.info("是否和上次创建的是同一个对象:[" + (temp == result) + "]");
        return result;
    }

    //方法1
    @Override
    public <T> T create(Class<T> type, List<Class<?>> constructorArgsTypes,
            List<Object> constructorArgs) {
        T result = super.create(type, constructorArgsTypes, constructorArgs);
        log.info("创建对象:" + result.toString());
        temp = result;
        return result;
    }
    
    //判断集合类型参数
    @Override
    public <T> boolean isCollection(Class<T> type) {
        return super.isCollection(type);
    }
}

然后在配置文件进行配置。其中的property参数会在加载配置的时候初始化到MyObjectFactory,作为该类的全局参数使用。

<objectFactory type="com.wyk.mybatisDemo.objectfactory.MyObjectFactory">
    <property name="prop1" value="hahaha" />
</objectFactory>

输出如下。每次都掉用两个方法生成同一对象。没太明白原因,留到以后解析代码的时候在研究。

对象工厂测试.png

plugins插件配置

待续

environments运行环境配置

在MyBatis中,运行环境主要是配置数据库信息。可以配置多个数据库。它一共分为两部分:事务管理器(tansactionManager)、数据源(dataSource)。实际应用中,大部分使用Spring进行管理。

tansactionManager

事务管理器有2种类型:JDBC和MANAGED.

  • 配置为JDBC会直接使用JDBC对数据库的提交和回滚进行操作。
  • 配置为MANAGED则不提交和回滚连接,而是由容器来管理事务的生命周期。

dataSource

MyBatis中有3种内建的数据源类型。

  • UNPOOLED 设置每次请求时打开与关闭连接。
  • POOLED 可以设置一个管理数据库连接的资源池。
  • JNDI 配置外部连接数据源。

databaseIdProvider数据库厂商标识

该元素用来支持不同厂商的数据库。

mappers映射器

mappers用来配置需要加载的的SQL映射配置文件的路径。有以下几种配置方式:

第一种,使用相对路径。

<mappers>
    <mapper resource="com/wyk/mybatisDemo/mapper/userMapper.xml" />
</mappers>

第二种,使用绝对路径。

<mappers>
    <mapper url="file:///var/mappers/userMapper.xml" />
</mappers>

第三种,使用接口信息配置。

<mappers>
    <mapper class="com.wyk.mybatisDemo.mapper.userMapper" />
</mappers>

第四种,使用接口所在的包进行配置。

<mappers>
    <package name="com.wyk.mybatisDemo.mapper" />
</mappers>

相关文章

网友评论

      本文标题:MyBatis学习笔记(二):配置介绍

      本文链接:https://www.haomeiwen.com/subject/awaskqtx.html