SELECT * FROM User
WHERE name LIKE #{pattern}
6、xml中的timestamp比较
第一种写法:
原符号 < <= > >= & ’ "
替换符号 < <= > >= & ' "
例如:sql如下:
create_date_time >= #{startTim
《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》
【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享
e} 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;
7、@Param
@Param是MyBatis所提供的(org.apache.ibatis.annotations.Param),作为Dao层的注解,作用是用于传递参数,从而可以与SQL中的的字段名相对应,一般在2=<参数数<=5时使用最佳。
(1)原始的方法
当只有一个参数时,没什么好说的,传进去一个值也只有一个参数可以匹配。当存在多个参数时,传进去的值就区分不开了,这时可以考虑用Map,例如接口
public List findRoleByMap(Map<String, Object> parameter);
SELECT id,name FROM t_role
WHERE roleName=#{roleName}
AND note=#{note}
(2) 使用@Param
很明显上面的缺点就在于可读性差,每次必须阅读他的键,才能明白其中的作用,并且不能限定其传递的数据类型,下面是使用@Param的情况,需要将接口改为
public List 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 findRoleByBean(RoleParam role);
这样对应的xml文件与1处的区别就在于id和parameterType发生了变化,id对应的方法和parameterType对应该类的权限定名。
而使用更多的场景可能是这样的,对应多个POJO
public List findRoleByMix(@Param(“roleP”) RoleParam role, @Param(“permissionP”) PermissionParam permission);
这样就可以进行如下映射
SELECT id,name FROM t_role
WHERE roleName=#{roleP.roleName}
AND note=#{rolep.note}
AND level=#{permissionP.level}
注意此时并不需要写出parameterType属性,Mybatis会进行自动搜索。
(3)总结
-
当你不使用@Param注解来声明参数时,必须使用使用 #{}方式;
-
便于传多个参数;
-
类似于别名之类的功能;
三、批量插入
<?xml version="1.0" encoding="UTF-8" ?>
insert into fund
( id,fund_name,fund_code,date_x,data_y,create_by,create_date,update_by,update_date,remarks,del_flag)
values
(
#{item.id},
#{item.fundName},
#{item.fundCode},
#{item.dateX},
#{item.dataY},
#{item.createBy},
#{item.createDate},
#{item.updateBy},
#{item.updateDate},
#{item.remarks},
#{item.delFlag}
)
四、useGeneratedKeys参数
1、在settings元素中设置useGeneratedKeys参数
对于支持自动生成记录主键的数据库,如:MySQL,SQL Server,此时设置useGeneratedKeys参数值为true,在执行添加记录之后可以获取到数据库自动生成的主键ID。
实际上,在settings元素中设置useGeneratedKeys是一个全局参数,但是只会对接口映射器产生影响,对xml映射器不起效。
此时,在接口映射中添加记录之后将返回主键ID。
public interface UserMapper {
// 受全局useGeneratedKeys参数控制,添加记录之后将返回主键id
@Insert(“insert into user(id,name,age) values(#{id},#{name},#{age})”)
Integer insertUser(User user);
}
另外,在settings元素中设置的全局useGeneratedKeys参数对于xml映射器无效。如果希望在xml映射器中执行添加记录之后返回主键ID,则必须在xml映射器中明确设置useGeneratedKeys参数值为true。
2、在xml映射器中配置useGeneratedKeys参数
insert into user(id,name,age) values(#{id},#{name},#{age})
xml映射器中配置的useGeneratedKeys参数只会对xml映射器产生影响,且在settings元素中设置的全局useGeneratedKeys参数值对于xml映射器不产生任何作用。
3、在接口映射器中设置useGeneratedKeys参数
// 设置useGeneratedKeys为true,返回数据库自动生成的记录主键id
@Options(useGeneratedKeys = true, keyProperty = “id”, keyColumn = “id”)
@Insert(“insert into user(id,name,age) values(#{id},#{name},#{age})”)
Integer insertUser(User user);
请注意如果此时在接口映射器中又明确设置了useGeneratedKeys参数,那么注解映射器中的useGeneratedKeys参数值将覆盖settings元素中设置的全局useGeneratedKeys参数值。
举个例子:先在settings元素中设置全局useGeneratedKeys参数值为true,再在接口映射器中设置useGeneratedKeys参数值为false,添加记录之后将不能返回注解ID。
五、MyBatis xml文件中postgres数据库字符串转timestamp写法
SELECT name
FROM user
WHERE birthdaey < TO_TIMESTAMP(#{start}, ‘yyyy-mm-dd hh24:mi:ss’)
AND birthdaey >= TO_TIMESTAMP(#{end}, ‘yyyy-mm-dd hh24:mi:ss’)
ORDER BY birthdaey DESC
LIMIT 1;
六、鉴别器