mybatis对象或数组转成临时表join

in数据太多导致查询延迟

工作上跨服务调用传递的id数组 然后根据数组里的id 去in 一个表。618的时候发现查询老是超时。然后我这边准备优化

对象入参变成临时表的方法

一开始是想着把对象变成一个临时表 通过jion 连接去查询。
找了一下发现可以用select 1,2,3 …这种该方法
sql 的 select 可以指定常量,包括对象里面的数据。根据 mybatis 语法可以直接select #{字段名1} as amount,#{字段名2} as store_code 就可以转换这个对*象,

代码实例
/**
*sql 的 select 可以指定常量,当然就包括对象里面的数据。所以根据 mybatis 语法我们*可以直接select #{字段名1} as amount,#{字段名2} as store_code 就可以转换这个对*象,
*/
SELECT * FROM tb_product p LEFT JOIN (
SELECT #{num} as a , #{age} as b
)ab ON p.product_id = ab.a 

数组入参变成临时表的方法

sql语法中有个union这个操作,可以用union可以连多行数据,就像这样:

select 10 as a, 30 as b
union 
select 20 as a ,40 as b

mybatis中可以用foreach 。这种方式的数据量也是在一个定值才不慢

SELECT
        *
        FROM tb_product p
        LEFT JOIN (
                <foreach collection="productIdList" item="productId" index="index" separator="union">
                    SELECT
                    #{productId.num} as a,
                    #{productId.age} as b
                </foreach>
        )ab ON p.product_id = ab.a
      
        

in方式可以改成多查询

  1. mysql in 超过 300 个,性能就会严重下降。 建议,先写临时表,再关联查询
  2. 可以拆分成多个list 多次查询比一次查询性能要快
  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
MyBatis 中,我们可以使用自定义类型处理器将数组入参转换为临时表,并使用临时表进行 join 操作。下面是一些大致的步骤: 1. 创建一个自定义类型处理器,实现 TypeHandler 接口,并在其中编写将数组转换为临时表的逻辑。 2. 在 MyBatis 的配置文件中配置该自定义类型处理器。 3. 在 Mapper 接口中编写 SQL 语句,使用该自定义类型处理器将数组入参转换为临时表,并进行 join 操作。 以下是一些示例代码,帮助你更好地理解: 1. 自定义类型处理器 ```java public class ArrayTypeHandler implements TypeHandler<Object[]> { @Override public void setParameter(PreparedStatement ps, int i, Object[] parameter, JdbcType jdbcType) throws SQLException { // 将数组转换为临时表 Connection connection = ps.getConnection(); String tempTableName = "temp_table_" + UUID.randomUUID().toString().replace("-", ""); PreparedStatement createTempTableStatement = connection.prepareStatement("CREATE TEMPORARY TABLE " + tempTableName + " (id INT)"); createTempTableStatement.executeUpdate(); createTempTableStatement.close(); PreparedStatement insertTempTableStatement = connection.prepareStatement("INSERT INTO " + tempTableName + " VALUES (?)"); for (Object item : parameter) { insertTempTableStatement.setObject(1, item); insertTempTableStatement.addBatch(); } insertTempTableStatement.executeBatch(); insertTempTableStatement.close(); // 设置参数为临时表 ps.setString(i, tempTableName); } @Override public Object[] getResult(ResultSet rs, String columnName) throws SQLException { throw new UnsupportedOperationException("Not implemented"); } @Override public Object[] getResult(ResultSet rs, int columnIndex) throws SQLException { throw new UnsupportedOperationException("Not implemented"); } @Override public Object[] getResult(CallableStatement cs, int columnIndex) throws SQLException { throw new UnsupportedOperationException("Not implemented"); } } ``` 2. MyBatis 配置文件中配置自定义类型处理器 ```xml <typeHandlers> <typeHandler handler="com.example.ArrayTypeHandler"/> </typeHandlers> ``` 3. Mapper 接口中编写 SQL 语句 ```xml <select id="getUsersByIDs" resultMap="userMap"> SELECT u.id, u.name, u.age, r.role_name FROM users u JOIN roles r ON u.role_id = r.id JOIN ${ids, typeHandler=com.example.ArrayTypeHandler} t ON u.id = t.id </select> ``` 其中 `${ids}` 表示数组入参,`typeHandler` 属性指定了使用哪个自定义类型处理器将数组转换为临时表。在 SQL 语句中,我们使用了该临时表进行 join 操作。 希望这些代码可以帮助你理解如何在 MyBatis 中将数组入参转换为临时表,并进行 join 操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值