一、写MyBatis代码前分析

  • 编写接口方法(Mapper接口文件 )
  • 传入参数
  • 返回参数(如果有返回,如查找SQL返回一个实体类,记得在对应SQL映射文件(如UserMapper.xml)中的sql语句加上resultType属性)
  • java的sql动态传参 动态sql语句传参数_java的sql动态传参

  • 编写SQL语句(SQL映射文件,在resource 和Mapper接口文件相同路径中)
    注意:在实现添加功能时,在编写方法时记得编写提交事务!!!
  • java的sql动态传参 动态sql语句传参数_java_02

二、动态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)需求案例:

java的sql动态传参 动态sql语句传参数_SQL_03


如上图所示,在查询时只能选择 品牌名称当前状态企业名称 这三个条件中的一个,但是用户到底选择哪儿一个,我们并不能确定。这种就属于单个条件的动态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)需求案例分析:

java的sql动态传参 动态sql语句传参数_sql_04


如上图所示,用户可以选择多条数据,然后点击上面的 删除 按钮,就会删除数据库中对应的多行数据。

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>

java的sql动态传参 动态sql语句传参数_java的sql动态传参_05


要相同!!!

原理:

我们在接口方法中定义多个参数,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语句

java的sql动态传参 动态sql语句传参数_java的sql动态传参_06