Mybatis为什么要提供别名?
Mybatis最基础的Demo中体现要做的事情是非常简单的,如果使用原生的JDBC来实现数据库表与对象之间的映射的话,我们应该怎么做呢?首先,使用ClassForName在静态代码块中注册一个驱动类。然后,使用静态类DriverManager来获取一个数据库的连接对象,当然在这一步我们需要提供URL,username以及password等用于连接数据库以及鉴权的信息。第三,得到连接之后,建立statement或者是preparedStatment对象,第四,执行上面的语句,得到相关的结果集。最后,通过解析结果集的meta信息,建立与对象的关系,将一条条的结果集,封装成为一个一个的对象。收尾,打扫战场,将所有的连接,statement等等耗费资源的信息该关的关,该返回的返回。
在上面的过程中,Mybatis在从结果集到对象的映射过程中,提供了“别名”这个机制。以为Mybatis无法准确获知当前结果集对应的对象的信息,就无法将结果集的数据一个一个的填充到对象当中。所以,如果我们期望当前的查询语句返回的是一个对象的话,我们就需要在Mybatis的配置文件中,告诉Mybatis我们锁期望的对象的类型。
此外,因为对象的类型一般都是前缀+类型名的结构,为了方便使用mybatis的开发人员能够省心,也提供了类似于“重构”名字的概念,就是将所有的前缀写到typeAliases标签中,类似于下面的代码:
<typeAliases> <typeAlias type="com.samsung.mybatis.Tiger" alias="tiger"/> </typeAliases> |
有两个点需要注意一下,第一个就是,我们定义的别名tiger实际上是代表了com.samsung.mybatis.Tiger这一串字符串,在当前的XML以及嵌套的XML范围内,凡是使用com.samsung.mybatis.Tiger的地方都可以使用tiger来替代,这就跟代码重构中,将重复的代码抽取出来有异曲同工的效果。
有关于MyBatis的内置别名
在Mybatis中,不仅我们可以自己来对一个对象进行命名别名,它同时也提供了很多内置别名,对非常常用的对象进行了命名,大致上可以分为基本类型、基本类型的封装类型,集合类型以及其他类型。Mybatis内置对象的命名全部是小写的,这个需要注意一下,因为毕竟我们对驼峰命名更加熟悉。
基本类型
基本类型在java中是一种比较特殊的类型,在JDK的规范中,除了基本类型之外,其他的都是引用对象,比如String,包装类型,以及我们自己定义的各种类型。这也就意味着,如果我们试图修改一个传入参数的值,我们应该有其注重该类型是基本类型还是对象类型。
在Mybatis中,对基本类型的命名,有下面的规则,基本类型的前面有一个下划线,来区分基本类型与对象类型,例如,Mybatis将int类型命名为_int,将double类型命名为_double。
封装类型
封装类型是java提供的,对基本类型的封装,其目的就是为了在基本类型的基础上增加一些默认的行为,例如类型转换,加减运算等等。在低版本的jdk中,在早期的版本中还有封箱解箱的概念,后面的版本里,我们很多同事都会将这个相互混用了,JVM会负责两个对象之间的转换。
对于封装类型,Mybatis的命名要简单的多,例如对于Double类型,简单的命名为double,对于Integer类型,简单的命名为int 或者是 Integer,这种命名也体现了Mybatis对于开发人员的妥协,因为不管你写成int或者是Integer,我都认为你是对的,从这个角度上来说,Mybatis还是蛮人性化的,而不是死死的定一个乌龟屁股,Integer就应该写成integer。
集合类型
Java提供的集合类型是相当强大的,有set,map,list等等,这些类型在进行业务逻辑运算以及集合运算的时候有非常强大的作用,里面隐藏了非常多的技术实现以及各种优化之后的算法。
对于集合类型,Mybatis对他们的别名也是非常容易记忆的,比如map对应的接口Map,hashmap对应的是HashMap,list对应的List,arraylist对应的是ArrayList。
其他类型
有一些非常有用的其他的类型,比如Date,BigDecimal,Iterator,mybatis也提供给了内置的别名。对于Date而言,它的别名是date,对于BigDecimal而言,它的别名是bigdecimal或者是decimal,对于Iterator则是非常简单的iterator只是将其变成了小写而已。
Mybatis_review之配置文件中的typeAliases节点内容说明