欢迎访问昆山宝鼎软件有限公司网站! 设为首页 | 网站地图 | XML | RSS订阅 | 宝鼎邮箱 | 后台管理


新闻资讯

MENU

软件开发知识

Mybatis处理惩罚列名—字段 图纸加密 名映射(一) — 驼峰式定名映射

点击: 次  来源:宝鼎软件 时间:2017-07-27

原文出处: 岑凯伦(微信公号 - 凯伦说,ID:KailunTalk)

在上篇博客-[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);