功能
标签名称
定义sql
select
insert
delete
update
动态sql
if
连用标签
choose
when
otherwise
trim
where
set
foreach
定义常量
sql
表信息定义
resultMap
Mybatis中mapper.xml
注意事项:sql结尾不用加;号
二、标签解读USER_ID,USER_NAME,SEX,AGE,CREATE_DATE user_id = #{userId} and user_name = #{userName}
select 标签的使用
属性
描述
id
在空间命名中唯一的标识符,可以被用来引用这条语句。如:id=”key”
parameterType
将要传入这条语句的参数类的完全限定名或别名 例:com.test.poso.User或user。这个属性是可选的,因为mybatis可以通过TypeHandler推断出具体传入语句的参数,默认值是unset(“未设置”或者解释成“依赖驱动”)。如:parameterType=”java.lang.String”
resultType
语句返回值类型或别名。注意,如果是集合,那么这里填写的是集合的泛型,而不是集合本身(resultType 与resultMap 不能并用)。如resultType=”java.lang.String”
resultMap
外部resultMap的命名引用。如:resultMap=”baseResultMap”
Insert、update、delete 标签的使用
属性
描述
id
在空间命名中唯一的标识符,可以被用来引用这条语句。如:id=”key”
parameterType
将要传入这条语句的参数类的完全限定名或别名 例:com.test.poso.User或user。这个属性是可选的,因为mybatis可以通过TypeHandler推断出具体传入语句的参数,默认值是unset(“未设置”或者解释成“依赖驱动”)。如:parameterType=”java.lang.String”
keyProperty
仅对insert和update有用,唯一标记一个属性,mybatis会通过getGeneratedKeys的返回值或者通过insert语句的select Key子元素设置它的键值,默认为unset。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表
foreach 标签的使用
属性
描述
1)、#和$两者含义不同
#{} 占位符、${} 拼接符
#会把传入的数据都当成一个字符串来处理,会在传入的数据上面加上双引号,变量替换后,#{} 对应的变量自动加上单引号#{} 能防止sql 注入
而$则是把传入的数据直接显示在sql语句中,不会添加双引号。变量替换后,${} 对应的变量不会加上单引号${} 不能防止sql 注入
2)、举例说明
其中如果传入的username类型为字符型,比如输入zhangsan,那么username=#{username}#表示的就是username=”zhangsan”,如果传入的username类型为数值类型,比如输入11,那么username=#{username}#表示的就是username=”11”。
其中如果传入的username类型为整型类型,那么在执行sql语句时就不会出错,但是如果传入的username类型为字符串型,比如输入zhangsan,那么username=${username}就会变成username=zhangsan,执行会报错,所以sql语句必须写成下面这样。
#{} 和 ${} 的实例:假设传入参数为 1
(1)开始
1)#{}:select * from t_user where uid=#{uid}
2)${}:select * from t_user where uid= '${uid}'
(2)然后
1)#{}:select * from t_user where uid= ?
2)${}:select * from t_user where uid= '1'
(3)最后
1)#{}:select * from t_user where uid= '1'
2)${}:select * from t_user where uid= '1'
3)、#{} 和 ${} 在使用中的技巧和建议
(1)不论是单个参数,还是多个参数,一律都建议使用注解@Param("")
(2)能用 #{} 的地方就用 #{},不用或少用 ${}
(3)表名作参数时,必须用 ${}。如:select * from ${tableName}
(4)order by 时,必须用 ${}。如:select * from t_user order by ${columnName}
(5)使用 ${} 时,要注意何时加或不加单引号,即 ${} 和 '${}'
2、foreach 也就是遍历迭代,在SQL中通常用在 in 这个关键词的后面
foreach元素的属性主要有 item,index,collection,open,separator,close。
分别代表:
item表示集合中每一个元素进行迭代时的别名,要和#{}中的名字保持一致
index用于表示在迭代过程中,每次迭代到的位置,
open表示该语句以什么开始,
separator表示在每次进行迭代之间以什么符号作为分隔符,
close表示以什么结束
关于collection属性
首先需要知道mybatis怎么处理参数的,传递给XXXMapper接口方法的所有参数会被放到一个map中(后面叫这个map为M),假设存在参数properties:
- 传递List类型的参数,则会在M里有一条 {"list" : properties },所以此时collection设置为“list”就等于拿出M中key="list"的value,然后遍历它。
- 传递数组类型参数, 则会在M里有一条{"array", properties},所以此时需要设置collection="array".
- 传递Map类型的参数, 不会做任何转换,假设你的Map类型的参数中包含的是{"china" :"beijing", "usa":"w.d.c"}, 那么M中就有两条映射:{"china" :"beijing", "usa":"w.d.c"} 。
- 如果传入的是一个bean,那么的bean中的属性作为key,属性值作为value放到M中。
- 如果传入的是一个基本类型变量,那么M中就会存在一条key是变量名,value是变量值(由于jdk7之前反射无法拿到参数名,可以使用下面介绍的注解)。
综上,collection能够指定的值就是M中最终存在的key,
以上都是假设你没有在Mapper的接口方法上使用mybatis提供的注解org.apache.ibatis.annotations.Param注解参数名时collection的默认值,如果你在参数上使用了这个注解,那么最终M中的key是注解名,value是参数值,如下:
public interface PersonMapper { void insertPerson1(@Param("map") Mappersons); } 使用注解时M中就存在一条"map" -> persons的映射,而不是上面介绍的把persons的key,value直接方到M中 那么可以在PersonMapper.xml中: INSERT INTO mybatis.person VALUES 这里collection="map", 相当于拿到M.get("map")的值,也就是persons, 然后遍历persons, 遍历的结果是index是persons的key, item是对应的value(#{person.name}, #{person.age})
而最为重要的就是collection属性了,既然是迭代就表示传入的参数是多个,这时候传入的参数就有以下几种可能:
1. 传入的参数为list(set的话,替换掉list就行了)的时候
public ListselectByIds(List ids); select * from user where id in #{item}
假设接口中传递的list如下所示:
List
list = new ArrayList<>();
list.add("zhangsan");
list.add("lisi");
list.add("wangwu");
可以看到的是foreach标签指定了逗号作为分隔符,那么mybatis将会解析出foreach标签里面的内容作为一个整体然后再其后面拼接上逗号分隔符,拼接后的过程如下所示:
( //第一步,拼接open指定的开始字符
('zhangsan' //第二步,迭代集合,拼接对应的item
('zhangsan', //第三步,拼接separator指定的分隔符
('zhangsan','lisi' //第四步,迭代集合,拼接对应的item
('zhangsan','lisi', //第五步,拼接separator指定的分隔符
('zhangsan','lisi','wangwu' //第六步,迭代集合,拼接对应的item
('zhangsan','lisi','wangwu') //第七步,拼接close指定的闭合字符
最终结果是:
('zhangsan','lisi','wangwu')
如果在foreach标签前面加上select … from table where … in ,将会变形成
SELECt * FROM user WHERe user_name in ('zhangsan','lisi','wangwu')
2. 传入的参数为Array的时候
public ListselectByIds(int[] ids); select * from user where id in #{item}
3. 传入的参数为Map的时候
map的时候需要注意的是:collection的值“ids”是存储在map中的key(比如:map.put("ids",ids));尤其需要注意;
public List四、注意事项selectByIds(Map params); select * from user where id in #{item}
1、split方法:colleation=”prodNum.split(‘,’)”
2、
3、以下标签需要结合使用
4、对象.属性的形式:If(test=”person.name != null and person.name != ‘’”)
5、size方法:list.size > 0
6、toString方法,判断条件为等于的时候,常量需要加 .toString() 来转换,这种方法是稳定的,推荐使用:age == '0'.toString()
7、不等于号:!=、]]>
术语 CDATA 指的是不应由 XML 解析器进行解析的文本数据(Unparsed Character Data)。
在 XML 元素中,"<" 、">" 和 "&" 是非法的。
"<" 会产生错误,因为解析器会把该字符解释为新元素的开始。">",解析器会把该字符解释为新元素的结束
"&" 也会产生错误,因为解析器会把该字符解释为字符实体的开始。
是什么,这是XML语法。在CDATA内部的所有内容都会被解析器忽略。
因此"<"、“>”、“<>”,需要用、]]>、、=]]>、]]>
8、括号的运用:test="(grtrList != null and grtrList.size > 0) or (grteList != null and grteList.size > 0)"
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)