一、写MyBatis代码前分析
- 编写接口方法(Mapper接口文件 )
- 传入参数
- 返回参数(如果有返回,如查找SQL返回一个实体类,记得在对应SQL映射文件(如UserMapper.xml)中的sql语句加上resultType属性)
- 编写SQL语句(SQL映射文件,在resource 和Mapper接口文件相同路径中)
注意:在实现添加功能时,在编写方法时记得编写提交事务!!!
二、动态SQL
1,基本知识
- if
- choose (when, otherwise)
- trim (where, set)
- foreach
下面重点讲解if和where的使用
使用if时要注意:
<select id="selectByCondition" resultMap="brandResultMap">
select *
from tb_brand
where
<if test="status != null">
and status = #{status}
</if>
<if test="companyName != null and companyName != '' ">
and company_name like #{companyName}
</if>
<if test="brandName != null and brandName != '' ">
and brand_name like #{brandName}
</if>
</select>
如果这样写代码,在下面这种第一个if判断为false时的情况会出现报错
Map map = new HashMap();
// map.put("status" , status);
map.put("companyName", companyName);
map.put("brandName" , brandName);
报错原因,拼接出的sql语句有问题(下面的where后面直接跟了一个and):
select * from tb_brand where and company_name like ? and brand_name like ?
解决方法:将if和where结合
where的作用:
- 替换where关键字
- 会动态的去掉第一个条件前的 and
- 如果所有的参数没有值则不加where关键字
<select id="selectByCondition" resultMap="brandResultMap">
select *
from tb_brand
<where>
<if test="status != null">
and status = #{status}
</if>
<if test="companyName != null and companyName != '' ">
and company_name like #{companyName}
</if>
<if test="brandName != null and brandName != '' ">
and brand_name like #{brandName}
</if>
</where>
</select>
注意,每个语句前都有一个and
2,单个条件的动态sql
1)需求案例:
如上图所示,在查询时只能选择 品牌名称
、当前状态
、企业名称
这三个条件中的一个,但是用户到底选择哪儿一个,我们并不能确定。这种就属于单个条件的动态SQL语句。
这种需求需要使用到 choose(when,otherwise)标签
实现, 而 choose
标签类似于Java 中的switch语句,when
标签相当于cath。
<select id="selectByConditionSingle" resultMap="brandResultMap">
select *
from tb_brand
<where>
<choose><!--相当于switch-->
<when test="status != null"><!--相当于case-->
status = #{status}
</when>
<when test="companyName != null and companyName != '' "><!--相当于case-->
company_name like #{companyName}
</when>
<when test="brandName != null and brandName != ''"><!--相当于case-->
brand_name like #{brandName}
</when>
</choose>
</where>
</select>
2,批量删除数据
1)需求案例分析:
如上图所示,用户可以选择多条数据,然后点击上面的 删除
按钮,就会删除数据库中对应的多行数据。
2)实现:使用sql语句中的in关键字:delete from … where id in
一个数组
foreach 标签
用来迭代任何可迭代的对象(如数组,集合)。
- collection 属性:
- mybatis会将数组参数,封装为一个Map集合。
- 默认:array = 数组
- 使用@Param注解改变map集合的默认key的名称
- item 属性:本次迭代获取到的元素。
- separator 属性:集合项迭代之间的分隔符。
foreach
标签不会错误地添加多余的分隔符。也就是最后一次迭代不会加分隔符。 - open 属性:该属性值是在拼接SQL语句之前拼接的语句,只会拼接一次
- close 属性:该属性值是在拼接SQL语句拼接后拼接的语句,只会拼接一次
三、多参数传递
1,接收多个参数需要使用 @Param
注解
例子:
User select(@Param("username") String username,@Param("password") String password);
<select id="select" resultType="user">
select *
from tb_user
where
username=#{username}
and password=#{password}
</select>
要相同!!!
原理:
我们在接口方法中定义多个参数,Mybatis 会将这些参数封装成 Map 集合对象,值就是参数值,而键在没有使用 @Param
注解时有以下命名规则:
- 以 arg 开头 :第一个参数就叫 arg0,第二个参数就叫 arg1,以此类推。如:
map.put(“arg0”,参数值1);
map.put(“arg1”,参数值2);
- 以 param 开头 : 第一个参数就叫 param1,第二个参数就叫 param2,依次类推。如:
map.put("param1",参数值1);
map.put("param2",参数值2);
验证:
User select(String username,String password);
<select id="select" resultType="user">
select *
from tb_user
where
username=#{arg0}
and password=#{arg1}
</select>
或者:
<select id="select" resultType="user">
select *
from tb_user
where
username=#{param1}
and password=#{param2}
</select>
所以:在接口方法参数上使用 @Param
注解,Mybatis 会将 arg
开头的键名替换为对应注解的属性值。
三、注释实现CRUD
- 查询 :@Select
- 添加 :@Insert
- 修改 :@Update
- 删除 :@Delete
@Select("select * from tb_user where username = #{username} and password = #{password}")
User select(@Param("username") String username, @Param("password") String password);
@Select("select * from tb_user where username = #{username}")
User SelectName(String username);
@Insert("insert into tb_user(username,password) values(#{username},#{password})")
void Add(@Param("username") String username, @Param("password") String password);
一个注释对应一个sql语句