mybatis SQL 语句构建器的使用

SQL 语句构建器

mybatis – MyBatis 3 | SQL 语句构建器

案例:

第一步:创建构造器类

批量更新
public class DishesInfoSql {
    public String createDeleteDishesInfoSQL(@Param("ids") List<Integer> ids){
        return new SQL(){{
            UPDATE("dishes");
            SET("flag=0");
            for (int i = 0; i <ids.size() ; i++) {
                WHERE("d_id="+ids.get(i));
                if(i!=ids.size()-1){
                    OR();
                }
            }
        }}.toString();
    }
}

编译后的mysql语句如下
image-20220108202129869

批量插入
public class OrderDishInfoSql {
    public String createInsertOrderDishInfoSQL(@Param("orderDishes") List<OrderDishes> orderDishes){
        return new SQL(){{
            INSERT_INTO("order_dishes").
            INTO_COLUMNS("o_id","d_id","d_num");
            for (int i = 0; i < orderDishes.size(); i++) {
                //借助hutool的转换工具将int类型的数据变成字符串
                INTO_VALUES(Convert.toStr(orderDishes.get(i).getOrder().getOId()),
                        Convert.toStr(orderDishes.get(i).getDishes().getDId()),
                        Convert.toStr(orderDishes.get(i).getDNum()))
                    	.ADD_ROW();
            }
        }}.toString();
    }

编译后的mysql语句如下

image-20220108200354628

批量删除
public class SeatInfoSql {
    public String createDeleteSeatInfoSQL(@Param("ids") List<Integer> ids){
        return new SQL(){{
          DELETE_FROM("seat");
            for (int i = 0; i <ids.size() ; i++) {
                WHERE("s_id="+ids.get(i));
                if(i!=ids.size()-1){
                    OR();
                }
            }
        }}.toString();
    }
}

编译后的mysql语句如下

image-20220108202310096

普通的更新
public class UserInfoSql {
    public String createUpdateUserInfoSQL(UserInfo userInfo){
        return new SQL(){{
            UPDATE("userInfo");
            if(userInfo.getPassword()!=null){
                SET("password=#{password}");
            }
            if(userInfo.getSalt()!=null){
                SET("salt=#{salt}");
            }
            if(userInfo.getEmail()!=null){
                SET("email=#{email}");
            }
            if(userInfo.getAvatar()!=null){
                SET("avatar=#{avatar}");
            }
            if(userInfo.getIsblock()!=0){
                SET("isblock="+userInfo.getIsblock());
            }
            WHERE("username=#{username}");
        }}.toString();
    }

编译后的mysql语句如下

image-20220108202441532

第二步:使用注解引用该类

@Mapper
public interface DishesMapper {
    @UpdateProvider(type = DishesInfoSql.class, method = "createDeleteDishesInfoSQL")
    int deleteList(@Param(value = "ids")List<Integer> ids);
}


public interface DishesService {
    int deleteList(@Param(value = "ids")List<Integer> ids);
}



@Service
public class DishesServiceImpl implements DishesService {

    @Resource
    private DishesMapper dishesMapper;

