一、全局配置文件补充说明

1、类型的别名

Mybatis 全局配置文件:

1
2
3
4
5
<!-- 配置类型的别名 -->
<typeAliases>
<!-- 声明了实体类所在的包之后,在Mapper配置文件中,只需要指定这个包下的简单类名即可 -->
<package name="com.atguigu.mybatis.entity"/>
</typeAliases>

Mapper 配置文件:

1
2
3
4
5
<!-- Employee selectEmployeeById(Integer empId); -->
<select id="selectEmployeeById" resultType="Employee">
select emp_id,emp_name,emp_salary,emp_gender,emp_age from t_emp
where emp_id=#{empId}
</select>

2、自定义类型转换器

① 创建自定义类型转换器类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
@MappedTypes(value = Address.class)
@MappedJdbcTypes(JdbcType.CHAR)
public class AddressTypeHandler extends BaseTypeHandler<Address> {
@Override
public void setNonNullParameter(PreparedStatement preparedStatement, int i, Address address, JdbcType jdbcType) throws SQLException {

}

@Override
public Address getNullableResult(ResultSet resultSet, String columnName) throws SQLException {

// 1.从结果集中获取原始的地址数据
String addressOriginalValue = resultSet.getString(columnName);

// 2.判断原始数据是否有效
if (addressOriginalValue == null || "".equals(addressOriginalValue))
return null;

// 3.如果原始数据有效则执行拆分
String[] split = addressOriginalValue.split(",");
String province = split[0];
String city = split[1];
String street = split[2];

// 4.创建Address对象
Address address = new Address();
address.setCity(city);
address.setProvince(province);
address.setStreet(street);

return address;
}

@Override
public Address getNullableResult(ResultSet resultSet, int i) throws SQLException {
return null;
}

@Override
public Address getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
return null;
}
}

② 注册自定义类型转换器

在 Mybatis 全局配置文件中配置:

1
2
3
4
<!-- 注册自定义类型转换器 -->
<typeHandlers>
<typeHandler jdbcType="CHAR" javaType="com.atguigu.mybatis.entity.Address" handler="com.atguigu.mybatis.type.handler.AddressTypeHandler"/>
</typeHandlers>

3、mapper 映射文件注册

Mybatis 允许在指定 Mapper 映射文件时,只指定其所在的包:

1
2
3
<mappers>
<package name="com.atguigu.mybatis.dao"/>
</mappers>

但是,要求是:

  • Mapper 接口和 Mapper 配置文件名称一致
  • Mapper 配置文件放在 Mapper 接口所在的包内

二、Mybatis 底层对 JDBC 的调用

org.apache.ibatis.executor.statement.PreparedStatementHandler 类:

查找上面目标时,Debug 查看源码的切入点是:

org.apache.ibatis.session.defaults.DefaultSqlSession 类的 update()方法