栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

《Mybatis框架》第一章 全局配置文件

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

《Mybatis框架》第一章 全局配置文件

0.模板



  

1.属性(properties) 使用示例

这些属性可以在 properties 元素的子元素中设置,也可以在外部进行配置,通过resource引进,并进行动态替换。例如:

// 通过resource引入属性

  // 在子元素中进行设置
  
  

优先级

如果一个属性在多个地方都进行了配置,那么Mybatis将按照下面的顺序来加载:

  • 首先读取在 properties 元素体内指定的属性。
  • 然后根据 properties 元素中的 resource 属性读取类路径下属性文件,或根据 url 属性指定的路径读取属性文件,并覆盖之前读取过的同名属性。
  • 最后读取作为方法参数传递的属性,并覆盖之前读取过的同名属性。

我们看到上面的顺序,每次都是覆盖,因为上次的顺序是按照正序来排列,通过方法参数传递的属性具有最高优先级,resource/url 属性中指定的配置文件次之,最低优先级的则是 properties 元素中指定的属性。

2.设置(settings)

常用的配置,全部的配置见官网

设置名描述有效值默认值
cacheEnabled全局性地开启或关闭所有映射器配置文件中已配置的任何缓存。true | falsetrue
lazyLoadingEnabled延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置 fetchType 属性来覆盖该项的开关状态。true | falsefalse
useColumnLabel使用列标签代替列名。实际表现依赖于数据库驱动,具体可参考数据库驱动的相关文档,或通过对比测试来观察。true | falsetrue
defaultStatementTimeout设置超时时间,它决定数据库驱动等待数据库响应的秒数。任意正整数未设置 (null)
mapUnderscoreToCamelCase是否开启驼峰命名自动映射,即从经典数据库列名 A_COLUMN 映射到经典 Java 属性名 aColumn。true | falseFalse
使用示例

  
  
  
  
  
  
  
  
  
  
  
  
  
  
  

3.类型别名(typeAliases) 手动指定

类型别名可为 Java 类型设置一个缩写名字。 它仅用于 XML 配置,意在降低冗余的全限定类名书写。例如:


  // 单独设置某个实体类的别名
  
  
  

可以指定一个包名,全部设置别名为类名小写


  

当每一个包的Java Bean中,别名默认为Bean 的首字母小写的非限定类名,但是我们可以通过@Alias注解来修改

@Alias("author")
public class Author {
    ...
}
默认提供
别名映射的类型
_bytebyte
_shortshort
_intint
_longlong
_floatfloat
_doubledouble
_booleanboolean
_integerint
stringString
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
booleanBoolean
dateDate
objectObject
mapMap
hashmapHashMap
listList
arraylistArrayList
collectionCollection
4.类型处理器(typeHandlers)

MyBatis 在设置预处理语句(PreparedStatement)中的参数或从结果集中取出一个值时, 都会用类型处理器将获取到的值以合适的方式转换成 Java 类型。

默认提供

下面简单列举了一些,更多内容请见官网

类型处理器Java 类型JDBC 类型
BooleanTypeHandlerjava.lang.Boolean, boolean数据库兼容的 BOOLEAN
ByteTypeHandlerjava.lang.Byte, byte数据库兼容的 NUMERIC 或 BYTE
ShortTypeHandlerjava.lang.Short, short数据库兼容的 NUMERIC 或 SMALLINT
IntegerTypeHandlerjava.lang.Integer, int数据库兼容的 NUMERIC 或 INTEGER
LongTypeHandlerjava.lang.Long, long数据库兼容的 NUMERIC 或 BIGINT
FloatTypeHandlerjava.lang.Float, float数据库兼容的 NUMERIC 或 FLOAT
DoubleTypeHandlerjava.lang.Double, double数据库兼容的 NUMERIC 或 DOUBLE
DateTypeHandlerjava.util.DateTIMESTAMP
StringTypeHandlerjava.lang.StringCHAR, VARCHAR
自定义处理器

你可以重写已有的类型处理器或创建你自己的类型处理器来处理不支持的或非标准的类型。 具体做法为:

  1. 实现 org.apache.ibatis.type.TypeHandler 接口, 或继承一个很便利的类 org.apache.ibatis.type.baseTypeHandler,
  2. 指定其可以(可选地)将它映射到一个 JDBC 类型
  3. 在Mybatis全局配置文件中注册
TypeHandler接口
public interface TypeHandler {

    
    void setParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException;

    
    T getResult(ResultSet rs, String columnName) throws SQLException;

    
    T getResult(ResultSet rs, int columnIndex) throws SQLException;

    
    T getResult(CallableStatement cs, int columnIndex) throws SQLException;

}
baseTypeHandler类(推荐)

