在上篇博客-[JDBC] 处理惩罚ResultSet,构建Java工具中提到,我们需要阐明Mybatis在转换Result到需要的Java业务工具时做的三件事,如下:
1. 办理了数据库列名到Java列名的映射。
2.办理了数据库范例到Java范例的转换事情。
3.在转换进程中具备必然的容错本领。
其实焦点就是:
1.数据库中的列名怎么和工具中的字段对应起来。
2.数据库中的列的范例怎么转换到符合的Java范例,不引起转换失败。
本日我们先来看第一点,数据库中的列名怎么和工具中的字段对应起来。首先是日常PO(Persistant Object) CityPO,内里有五个字段。
public class CityPO { Integer id; Long cityId; String cityName; String cityEnName; String cityPyName;
本次要查询的数据库中的列名如下所示。
mysql> mysql> desc SU_City; +--------------+-------------+------+-----+-------------------+-----------------------------+ | Field | Type | Null | Key | Default | Extra | +--------------+-------------+------+-----+-------------------+-----------------------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | city_id | int(11) | NO | UNI | NULL | | | city_name | varchar(20) | NO | | | | | city_en_name | varchar(20) | NO | | | | | city_py_name | varchar(50) | NO | | | | | create_time | datetime | NO | | CURRENT_TIMESTAMP | | | updatetime | datetime | NO | MUL | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP | +--------------+-------------+------+-----+-------------------+-----------------------------+ 7 rows in set (0.01 sec)
我们是凭据驼峰式定名,把数据库中的列名对应到了工具的字段名。如下是Mybatis的接口类和映射文件。
public interface CityMapper { CityPO selectCity(int id); }
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="mapper.CityMapper"> <select id="selectCity" resultType="po.CityPO"> select id,city_id,city_name,city_en_name from SU_City where id = #{id} </select> </mapper>
在上面的映射文件中,namespace指定了这个接口类的全限定类名,紧随其后的select代表是select语句,软件开发,id是接口类中函数的名字,resultType代表了从这条语句中返回的期望范例的类的完全限命名或别名,在此例子中是我们的业务工具CityPO的类路径。
主要有三种方案
1.驼峰式定名开关,可能不开,数据库列和字段名全一致。
2.Select时指定AS。
3.resultMap 最稳健。
这篇主要看一下第一种,附上示例和部门源码走读。
1.驼峰定名开关。
因为CityPO的列名是完全按照数据库列名驼峰式定名后获得的,软件开发,因此Mybatis提供了一个设置项。开启开设置项后,在匹配时,可以或许按照数据库列名找到对应对应的驼峰式定名后的字段。
<settings> <!-- 开启驼峰,开启后,只要数据库字段和工具属性名字母沟通,无论中间加几多下划线都可以识别 --> <setting name="mapUnderscoreToCamelCase" value="true" /> </settings>
我们从源码角度解读一下,Mybat处理惩罚ResultSet的映射默认都在DefaultResultSetHandler中完成。
处理惩罚行数据的时候的时候主要在下面的函数里举办,由于我们在映射文件中没有界说特另外ResultMap,因此会直接进入else分支的代码。
public void handleRowValues(ResultSetWrapper rsw, ResultMap resultMap, ResultHandler<?> resultHandler, RowBounds rowBounds, ResultMapping parentMapping) throws SQLException { if (resultMap.hasNestedResultMaps()) { ensureNoRowBounds(); checkResultHandler(); handleRowValuesForNestedResultMap(rsw, resultMap, resultHandler, rowBounds, parentMapping); } else { handleRowValuesForSimpleResultMap(rsw, resultMap, resultHandler, rowBounds, parentMapping); } }
进入handleRowValuesForSimpleResultMap中,主要处理惩罚函数如下,在这里完成了工具的生成及赋值。
Object rowValue = getRowValue(rsw, discriminatedResultMap);