Mybatis最入门---映射文件(2)

本文介绍了Mybatis中<sql>标签的使用,通过引用id实现SQL代码复用,以及参数获取的多种方式,包括处理特殊数据类型和设置jdbcType。还提到了字符串替换的特殊用法,以在SQL语句中插入不变的字符串。

[一步是咫尺,一步即天涯]

接上文,Mapper文件是Mybatis的核心,如果只是想上文那样的书写方式,Mybatis的优点看起来就没有那么有优势了。因此,本文我们来继续介绍Mybatis基本常用的书写方式,请各位看官仔细学习。

-------------------------------------------------------------------------------------------------------------------------------------

正文开始:

1.<sql>标签

这个标签为我们提供了极大的SQL代码重用的方式,包含在其中的SQL语句可以通过引用id的方式,类似于形式参数的表现形式,在多个地方引用。而实际的sql语句只出现了一次。

1.具体做法如下:在Mapper.xml文件中加入如下内容

<sql id="Base_Column_List">
<span style="white-space:pre">	</span>Address,User,Password,Dr,Ts
</sql>
2.以Select语句为例,说明使用方法,具体内容如下:

<select id="findAccount" resultMap="BaseResultMap">
        select
        <include refid="Base_Column_List"/>
        from tb_account
</select>
3.上述的<sql>标签中的语句是静态用法,除此之外,另外一种动态加载的参数化的用法,如下:

<sql id="userColumns"> ${alias}.id,${alias}.password </sql>
4.修改select语句为如下内容:

<select id="findUserById" parameterType="String" resultType="User">
select <include refid="userColumns"><property name="alias" value="u"/></include> from sysuser u where id=#{id}
</select>
5.测试方法:执行junit test方法即可。

6.更加灵活的用法是:假设我们系统中存在多张*user表,不同时刻需要从不同的表中获得数据。此时我们可以采用如下的方式进行查询,同样,我们还是以HelloWorld工程select语句为例,具体内容如下:

<sql id="Base_Column_List">
		id,password
	</sql>
	<sql id="sometable"> ${prefix}user </sql>
	<sql id="someinclude">
  		from
    	<include refid="${include_target}"/>
	</sql>
	<select id="findUserById" parameterType="String" resultType="User">
		select <include refid="Base_Column_List"/> 
		<include refid="someinclude">
    		<property name="prefix" value="sys"/>
    		<property name="include_target" value="sometable"/>
  		</include>
		 where id=#{id}
	</select>
7.这里的<property name="prefix" value="sys"/>自动的将value的值“sys”与上文的<sql id="sometable"> ${prefix}user </sql>中的“user”进行拼接,即形成我们的sysuser表。

由此,我们也可以将属性值用于包含refid值,或者,包含sql语句中的属性值。

-------------------------------------------------------------------------------------------------------------------------------------

2.参数获取

在前文中,我们简单叙述了参数值获取的基本方式,接下来我们来介绍更多在参数方面的使用方法。

1.首先我们先回顾一下最简单的HelloWorld工程中的select语句,如下:

 <select id="findUserById" parameterType="String" resultType="User">  
        select * from sysuser where id=#{id}  
 </select>  
2.在上面这个示例中,参数被设置为String类型,这个参数的值可以是任何内容,对于java的基本类型,我们可以直接使用类似于上面的方式进行。但对于多个参数的复杂对象就必须按照下面的方法来使用我们的Mybatis了,具体内容如下:

<insert id="insertUser" parameterType="User" >
	insert into sysuser (Id,password) values(#{id},#{password})
</insert>
如果存在一个User对象被传递到语句用,那么id,password都会被查找,然后将他们传入到预处理语句的参数中。这样是不是非常简单呢?

3.除此之外,我们还可以对参数设置一个特殊的数据类型,如:

#{property,javaType=int,jdbcType=NUMERIC}
4.这里的“property”就是属性的名称,如id,password等,“javaType”即属性的数据类型,如int,String,long等等,但不可以是HashMap。“jdbcType”即属性值对应于数据库中的类型,具体的配置就请各位看官按照自己的设置,配置对应值即可。

特别的!!!!

如果某个时刻程序中运行了一个Null对象传入给Mybatis,此时,对应于数据库中所有可能为空的列,jdbcType是必须设置的。

为了处理某些类型的数据,我们也可以执行一个特殊的处理类来处理,配置方式如下:

#{age,javaType=int,jdbcType=NUMERIC,typeHandler=MyTypeHandler}
5.关于typeHandler的含义即用法,请参考前文Mybatis最入门---配置详解(下)

其实,上述的这个特例,我们平时基本是用不到的,这里指出来,也是为了防止在某些情况下,我们发现了很隐藏的bug而导致了未知的错误。

另外对于数值类型的值,我们还可以设置保留小数位,具体配置方式如下:

#{height,javaType=double,jdbcType=NUMERIC,numericScale=2}

特殊用法:字符串替换

默认情况下,使用#{}格式的语法会导致 MyBatis 创建预处理语句属性并安全地设置值(比如?)。这样做更安全,更迅速,通常也是首选做法,不过有时你只是想直接在 SQL 语句中插入一个不改变的字符串。比如,像 ORDER BY,你可以这样来使用:

ORDER BY ${columnName}
这里 MyBatis 不会修改或转义字符串。
请特别注意!!!以这种方式接受从用户输出的内容并提供给语句中不变的字符串是不安全的,会导致潜在的 SQL 注入攻击,因此要么不允许用户输入这些字段,要么自行转义并检验。

-------------------------------------------------------------------------------------------------------------------------------------
至此,Mybatis最入门---映射文件(2)结束


参考文档:

官方文档:http://www.mybatis.org/mybatis-3/







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值