我们可以看到baseTypeHandler类实现了TypeHandler接口,并且 继承了TypeReference

  • baseTypeHandler 是个抽象类,需要子类去实现其定义的 4 个抽象方法,而它本身实现了 typeHandler 接口的 4 个方法。
  • baseTypeHandler 这个类增加了非空判断,子类则省去了,子列重写方法后,则只专注于逻辑
public abstract class baseTypeHandler extends TypeReference implements TypeHandler {

  protected Configuration configuration;

  public void setConfiguration(Configuration c) {
    this.configuration = c;
  }

  @Override
  public void setParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException {
    if (parameter == null) {
      if (jdbcType == null) {
        // 都为空 设置异常
        throw new TypeException("JDBC requires that the JdbcType must be specified for all nullable parameters.");
      }
      try {
        // 进行空设置
        ps.setNull(i, jdbcType.TYPE_CODE);
      } catch (SQLException e) {
        throw new TypeException("Error setting null for parameter #" + i + " with JdbcType " + jdbcType + " . " +
                "Try setting a different JdbcType for this parameter or a different jdbcTypeForNull configuration property. " +
                "Cause: " + e, e);
      }
    } else {
      try {
        // 正常设置参数 该方法由子类重写自定义
        setNonNullParameter(ps, i, parameter, jdbcType);
      } catch (Exception e) {
        throw new TypeException("Error setting non null for parameter #" + i + " with JdbcType " + jdbcType + " . " +
                "Try setting a different JdbcType for this parameter or a different configuration property. " +
                "Cause: " + e, e);
      }
    }
  }

  @Override
  public T getResult(ResultSet rs, String columnName) throws SQLException {
    T result;
    try {
      // 获取结果集 该方法由子类重写自定义
      result = getNullableResult(rs, columnName);
    } catch (Exception e) {
      throw new ResultMapException("Error attempting to get column '" + columnName + "' from result set.  Cause: " + e, e);
    }
    if (rs.wasNull()) {
      return null;
    } else {
      return result;
    }
  }

  @Override
  public T getResult(ResultSet rs, int columnIndex) throws SQLException {
    T result;
    try {
      // 获取结果集 该方法由子类重写自定义
      result = getNullableResult(rs, columnIndex);
    } catch (Exception e) {
      throw new ResultMapException("Error attempting to get column #" + columnIndex+ " from result set.  Cause: " + e, e);
    }
    if (rs.wasNull()) {
      return null;
    } else {
      return result;
    }
  }

  @Override
  public T getResult(CallableStatement cs, int columnIndex) throws SQLException {
    T result;
    try {
      // 获取结果集 该方法由子类重写自定义
      result = getNullableResult(cs, columnIndex);
    } catch (Exception e) {
      throw new ResultMapException("Error attempting to get column #" + columnIndex+ " from callable statement.  Cause: " + e, e);
    }
    if (cs.wasNull()) {
      return null;
    } else {
      return result;
    }
  }

  // 需要子类继承 实现的抽象方法
  public abstract void setNonNullParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException;
  public abstract T getNullableResult(ResultSet rs, String columnName) throws SQLException;
  public abstract T getNullableResult(ResultSet rs, int columnIndex) throws SQLException;
  public abstract T getNullableResult(CallableStatement cs, int columnIndex) throws SQLException;
}
测试用例

我们自定义一个类型处理器,实现的功能为将数组拼接后存入数据库,然后取出数据的时候转换成数组

a>自定义TypeHandler
public class Example2TypeHandler extends baseTypeHandler {

    // Java --> 数据库  将数组拼接后存入数据库
    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, String[] parameter, JdbcType jdbcType) throws SQLException {
        StringBuffer result = new StringBuffer();
        for (String value : parameter) {
            result.append(value).append(",");
        }
        ps.setString(i, result.toString());
    }

    // 数据库 --> Java  将数据截取成数组存入
    @Override
    public String[] getNullableResult(ResultSet rs, String columnName) throws SQLException {
        String columnValue = rs.getString(columnName);
        return this.getStringArray(columnValue);
    }

    @Override
    public String[] getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        String columnValue = rs.getString(columnIndex);
        return this.getStringArray(columnValue);
    }

    @Override
    public String[] getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        String columnValue = cs.getString(columnIndex);
        return this.getStringArray(columnValue);
    }

    // 将字符串转换成数组
    private String[] getStringArray(String columnValue) {
        if (columnValue == null) {
            return null;
        }
        return columnValue.split(",");
    }
}
b>全局配置文件注册TypeHandler

    

c>指定映射类型
	
        
        
    

    
        SELECT id,name FROM `user`
    	