    @Override
    public int deleteList(List<Integer> ids) {
        return dishesMapper.deleteList(ids);
    }
}



方法 @InsertProvider @UpdateProvider @DeleteProvider @SelectProvider 允许构建动态 SQL。这些备选的 SQL 注解允许你指定返回 SQL 语句的类和方法,以供运行时执行。(从 MyBatis 3.4.6 开始,可以使用 CharSequence 代替 String 来作为返回类型)。当执行映射语句时,MyBatis 会实例化注解指定的类,并调用注解指定的方法。你可以通过 ProviderContext 传递映射方法接收到的参数、“Mapper interface type” 和 “Mapper method”(仅在 MyBatis 3.4.5 以上支持)作为参数。(MyBatis 3.4 以上支持传入多个参数) 属性:valuetypemethoddatabaseIdvalue and type 属性用于指定类名 (The type attribute is alias for value, you must be specify either one. But both attributes can be omit when specify the defaultSqlProviderType as global configuration)。 method 用于指定该类的方法名(从版本 3.5.1 开始,可以省略 method 属性,MyBatis 将会使用 ProviderMethodResolver 接口解析方法的具体实现。如果解析失败,MyBatis 将会使用名为 provideSql 的降级实现)。提示 接下来的“SQL 语句构建器”一章将会讨论该话题,以帮助你以更清晰、更便于阅读的方式构建动态 SQL。 The databaseId(Available since 3.5.5), in case there is a configured DatabaseIdProvider, the MyBatis will use a provider method with no databaseId attribute or with a databaseId that matches the current one. If found with and without the databaseId the latter will be discarded.
方法 描述
SELECT(String) 开始新的或追加到已有的 SELECT子句。可以被多次调用,参数会被追加到 SELECT 子句。 参数通常使用逗号分隔的列名和别名列表,但也可以是数据库驱动程序接受的任意参数。
SELECT_DISTINCT(String) 开始新的或追加到已有的 SELECT子句,并添加 DISTINCT 关键字到生成的查询中。可以被多次调用,参数会被追加到 SELECT 子句。 参数通常使用逗号分隔的列名和别名列表,但也可以是数据库驱动程序接受的任意参数。
FROM(String) 开始新的或追加到已有的 FROM子句。可以被多次调用,参数会被追加到 FROM子句。 参数通常是一个表名或别名,也可以是数据库驱动程序接受的任意参数。
JOIN(String),INNER_JOIN(String),LEFT_OUTER_JOIN(String),RIGHT_OUTER_JOIN(String) 基于调用的方法,添加新的合适类型的 JOIN 子句。 参数可以包含一个由列和连接条件构成的标准连接。
WHERE(String) 插入新的 WHERE 子句条件,并使用 AND 拼接。可以被多次调用,对于每一次调用产生的新条件,会使用 AND 拼接起来。要使用 OR 分隔,请使用 OR()
OR() 使用 OR 来分隔当前的 WHERE 子句条件。 可以被多次调用,但在一行中多次调用会生成错误的 SQL
AND() 使用 AND 来分隔当前的 WHERE子句条件。 可以被多次调用,但在一行中多次调用会生成错误的 SQL。由于 WHEREHAVING都会自动使用 AND 拼接, 因此这个方法并不常用,只是为了完整性才被定义出来。
GROUP_BY(String) 追加新的 GROUP BY 子句,使用逗号拼接。可以被多次调用,每次调用都会使用逗号将新的条件拼接起来。
HAVING(String) 追加新的 HAVING 子句。使用AND 拼接。可以被多次调用,每次调用都使用AND来拼接新的条件。要使用 OR 分隔,请使用 OR()
ORDER_BY(String) 追加新的 ORDER BY 子句,使用逗号拼接。可以多次被调用,每次调用会使用逗号拼接新的条件。
LIMIT(String) LIMIT(int) 追加新的 LIMIT 子句。 仅在 SELECT()UPDATE()DELETE() 时有效。 当在 SELECT() 中使用时,应该配合 OFFSET() 使用。(于 3.5.2 引入)
OFFSET(String) OFFSET(long) 追加新的 OFFSET 子句。 仅在 SELECT() 时有效。 当在 SELECT() 时使用时,应该配合 LIMIT() 使用。(于 3.5.2 引入)
OFFSET_ROWS(String)``OFFSET_ROWS(long) 追加新的 OFFSET n ROWS 子句。 仅在 SELECT() 时有效。 该方法应该配合 FETCH_FIRST_ROWS_ONLY() 使用。(于 3.5.2 加入)
FETCH_FIRST_ROWS_ONLY(String) FETCH_FIRST_ROWS_ONLY(int) 追加新的 FETCH FIRST n ROWS ONLY 子句。 仅在 SELECT() 时有效。 该方法应该配合 OFFSET_ROWS() 使用。(于 3.5.2 加入)
DELETE_FROM(String) 开始新的 delete 语句,并指定删除表的表名。通常它后面都会跟着一个WHERE 子句!
INSERT_INTO(String) 开始新的 insert 语句,并指定插入数据表的表名。后面应该会跟着一个或多个 VALUES()调用,或 INTO_COLUMNS()INTO_VALUES() 调用。
SET(String) update 语句追加 "set" 属性的列表
UPDATE(String) 开始新的 update 语句,并指定更新表的表名。后面都会跟着一个或多个 SET() 调用,通常也会有一个 WHERE() 调用。
VALUES(String, String) 追加数据值到 insert 语句中。第一个参数是数据插入的列名,第二个参数则是数据值。
INTO_COLUMNS(String...) 追加插入列子句到 insert 语句中。应与 INTO_VALUES() 一同使用。
INTO_VALUES(String...) 追加插入值子句到 insert 语句中。应与 INTO_COLUMNS() 一同使用。
ADD_ROW() 添加新的一行数据,以便执行批量插入。(于 3.5.2 引入)

第三步:调用

    @PostMapping("/deleteBatch")
    public Result<?> deleteBatch(@RequestBody List<Integer> ids) {
        int i = dishesService.deleteList(ids);
        if(i>0){
            return Result.success(200, "删除成功");
        }else{
            return Result.success(404, "删除失败");
        }
    }

你可能感兴趣的:(笔记,mybatis,mybatis)