1.插入多条数据并获取主键
一个非常简单的插入sql
insert into table (aa,bb,cc) values(xx,xx,xx),(yy,yy,yy)
在Mapper中写入对应的sql模板
insert into xxxx (xx) value (xxx)
2.批量插入数据 并返回主键
SELECT
LAST_INSERT_ID()
insert into table
(aa, bb,cc)
values
separator=",">
( #{item.aa},#{item.bb},#{item.cc} )
3.批量执行多条sql
首先数据库连接字符串需要加上如下参数,允许一次提交多条sql
allowMultiQueries=true
update t_customer set
c_name = #{cus.name},
c_age = #{cus.age},
c_sex = #{cus.sex},
c_ceroNo = #{cus.ceroNo},
c_ceroType = #{cus.ceroType}
where id = #{cus.id}
4.通过 resultMap 获取一个包含一个子属性是javabean的查询结果List
select * from student
select * from clazz where id = #{id}
5.通过 resultMap 获取一个包含一个子属性是List的查询结果List
select * from student where clazz_id = #{id}
select * from clazz where
6.一对多查询中使用懒加载模式
1.sql 属性 添加 fetchType="lazy"
2.mybatis设置开启懒加载
7.动态创建sql
语法: if choose(when otherwise) set foreach bind
if
:条件判断语句 一般作为where子句的一部分
test的值为一个表达式 多个逻辑判断使用and连接
UPDATE user_account SET `password` = #{password}
WHERE id = #{id}
choose(when otherwise):
choose,when,otherwise组合使用,达到使用switch的效果
select * from userinfo
where department=#{department}
where position=#{position}
where gender=#{gender}
where:
where元素主要解决多个if判断内包含where条件的问题,加入第一个if的where条件不成立,则之后条件成立的if语句内的sql会多一个and,因为它以及变整个sql上的第一个where条件了。
例如:
select * from user where
id = #{id}
and name = #{name}
假如id值为null,name则变成 select * from user where and name = #{name}
现在改成如下代码,则在id为null的情况下,会自动过滤第二个条件中的and
select * from user where
id = #{id}
and name = #{name}
set:
set用于update语句,在update语法中,有个set关键词用于设置值,比如update users set name = 'new name' where id = #{id}
我们发现更新的字段和更新的值都是一一对应的,假如我的sql并不确定要更新那些列,需要根据传入的参数,如果值不为null则更新。这个是要就可以使用set元素。
update user
name = #{name}
name = #{gae}
name = #{sex}
name = #{class}
where id = #{id}
foreach:
foreach 主要用于遍历一个集合。
collection表示要遍历的元素 index 表示索引 item 表示每个子元素 open close 表示 首位 用什么字符串包括,separator表示分隔符
select * from user where id in
#{id}
bind:
在sql定义内部定义一个临时变量
select * from user where name like #{pattern}
trim:
trim配合set或者where完成格式化,主要解决多个动态列之间的关联问题
因为使用if条件之后并不确定最终那些字段是开头,那个字段是末尾。可能导致开头会多个and 末尾多个逗号。
trim的属性使用prefix设置起始字符串,suffix设定末尾字符串 prefixoverride指定需要消除的多余的起始字符串,suffixoverride指定需要消除的多余的末尾字符串
#{id, jdbcType=VARCHAR},
#{memberId, jdbcType=VARCHAR},
#{messageClassify, jdbcType=VARCHAR},
#{messageCode, jdbcType=VARCHAR},
#{messageContent, jdbcType=VARCHAR},
8.使用Provider注解调用自定义的sql构建方法
mybatis中具体某个查询的定义可以写在一个mapper中,也可以写在查询定义接口的注解上。
如果在mapper中,则可以使用 foreach when之类的语法动态构建SQL。
而使用注解定义SQL的话,则可以使用@SelectProvider @UpdateProvider等注解自定义动态SQL的构建方法。
相应的属性使用@Options定义。Provider类一般命名为【***DynaSqlProvider】
例如:
@SelectProvider(type = UrlInterceptor.class,method = "getList")
ListgetList();
public String getList() {
return new SQL() {{
SELECT("*");
FROM("table_name");
WHERE("status = 1");
}}.toString();
}
在SQL类中直接使用了实例初始化块构建了一个SQL,这也是一种比较常见的类初始化方式。在SQL类中,提供了 SELECT FROM JOIN LEFT_JOIN OR AND 等语法。基本和sql的语法一致。
使用了Provider之后,我们可以通过java代码实现动态SQL构建,而不是一定要在mapper中定义。