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中定义。