一、为什么要进行类型别名优化
首先我们来看一下前面写的UserMapper.xml配置文件:
<?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">
<!-- 命名空间namespace对应Mapper接口 -->
<mapper namespace="com.jms.dao.UserMapper">
<!-- id对应接口中的方法 -->
<select id="getUsers" resultType="com.jms.pojo.User">
select * from mybaties.user
</select>
<select id="getUserbyid" parameterType="int" resultType="com.jms.pojo.User">
select * from mybaties.user where id=#{id}
</select>
<insert id="addUser" parameterType="com.jms.pojo.User">
insert mybaties.user value(#{id},#{username},#{password})
</insert>
<update id="UpdateUser" parameterType="com.jms.pojo.User">
update mybaties.user set username=#{username},password=#{password} where id=#{id}
</update>
<delete id="DeleteUser" parameterType="int">
delete from mybaties.user where id=#{id}
</delete>
</mapper>
其中"com.jms.pojo.User"是全限定类名,十分冗余,类型别名就是为了设置缩写名字,意在降低冗余的全限定类名书写。
二、怎样进行类型别名优化
1.类型别名可为 Java 类型设置一个缩写名字
我们修改mybatis-config.xml配置文件,为其添加以下的内容:
<typeAliases>
<typeAlias type="com.jms.pojo.User" alias="User"/>
</typeAliases>
需要注意一个点:mybatis-config.xml配置文件中各个标签都有着自己的固定顺序,这个顺序就是官方给出的配置结构顺序,打乱会报错。
接下来我们去把UserMapper.xml中全限定类名修改为我们的缩写名:
<?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">
<!-- 命名空间namespace对应Mapper接口 -->
<mapper namespace="com.jms.dao.UserMapper">
<!-- id对应接口中的方法 -->
<select id="getUsers" resultType="User">
select * from mybaties.user
</select>
<select id="getUserbyid" parameterType="_int" resultType="User">
select * from mybaties.user where id=#{id}
</select>
<insert id="addUser" parameterType="User">
insert mybaties.user value(#{id},#{username},#{password})
</insert>
<update id="UpdateUser" parameterType="User">
update mybaties.user set username=#{username},password=#{password} where id=#{id}
</update>
<delete id="DeleteUser" parameterType="_int">
delete from mybaties.user where id=#{id}
</delete>
</mapper>
然后进行测试,测试通过。
2.类型别名也可以指定一个包名
我们还是先修改mybatis-config.xml配置文件:
<typeAliases>
<package name="com.jms.pojo"/>
</typeAliases>
指定包名后,MyBatis会自动搜索包下的JavaBean,此时又分为没有注解和有注解两种情况。
(1)没有注解
会使用JavaBean的类名,首字母小写来作为它的别名,例如Hello.class,他的别名就是"hello"。接下来我们进行具体的试验。
先修改UserMapper.xml的内容:
<?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">
<!-- 命名空间namespace对应Mapper接口 -->
<mapper namespace="com.jms.dao.UserMapper">
<!-- id对应接口中的方法 -->
<select id="getUsers" resultType="user">
select * from mybaties.user
</select>
<select id="getUserbyid" parameterType="_int" resultType="user">
select * from mybaties.user where id=#{id}
</select>
<insert id="addUser" parameterType="user">
insert mybaties.user value(#{id},#{username},#{password})
</insert>
<update id="UpdateUser" parameterType="user">
update mybaties.user set username=#{username},password=#{password} where id=#{id}
</update>
<delete id="DeleteUser" parameterType="_int">
delete from mybaties.user where id=#{id}
</delete>
</mapper>
测试通过。
经过实验,其实首字母不小写直接用类名也可以,但最好还是使用官方推荐的首字母小写的形式。
(2)有注解
首先,为User类添加注解:
1 package com.jms.pojo;
2
3 import org.apache.ibatis.type.Alias;
4
5 @Alias("hello")
6 public class User {
7 }
此时将其别名注解为"hello",接下来修改UserMapper.xml配置文件中的名字:
<?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">
<!-- 命名空间namespace对应Mapper接口 -->
<mapper namespace="com.jms.dao.UserMapper">
<!-- id对应接口中的方法 -->
<select id="getUsers" resultType="hello">
select * from mybaties.user
</select>
<select id="getUserbyid" parameterType="_int" resultType="hello">
select * from mybaties.user where id=#{id}
</select>
<insert id="addUser" parameterType="hello">
insert mybaties.user value(#{id},#{username},#{password})
</insert>
<update id="UpdateUser" parameterType="hello">
update mybaties.user set username=#{username},password=#{password} where id=#{id}
</update>
<delete id="DeleteUser" parameterType="_int">
delete from mybaties.user where id=#{id}
</delete>
</mapper>
进行测试,通过。
所以上面两种方式都可以进行类型别名优化,那么我们什么时候指定缩写名字,什么时候指定包名呢?
当包中的JavaBean较少时,指定定缩写名字;当包中的JavaBean较多时,指定包名。
三、java内建类型别名补充
下面是一些为常见的 Java 类型内建的类型别名。它们都是不区分大小写的,注意,为了应对原始类型的命名重复,采取了特殊的命名风格。
| 别名 | 映射的类型 |
|---|---|
| _byte | byte |
| _long | long |
| _short | short |
| _int | int |
| _integer | int |
| _double | double |
| _float | float |
| _boolean | boolean |
| string | String |
| byte | Byte |
| long | Long |
| short | Short |
| int | Integer |
| integer | Integer |
| double | Double |
| float | Float |
| boolean | Boolean |
| date | Date |
| decimal | BigDecimal |
| bigdecimal | BigDecimal |
| object | Object |
| map | Map |
| hashmap | HashMap |
| list | List |
| arraylist | ArrayList |
| collection | Collection |
| iterator | Iterator |
可以看到,基本类型是在前面加一个下分隔线,而其他类型是全部小写。
(本文仅作个人学习记录用,如有纰漏敬请指正)
我有一个在Linux服务器上运行的ruby脚本。它不使用rails或任何东西。它基本上是一个命令行ruby脚本,可以像这样传递参数:./ruby_script.rbarg1arg2如何将参数抽象到配置文件(例如yaml文件或其他文件)中?您能否举例说明如何做到这一点?提前谢谢你。 最佳答案 首先,您可以运行一个写入YAML配置文件的独立脚本:require"yaml"File.write("path_to_yaml_file",[arg1,arg2].to_yaml)然后,在您的应用中阅读它:require"yaml"arg
我可以得到Infinity和NaNn=9.0/0#=>Infinityn.class#=>Floatm=0/0.0#=>NaNm.class#=>Float但是当我想直接访问Infinity或NaN时:Infinity#=>uninitializedconstantInfinity(NameError)NaN#=>uninitializedconstantNaN(NameError)什么是Infinity和NaN?它们是对象、关键字还是其他东西? 最佳答案 您看到打印为Infinity和NaN的只是Float类的两个特殊实例的字符串
我不确定传递给方法的对象的类型是否正确。我可能会将一个字符串传递给一个只能处理整数的函数。某种运行时保证怎么样?我看不到比以下更好的选择:defsomeFixNumMangler(input)raise"wrongtype:integerrequired"unlessinput.class==FixNumother_stuffend有更好的选择吗? 最佳答案 使用Kernel#Integer在使用之前转换输入的方法。当无法以任何合理的方式将输入转换为整数时,它将引发ArgumentError。defmy_method(number)
我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm
有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳
我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s
我正在玩HTML5视频并且在ERB中有以下片段:mp4视频从在我的开发环境中运行的服务器很好地流式传输到chrome。然而firefox显示带有海报图像的视频播放器,但带有一个大X。问题似乎是mongrel不确定ogv扩展的mime类型,并且只返回text/plain,如curl所示:$curl-Ihttp://0.0.0.0:3000/pr6.ogvHTTP/1.1200OKConnection:closeDate:Mon,19Apr201012:33:50GMTLast-Modified:Sun,18Apr201012:46:07GMTContent-Type:text/plain
之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m
注意:本文主要掌握DCN自研无线产品的基本配置方法和注意事项,能够进行一般的项目实施、调试与运维AP基本配置命令AP登录用户名和密码均为:adminAP默认IP地址为:192.168.1.10AP默认情况下DHCP开启AP静态地址配置:setmanagementstatic-ip192.168.10.1AP开启/关闭DHCP功能:setmanagementdhcp-statusup/downAP设置默认网关:setstatic-ip-routegeteway192.168.10.254查看AP基本信息:getsystemgetmanagementgetmanaged-apgetrouteAP配
1.1.1 YARN的介绍 为克服Hadoop1.0中HDFS和MapReduce存在的各种问题⽽提出的,针对Hadoop1.0中的MapReduce在扩展性和多框架⽀持⽅⾯的不⾜,提出了全新的资源管理框架YARN. ApacheYARN(YetanotherResourceNegotiator的缩写)是Hadoop集群的资源管理系统,负责为计算程序提供服务器计算资源,相当于⼀个分布式的操作系统平台,⽽MapReduce等计算程序则相当于运⾏于操作系统之上的应⽤程序。 YARN被引⼊Hadoop2,最初是为了改善MapReduce的实现,但是因为具有⾜够的通⽤性,同样可以⽀持其他的分布式计算模