d>测试代码
	static {
        try {
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
            sqlSession = factory.openSession();

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static SqlSession sqlSession;

    @Test
    public void m1() {
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        List list = userMapper.listAll();
        System.out.println(list);
    }
e>结果
[User{id=1, name='null', names=[佳林1, 佳林2]}, User{id=2, name='null', names=[迦南1, 迦南2]}]
5.环境配置(environments)

MyBatis 可以配置成适应多种环境,例如,开发、测试和生产环境需要有不同的配置;或者想在具有相同 Schema 的多个生产数据库中使用相同的 SQL 映射。

不过要记住:尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境,每个数据库对应一个 SqlSessionFactory 实例。

配置示例

  
    
      
    
    
      
      
      
      
    
  
  
      // 省略
  

注意事项 1.id配置
  • 默认使用的环境 ID(比如:default=“development”),务必保证默认的环境 ID 要匹配其中一个环境 ID。
  • 每个 environment 元素定义的环境 ID(比如:id=“development”)。
2.事务管理器(transactionManager)

在 MyBatis 中有两种类型的事务管理器,也就是 type="[JDBC|MANAGED]",也可以自定义

  • JDBC – 这个配置直接使用了 JDBC 的提交和回滚设施,它依赖从数据源获得的连接来管理事务作用域。
  • 它从不提交或回滚一个连接,而是让容器来管理事务的整个生命周期

提示: 如果你正在使用 Spring + MyBatis,则没有必要配置事务管理器,因为 Spring 模块会使用自带的管理器来覆盖前面的配置。

3.数据源(dataSource)

dataSource 元素使用标准的 JDBC 数据源接口来配置 JDBC 连接对象的资源。有三种内建的数据源类型,也就是 type="[UNPOOLED|POOLED|JNDI]",

UNPOOLED:不使用连接池

  • driver – 这是 JDBC 驱动的 Java 类全限定名(并不是 JDBC 驱动中可能包含的数据源类)。
  • url – 这是数据库的 JDBC URL 地址。
  • username – 登录数据库的用户名。
  • password – 登录数据库的密码。
  • defaultTransactionIsolationLevel – 默认的连接事务隔离级别。
  • defaultNetworkTimeout – 等待数据库操作完成的默认网络超时时间(单位:毫秒)。查看 java.sql.Connection#setNetworkTimeout() 的 API 文档以获取更多信息。

POOLED:使用连接池

除了上述提到 UNPOOLED 下的属性外,还有更多属性用来配置 POOLED 的数据源:

  • poolMaximumActiveConnections – 在任意时间可存在的活动(正在使用)连接数量,默认值:10
  • poolMaximumIdleConnections – 任意时间可能存在的空闲连接数。
  • poolMaximumCheckoutTime – 在被强制返回之前,池中连接被检出(checked out)时间,默认值:20000 毫秒(即 20 秒)
  • poolTimeToWait – 这是一个底层设置,如果获取连接花费了相当长的时间,连接池会打印状态日志并重新尝试获取一个连接(避免在误配置的情况下一直失败且不打印日志),默认值:20000 毫秒(即 20 秒)。
  • poolMaximumLocalBadConnectionTolerance – 这是一个关于坏连接容忍度的底层设置, 作用于每一个尝试从缓存池获取连接的线程。 如果这个线程获取到的是一个坏的连接,那么这个数据源允许这个线程尝试重新获取一个新的连接,但是这个重新尝试的次数不应该超过 poolMaximumIdleConnections 与 poolMaximumLocalBadConnectionTolerance 之和。 默认值:3(新增于 3.4.5)
  • poolPingQuery – 发送到数据库的侦测查询,用来检验连接是否正常工作并准备接受请求。默认是“NO PING QUERY SET”,这会导致多数数据库驱动出错时返回恰当的错误消息。
  • poolPingEnabled – 是否启用侦测查询。若开启,需要设置 poolPingQuery 属性为一个可执行的 SQL 语句(最好是一个速度非常快的 SQL 语句),默认值:false。
  • poolPingConnectionsNotUsedFor – 配置 poolPingQuery 的频率。可以被设置为和数据库连接超时时间一样,来避免不必要的侦测,默认值:0(即所有连接每一时刻都被侦测 — 当然仅当 poolPingEnabled 为 true 时适用)。

JNDI – 这个数据源实现是为了能在如 EJB 或应用服务器这类容器中使用,

6.数据库厂商标识(databaseIdProvider)

Mybatis可以根据不同的数据库厂商执行不同的语句


  
  
  

MyBatis 会加载带有匹配当前数据库databaseId属性和所有不带databaseId属性的语句。 如果同时找到带有 databaseId 和不带 databaseId 的相同语句,则后者会被舍弃。


7.映射器(mappers)

     


  


  
  
  


  
  
  

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/332989.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号