美文网首页
chapter-4--mybatis的配置

chapter-4--mybatis的配置

作者: john_leventon | 来源:发表于2019-01-18 17:53 被阅读0次

一、概述

MyBatis配置项的顺序不能颠倒,否则可能发生异常。

二、各个配置项说明

1、properties

该属性可以给系统配置一些运行参数,可以直接在基本配置文件中即SqlSessionFactory的配置文件中直接配置:

<properties>

      <property name="database.driver" value="com.mysql.cj.jdbc.Driver"/>

      <property name="database.url" value="jdbc:mysql://localhost:3306/wz_db" />

      <property name="database.username" value="root" />

      <property name="database.password" value="123456" />

    </properties>

使用:

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

或者通过额外的properties配置文件配置:

<properties resource="jdbc.properties" />

在某些情况下,properties文件中的数据库用户名和密码是加密的,这时就需要通过代码传递property参数了。代码如下:

String resource = "mybatis-config.xml"//基础配置文件

InputStream inputStream;

InputSream is = Resource.getResourceAsStream("jdbc.properties");

Properties props = new Properties();

props.load(is);

String userName = props.getProperty("database.username");

String password = props.getProperty("database.password");

//解密用户名和密码

props.put("database.username", CodeUtils.decode(userName));

props.put("database.password", CodeUtils.decode(password));

inputStream = Resource.getResourceAsStream(resource);

SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream, props);

总结:三种配置方式优先级:代码方式>properties文件方式>property子元素方式

2、settings

settings是MyBatis中最复杂的配置,它能深刻影响MyBatis底层的运行,常用的配置项有:

关于缓存的cacheEnabled、关于级联的lazyLoadingEnabledaggresiveLazyLoading、关于自动映射的autoMappingBehaviormapUnderscoreToCamelCase、关于执行器类型的defaultExecutorType等。

3、typeAliases 别名

别名不区分大小写

3.1、mybatis已经定义的一些别名:



如果要使用对应类型的数组类型,查表看mybatis是否支持,然后别名加[]即可,如

_int[]。

3.2、自定义别名

3.2.1 通过代码注册别名

通过Configuration获取TypeAliasRegistry类对象:

TypeAliasRegistry aliasRegistry = configuration.getTypeAliasRegistry();

使用registerAlias()方法注册别名:

aliasRegistry.registerAlias("JDBC", JdbcTransactionFactory.class);

3.2.2 在配置文件中配置别名

在MyBatis基础配置文件即SqlSessionFactory配置文件中:

<typeAliases>

     <typeAlias alias="role" type="com.mybatis.learn.Role" />

</typeAliases>

3.2.3、通过包名

<typeAliases>

<package name="com.mybatis.learn.chapter03.pojo" />

</typeAliases>

MyBatis将扫描这个包里所有的类,类名的第一个字母变为小写作为其别名,但同时扫描几个包时,可能出现重名的情况如com.chapter03.pojo和com.chapter04.pojo包中都存在类名为User的类,这时候可以通过注解@Alias("user3")进行区分。

4、typeHandler类型转换器

typeHandler的作用是将jdbcType和javaType互相转换。MyBatis提供了大部分数据类型转换,但是对于枚举类型,我们往往需要通过自定义TypeHandler去实现转换。

4.1 自定义TypeHandler

自定义TypeHandler需要实现TypeHandler接口


public class SexEnumTypeHandler implements TypeHandler<sexEnum> {

@Override

public sexEnum getResult(ResultSet rs, String columnName) throws SQLException {

return sexEnum.getSexById(rs.getInt(columnName));

}

@Override

public sexEnum getResult(ResultSet rs, int i) throws SQLException {

return sexEnum.getSexById(rs.getInt(i));

}

@Override

public sexEnum getResult(CallableStatement cs, int i) throws SQLException {

return sexEnum.getSexById(cs.getInt(i));

}

@Override

public void setParameter(PreparedStatement ps, int i, sexEnum sex, JdbcType jdbcType) throws SQLException {

ps.setInt(i, sex.getId());

}

}

枚举类型 sexEnum:

public enum sexEnum{

MALE(0, "男"), FEMALE(1, "女");

    private int id;

    private String sex;

private sexEnum(int id, String sex) {

this.id = id;

this.sex = sex;

}

public static sexEnum getSexById(int id){

for(sexEnum s : sexEnum.values()) {

if(s.getId() == s.id) {

return s;

}

return null;

}

/**getter and setter**/

}

启用自定义TypeHandler:


在映射器配置文件中配置

采用扫包+注解方式启用:

相关文章

网友评论

      本文标题:chapter-4--mybatis的配置

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