相关配置
传参
- 传递多参数
根据id改变 name 和 age
public void updataData(int id,String name,int age);
<mapper> <update id = "updataDdata"> update record_t t set t.name = #{1},t.age = #{2} where t.id = #{0} /update> </mapper>
|
上面的数字代表updataData中参数的位置,注意,这样写就不要写 parameType了。
public void updateData( @Param(value = "pId") int id, @Param(value = "pName") String name, @Param(value = "pAge") int age);
|
<mapper> <update id = "updateDdata"> update record_t t set t.name = #{pName}, t.age = #{pAge} where t.id = #{pId} /update> </mapper>
|
这样可以直接使用上面方法的参数来用,这样语义明了,也不用写parameType,推荐这样写。
- 传入javaBean实体entity
javabean(entity) :package com.aim.entity public class RoleScore{ private String _Name; private int _Score; private int _Id; }
|
repo :
package com.aim.repo; public inteface PlayScoreRepo{ public void updateData( RoleScore entity); }
|
mapper:
<mapper namespace = "com.aim.repo.PlayScoreRepo"> <update id = "updateDdata" parameterType = "com.aim.entity.RoleScore > update record_t t set t.name = #{_Name}, t.age = #{_Age} where t.id = #{_Id} /update> </mapper>
|
此时,如果RoleScore类里面多了个类,比如RoleScoreInside类,这个类里面有两个属性,sex,time.
public class RoleScore{ private String _Name; private int _Score; private int _Id; private RoleScoreInside other; }
|
这时传参其他都没变,就多了调用,如:
<mapper namespace = "com.aim.repo.PlayScoreRepo"> <update id = "updateDdata" parameterType = "com.aim.entity.RoleScore > update record_t t set t.name = #{_Name}, t.age = #{_Age} , t.sex = #{other.sex}, t.time = #{other.time}, where t.id = #{_Id} /update> </mapper>
|
sql id 及inclusde refid用法
通过这个语句达到SQL最大的复用
<Mapper namespace = "" > <sql id = "aim_column"> id,name,sex,score </sql> <select id = "" parameterType = "" resultType = ""> select <include refid = "aim_colum"> from t where id = #{id} </select>
|
sql复用
在mybatis中,我们可以將sql语句中公共的部分提取出来,然后需要该段sql的地方通过include标签引入即可,这样可以达到sql语句复用的目的。
例如我们有两条相似的查询语句:
<select id="queryUserInfoByName" parameterType="string" resultType="user"> select * from User where username = #{username} </select> <select id="queryUserInfoByPhone" parameterType="string" resultType="user"> select * from User where phone = #{phone} </select>
|
我们可以通过``标签,把公共的部分定义成一个块:
<sql id="queryUserInfo"> select * from User where </sql>
|
则上面的查询语句可以改写成:
<select id="queryUserInfoByName" parameterType="string" resultType="user"> <include refid="queryUserInfo"></include> username = #{username} </select> <select id="queryUserInfoByPhone" parameterType="string" resultType="user"> <include refid="queryUserInfo"></include> phone = #{phone} </select>
|
if标签
拿查询语句举例:
在severs层里得写if(score!=null)
select * from 表名 where id = 2 and score => 25
|
用if写法:
<select id = "" parateType = "entity" resultType = "entity"> select * from 表名 where id = 2 <if test = "score!=null"> and score > 25 </if> </select> </select>
|
where 标签
在where标签处会动态生成where
不需要关心标签中的输出
去除多余的and 和 or
例子:
当id!= null 时用id查,否则不使用id查
当score!=null 时用score查询,否则不使用score查询
select * from 表 where <if test ="id!=null"> id = #{id} </if> <if test = "score != null"> and score score >25 </if>
|
动态where
select * from 表 <where> <if test = "id!= null"> id = #{id} </if> <if test = "score !=null"> and score >25 </if> </where>
|
这里动态where标签会自动的判断他包括的sql语句,会使其符合sql语句的规范而输出,比如省略and,两个if都不满足就不输出等。
set 标签
在update语句时,set后会有多个if标签,参考前面的where标签,这个标签也是动态的识别标签内的值,去掉逗号等多余的语句。
update 表名 <set> <if test = " name != null and name !=' '"> name = #{name}, </if> <if test = "score ! = null and score !=''"> score = #{score}, </if> <if test = "role!= null and role!=''"> role = #{role} </if> </set> where id = #{id}
|