如何改进Mybatis的xml自定义sql

 如何改进Mybatis的xml自定义sql

mybatis的用法:

a)

使用动态 SQL 最常见情景是根据条件包含 where 子句的一部分。比如:

<select id="findActiveBlogWithTitleLike"
     resultType="Blog">
  SELECT * FROM BLOG
  WHERE state = ‘ACTIVE’
  <if test="title != null">
    AND title like #{title}
  </if>
</select>

b)

foreach
动态 SQL 的另一个常见使用场景是对集合进行遍历(尤其是在构建 IN 条件语句的时候)。比如:

<select id="selectPostIn" resultType="domain.blog.Post">
  SELECT *
  FROM POST P
  <where>
    <foreach item="item" index="index" collection="list"
        open="ID in (" separator="," close=")" nullable="true">
          #{item}
    </foreach>
  </where>
</select>

是不是很累赘,本来简单的事情,却变得复杂了。

下面来看下,如何使用简单的方法来实现。

1.List, Set转SQL in

定义的sql:

select * from orders where userid in #{userid @in}

Java代码:

			Map<String, Object> map = new HashMap<>();
			
			List<String> list=new ArrayList<>();
			list.add("bee");
			list.add("orders3");
			list.add("orders4");
			map.put("userid", list);

            select(sqlIn, map);


	private static void select(String sql,Map<String,Object> map) {
		List<Orders> list3 = preparedSql.select(sql, new Orders(), map,1,3);//map
		for (int i = 0; i < list3.size(); i++) {
			Logger.info(list3.get(i).toString());
		}
	}

生成的sql:

[INFO] [Bee] ========= get the dbName from the Connection is :MySQL
[INFO] [Bee] PreparedSql select SQL: select * from orders where userid in  (?,?,?)   [values]: bee(String),orders3(String),orders4(String)
[INFO] [Bee] PreparedSql select SQL:  ( ExecutableSql )
select * from orders where userid in  ('bee','orders3','orders4')
[INFO] [Bee]  | <--  select rows: 5

Bee V1.11 对in操作,支持List, Set两种类型

2. 批量插入操作

无需像foreach之类的标签, Bee框架会自动为我们处理.

			String sql9="INSERT INTO orders(id,name,userid) VALUES (#{id},#{name},#{userid});";
			final String USERID="userid";
			final String NAME="name";
			final String ID="id";
			Map<String,Object> insertMap1=new HashMap<>();
			insertMap1.put(USERID, "1001");
			insertMap1.put(NAME, "bee");
			insertMap1.put(ID, 121L);
			
			Map<String,Object> insertMap2=new HashMap<>();
			insertMap2.put(USERID, "1001");
			insertMap2.put(NAME, "bee");
			insertMap2.put(ID, 122L);
			
			Map<String,Object> insertMap3=new HashMap<>();
			insertMap3.put(USERID, "1001");
			insertMap3.put(NAME, "bee");
			insertMap3.put(ID, 123L);
			
			List<Map<String, Object>> parameterMapList=new ArrayList<>();
			parameterMapList.add(insertMap1);
			parameterMapList.add(insertMap2);
			parameterMapList.add(insertMap3);
			

	//		preparedSql.insertBatch(sql9, parameterMapList,2);

			preparedSql.insertBatch(sql9, parameterMapList);

生成的sql:

INSERT INTO orders(id,name,userid) VALUES (?,?,?), (?,?,?), (?,?,?)

可以看到,使用Mysql时,Bee框架会为我们智能的添加多组占位符.

3. <if isNotNull>,<if isNotBlank>

select * from orders where <if isNotNull>userid in #{userid@in}</if>

当#{userid@in}里声明的参数userid的值不为null时,才解析<if isNotNull> </if>之间的代码.

<if isNotBlank>类似,表示不为null且不为空字符时,才解析.

select * from orders where <if isNotBlank>name like #{%name}</if>

当不解析if时,

sql变为:select * from orders where,

Bee为自动将where删除. 变成正确的: select * from orders

4.@toIsNULL1,@toIsNULL2

我们看下这个SQL自定义语句.

select * from orders where userid=#{userid}

当userid为null时,会转成
 

select * from orders where userid=null

这是不对的.应该是:

select * from orders where userid is null

使用@toIsNULL1和@toIsNULL1就可以解决这个问题.当是null时, 就转成is null.
 

select * from orders where userid=#{userid @toIsNULL1}

select * from orders where id>=#{id@toIsNULL2}

@toIsNULL1,@toIsNULL2后面的数字1和2是告诉Bee框架,要将标签前的一个或两个字符删除.

一般是"="或">="之类的符号.

可以看到,使用ORM Bee更加简单方便。

源码官网:

https://github.com/automvc/bee

源码:

src/main/java/org/teasoft/exam/bee/osql/PreparedSqlCustomAutoSqlTokenExam.java · automvc/bee-exam - Gitee.com

### 如何在 MyBatis 中传入自定义 SQL Flowable 引擎利用其底层框架 MyBatis 的功能来定义自定义 SQL 语句[^1]。为了实现这一点,MyBatis 提供了一种灵活的方式来编写动态 SQL 和静态 SQL。 #### 使用 MyBatis 编写静态 SQL 对于简单的查询操作,可以直接在映射文件中书写标准的 SQL 语句: ```xml <select id="selectUsers" resultType="User"> SELECT * FROM users WHERE status = #{status} </select> ``` 这段代码展示了如何创建一个名为 `selectUsers` 的查询方法,并指定返回的结果类型为 User 类型的对象。这里使用了参数占位符 `#{}` 来表示传递给 SQL 查询的实际值[^2]。 #### 动态 SQL 支持 当需要构建更复杂的条件查询时,可以借助于 MyBatis 的动态 SQL 特性。这允许根据不同的业务逻辑组合多个 SQL 片段。常用的标签有 `<if>`、`<choose>`(配合 `<when>`, `<otherwise>`)、`<trim>` (用于处理 where 子句和 set 子句),以及 `<foreach>` 等等[^3]。 例如,在执行批量更新或插入时,可以通过如下方式遍历集合中的每一项并将其加入到 IN 或者 VALUES 列表里: ```xml <insert id="batchInsertItems"> INSERT INTO items (name, price) VALUES <foreach collection="list" item="item" separator=","> (#{item.name}, #{item.price}) </foreach> </insert> ``` 此片段说明了怎样在一个 insert 语句内循环迭代 Java 集合 `list` 并依次添加每条记录的数据[^4]。 #### 调用存储过程 如果要调用数据库端已有的存储过程,则可以在 Mapper 文件中声明相应的命令,并设置合适的输入输出参数配置。下面是一个例子展示如何向 MySQL 数据库的一个存储过程中传送 List 参数: ```xml <update id="callStoredProcedureWithListParameter"> {CALL sp_process_items( <foreach collection="items" item="item" open="(" close=")" separator=","> #{item.id}, #{item.value} </foreach> ) } </update> ``` 上述 XML 显示了一个 update 方法用来触发名为 `sp_process_items` 的存储过程,并且通过 foreach 循环将列表里的各个成员作为单独参数传送给它。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值