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

1. MyBatis入门

Mybatis学习笔记——入门+配置_第1张图片

2. Mybatis配置

Mybatis学习笔记——入门+配置_第2张图片

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

2.1 properties配置

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

    Mybatis学习笔记——入门+配置_第3张图片

    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}


        
        
        
        
 

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


        
        
        

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 indexes = new HashMap();
    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 {
    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


        

//使用Handler


        
        
        
        typeHandler="com.demo.mybatis.handler.MaleTypeHandler"/>

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 create(Class type) {
        System.out.println("create:" + type);
        return super.create(type);
    }

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

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

  (2)配置ObjecFactory

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

2.6 environments 配置环境

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

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

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

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

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

Mybatis提供的四种dataSource :

  1. UNPOOLED , 非数据库连接池 (UnpooledDataSource)
  2. POOLED , 连接池(PooledDataSource)
  3. JNDI,JNDI数据源 (JDNIDataSource)
  4. 自定义
 
        
            
                
            
            
            
                
                
                
                
            
        
    
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);
        }
    }
}

你可能感兴趣的:(JAVA)