MyBatis 常用标签和注解(绝对经典)
<sql id="valid"> where valid = 1 </sql>
<select id = 'queryUser'>select * from user <include refid = 'valid'></include>
2、insert?– 映射插入语句
<insert id = "saveUser">insert into User (id,name,sex) values (#{id},#{name},#{sex})<insert>
3、update?– 映射更新语句
<update id="updateUser">
update User set
name = #{name},
sex= #{sex}
where id = #{id}
</update>
4、delete?– 映射删除语句
<delete id="deleteUser">
delete from User where id = #{id}
</delete>
二、动态 sql 标签
1、if
<select id="findUserByName"
resultType="User">
SELECT * FROM User
WHERE valid = 1
<if test="name!= null">
AND name like #{name}
</if>
</select>
2、choose (when, otherwise)
<select id="findUser"
resultType="User">
SELECT * FROM User WHERE age = 26
<choose>
<when test="name!= null">
AND name like #{name}
</when>
<when test="sex!= null ">
AND sex like #{sex}
</when>
<otherwise>
AND valid = 1
</otherwise>
</choose>
</select>
3、trim (where, set)
//prefixOverrides 属性会忽略通过管道分隔的文本序列(注意此例中的空格也是必要的)。它的作用是移除所有指定在 prefixOverrides 属性中的内容,并且插入 prefix 属性中指定的内容。
<trim prefix="WHERE" prefixOverrides="AND |OR ">
...
</trim>
//set 元素会动态前置 SET 关键字,同时也会删掉无关的逗号
<trim prefix="SET" suffixOverrides=",">
...
</trim>
4、foreach
//collection="要遍历的集合"
//item = "可以在元素体内使用的集合项"
//index = "索引"
//open = "开始字符串"
//separator = "分隔符"
//close = "结束字符串"
<select id="selectUser" resultType="User">
SELECT *
FROM User
WHERE ID in
<foreach item="item" index="index" collection="list"
open="(" separator="," close=")">
#{item}
</foreach>
</select>
5、bind
//bind 可以创建一个变量并将其绑定到上下文
<select id="selectUser" resultType="user">
<bind name="pattern" value="'%' + _parameter.getTitle() + '%'" />
SELECT * FROM User
WHERE name LIKE #{pattern}
</select>
6、xml 中的 timestamp 比较
第一种写法:
原符号 < <= > >= & ' "
替换符号 < <= > >= & ' "
例如:sql 如下:
create_date_time >= #{startTime} and create_date_time <= #{endTime}
第二种写法:
大于等于
<![CDATA[ >= ]]>
小于等于
<![CDATA[ <= ]]>
例如:sql 如下:
create_date_time <![CDATA[ >= ]]> #{startTime} and create_date_time <![CDATA[ <= ]]> #{endTime}
<select id="getUser"
resultType="java.lang.String" >
select name from user
where birthday < TO_TIMESTAMP(#{start}, 'yyyy-mm-dd hh24:mi:ss')
and birthday >= TO_TIMESTAMP(#{end}, 'yyyy-mm-dd hh24:mi:ss') order by start desc LIMIT 1;
</select>
7、@Param
@Param 是 MyBatis 所提供的(org.apache.ibatis.annotations.Param),作为 Dao 层的注解,作用是用于传递参数,从而可以与 SQL 中的的字段名相对应,一般在 2=<参数数<=5 时使用最佳。
(1)原始的方法
当只有一个参数时,没什么好说的,传进去一个值也只有一个参数可以匹配。当存在多个参数时,传进去的值就区分不开了,这时可以考虑用 Map,例如接口
public List<Role> findRoleByMap(Map<String, Object> parameter);
<select id="findRoleByMap" parameterType="map" resultType="role">
SELECT id,name FROM t_role
WHERE roleName=#{roleName}
AND note=#{note}
<select>
(2) 使用 @Param
很明显上面的缺点就在于可读性差,每次必须阅读他的键,才能明白其中的作用,并且不能限定其传递的数据类型,下面是使用 @Param 的情况,需要将接口改为
public List<Role> findRoleByAnnotation(@Param("roleName") String roleName, @Param("note") String note);
这样我们就可以直接传入对应的值了。
当然也可以使用 Java Bean 来传递多个参数,定义一个 POJO
public class RoleParam {
private String roleName;
private String note;
/getter 和 setter/
}
此时接口就变为
public List<Role> findRoleByBean(RoleParam role);
这样对应的 xml 文件与 1 处的区别就在于 id 和 parameterType 发生了变化,id 对应的方法和 parameterType 对应该类的权限定名。
而使用更多的场景可能是这样的,对应多个 POJO
public List<Role> findRoleByMix(@Param("roleP") RoleParam role, @Param("permissionP") PermissionParam permission);
这样就可以进行如下映射
<select id="findRoleByMix" resultType="role">
SELECT id,name FROM t_role
WHERE roleName=#{roleP.roleName}
AND note=#{rolep.note}
AND level=#{permissionP.level}
<select>
注意此时并不需要写出 parameterType 属性,Mybatis 会进行自动搜索。
(3)总结
当你不使用 @Param 注解来声明参数时,必须使用使用 #{}方式;
便于传多个参数;
类似于别名之类的功能;
三、批量插入
<?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" >
<mapper namespace="com.center.manager.mapper.FundMapper">
<insert id="insertForeach" parameterType="java.util.List" useGeneratedKeys="false">
insert into fund
( id,fund_name,fund_code,date_x,data_y,create_by,create_date,update_by,update_da
te,remarks,del_flag)
values
<foreach collection="list" item="item" index="index" separator=",">
(
#{item.id},
#{item.fundName},
#{item.fundCode},
#{item.dateX},
#{item.dataY},
#{item.createBy},
#{item.createDate},
#{item.updateBy},
#{item.updateDate},
#{item.remarks},
#{item.delFlag}
)
</foreach>
</insert>
</mapper>
评论