Mybatis学习笔记——入门+配置

1. MyBatis入门

2. Mybatis配置

PS:XML文件的层次结构不能调到顺序,如果颠倒,会解析失败

2.1 properties配置

2.1.1 三种配置的方式及加载顺序

    

    3. 通过程序加载

        常用于对数据库密码进行解密,配置文件中配置密文,程序解析成明文之后再传给Mybatis

 properties.setProperty("username", decode(properties.getProperty("username")));
 properties.setProperty("password", decode(properties.getProperty("password")));
 return new SqlSessionFactoryBuilder().build(congfigXMl, properties);

2.1.2 Mybatis中使用配置

使用${name}

<dataSource type="POOLED">
        <property name="driver" value="${driver}"/>
        <property name="url" value="${url}"/>
        <property name="username" value="${username}"/>
        <property name="password" value="${password}"/>
 </dataSource>

2.2 setting 设置

用于设置Mybatis的行为,是Mybatis中最复杂的配置

2.3 typeAliases别名

给类的全限定名起别名,这样就可用很简短的名称去指代它

  • Mybatis已经定义好了很多基本类型的别名
  • java基本类型在前面加_  就是其别名,在后面再[] 就是其数组类型  _int   _int[]
  • data[] 表示 java.util.Date[]
  • 包装类型的别名为对应的基本类型  int 表示Integer
  • map -> Map   hashmap -> HashMap
  • list -> List    arraylist -> ArrayList

<typeAliases>
        <typeAlias alias="role" type="com.demo.mybatis.po.Role"/>
        <!--通过自动扫描方式   @Alias("role")-->
        <package name="com.demo.mybatis.po"/>
</typeAliases>

2.4 typeHandler 类型处理器

  •   Mybatis在预处理语句(PreparedStatement)中设置一个参数,或者从结果集(ResultSet)中取一个值,都会用注册的typeHandler进行处理
  • typeHandler的作用是 :Java类型(javaType)与JDBC类型(jdbcType)互转
  • Mybatis已经提供了大量的类型处理器
  • 自带的两种枚举类型Handler    
  1.  EnumTypeHandler (使用toString转化,默认方式)   
  2.  EnumOrdinalTypeHandler(序数转化)
  • 自定义类型处理器:
//定义枚举类
public enum Male {
    MALE(2, "男"), FAMALE(3, "女");
    private final static Map<Integer, Male> indexes = new HashMap<Integer, Male>();
    static {
        for (Male male : Male.values()) {
            indexes.put(male.getCode(), male);
        }
    }
    public static Male getMale(int code) {
        return indexes.get(code);
    }

    private final int code;
    private final String desc;
    //get set
}

// typeHandler

@MappedTypes({Male.class})
@MappedJdbcTypes({JdbcType.TINYINT})
public class MaleTypeHandler implements TypeHandler<Male> {
    public void setParameter(PreparedStatement preparedStatement, int i, Male male, JdbcType jdbcType) throws SQLException {
        preparedStatement.setInt(i, male.getCode());
    }

    public Male getResult(ResultSet resultSet, String s) throws SQLException {
        return Male.getMale(resultSet.getInt(s));
    }

    public Male getResult(ResultSet resultSet, int i) throws SQLException {
        return Male.getMale(resultSet.getInt(i));
    }

    public Male getResult(CallableStatement callableStatement, int i) throws SQLException {
        return Male.getMale(callableStatement.getInt(i));
    }
}

// 配置Handler

<typeHandlers>
        <package name="com.demo.mybatis.handler"/>
</typeHandlers>

//使用Handler

<resultMap id="roleMap" type="role">
        <id column="id" property="id" javaType="int" jdbcType="INTEGER"/>
        <result column="role_name" property="roleName" jdbcType="VARCHAR" javaType="string"/>
        <!--<result column="sex" property="sex" typeHandler="org.apache.ibatis.type.EnumOrdinalTypeHandler"/>-->
        <result column="sex" property="sex" typeHandler="com.demo.mybatis.handler.MaleTypeHandler"/>
</resultMap>

2.5 ObjectFactory

  •   当Mybatis构建结果返回时,都会使用ObjectFactory(对象工厂)去构建POJO
  •  Mybatis默认使用DefaultObjectFactory
  •  大部分时候不需要自己定义,使用系统默认的即可
  •  自定义ObjectFactor
       (1)继承DefaultObjectFactory
public class MyObjectFactory extends DefaultObjectFactory {
    @Override
    public void setProperties(Properties properties) {
        System.out.println("setProperties:" + properties);
        super.setProperties(properties);
    }

    @Override
    public <T> T create(Class<T> type) {
        System.out.println("create:" + type);
        return super.create(type);
    }

    @Override
    public <T> T create(Class<T> type, List<Class<?>> constructorArgTypes, List<Object> constructorArgs) {
        System.out.println("create:" + type + "," + constructorArgTypes + "," + constructorArgs);
        return super.create(type, constructorArgTypes, constructorArgs);
    }

    @Override
    public <T> boolean isCollection(Class<T> type) {
        System.out.println("isCollection:" + type);
        return super.isCollection(type);
    }
}

  (2)配置ObjecFactory

<objectFactory type="com.demo.mybatis.handler.MyObjectFactory">
    <property name="name" value="MyObjectFactory"></property> //通过setProperties传到ObjectFactory
</objectFactory>

2.6 environments 配置环境

配置环境可以注册多个数据源,每个数据源包含如下两个部分:

  • transactionManager  事务管理
  • dataSource 数据源配置

<environments default=""> 中的default标明在缺省时,将启用哪个数据源配置,值为 <environment id="">中的id

transactionManager 中的type有三种属性配置:

  1. JDBC,采用JDBC方式管理事务
  2. MANAGED,采用容器方式管理事务,在JNDI数据源中常用
  3. 自定义,适用于特殊应用

Mybatis提供的四种dataSource :

  1. UNPOOLED , 非数据库连接池 (UnpooledDataSource)
  2. POOLED , 连接池(PooledDataSource)
  3. JNDI,JNDI数据源 (JDNIDataSource)
  4. 自定义
 <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC">
                <property name="autoCommit" value="false"></property>
            </transactionManager>
            <!--  使用mybatis自己提供的数据源
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
            -->
            <dataSource type="com.demo.mybatis.handler.DBCPDataSourceFactory">
                <property name="driverClassName" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
public class DBCPDataSourceFactory implements DataSourceFactory {
    private Properties properties;

    public void setProperties(Properties properties) {
        this.properties = properties;
    }

    public DataSource getDataSource() {
        try {
            //使用apachedbcp数据源
            return BasicDataSourceFactory.createDataSource(properties);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

猜你喜欢

转载自blog.csdn.net/long798266215/article/details/79404921
今日推荐