传入SQL查询数据返回object对象

原因:

最近在做老项目迁移

框架【hibenate框架】:传入sql语句实现查询,

若依框架如果需要迁移模块的方法的话,需要写很多实体才能拿到数据

如果全部重构,工作量大,还冗余。

解决办法:

使用原生SQL实现

新项目【若依框架】写原生SQL实现返回object对象,暂时只运用到查询sql,后续用到会继续更新

直接上代码:

mapper层

/**
 * 传sql执行查询语句
 * @author zhang
 *
 */
//@DataSource 配置多数据源注解
@DataSource(DataSourceType.DB_TWENTY)
@Repository
@Mapper
public interface NewTwentySqlMapper {

	/**
	 * 传入sql 查询数据
	 * @param sql
	 * @return
	 */
	List<Map> select(String sql);

	/**
	 * 有序查询
	 * @param sql
	 * @return
	 */
	List<LinkedHashMap> select1(String sql);

	int insert(String sql);

	int update(String sql);
}

mapper.xml

<--namespace :指定mapper接口-->
<mapper namespace="com.bonoon.twenty.globalremediation.mapper.NewTwentySqlMapper">
<select id="select" parameterType="java.lang.String" resultType="java.util.Map"> ${value} </select>
<select id="select1" parameterType="java.lang.String" resultType="java.util.LinkedHashMap"> ${value} </select>
<insert id="insert" parameterType="java.lang.String"> ${value} </insert>
<update id="update" parameterType="java.lang.String"> ${value} </update>
</mapper>

Service层

import java.util.List;

//实现SQL查询的相关接口
public interface NewSQLService {
//查询方法   返List<Object []>
     List<Object []> exeSelect1(String sql);
//查询方法   返List<Object>
     List<Object> exeSelect(String sql);
}

ServiceImpl

package com.bonoon.twenty.globalremediation.service.impl;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
@Slf4j
//若依框架 @DataSource 配置多数据源注解
//连接数据库源 
@DataSource(DataSourceType.DB_TWENTY)
@Service
public class NewSQLServiceImpl implements NewSQLService {

    @Autowired
    private NewTwentySqlMapper newTwentySqlMapper;
    //传入sql实现查询 返
    public List<Object []> exeSelect1(String sql) {
        //TODO 需要完成对数据库的查询操作
        List<Object []> ret = new ArrayList<>();

        List<LinkedHashMap> maps = newTwentySqlMapper.select1(sql);
        for (LinkedHashMap map : maps) {
            Object objs[] = new Object[map.size()];
            int i = 0;
            for (Object entry : map.entrySet()) {
                //查询出现count(表名.字段名)时 返回的列名问题 count(*) count(字段名)不会出现这种问题
            /*if(((Map.Entry)entry).getValue() instanceof HashMap){
                for(Object entry1 : ((HashMap)((Map.Entry)entry).getValue()).entrySet()) {
                    objs[i++]=((Map.Entry)entry1).getValue();
                    break;
                }
                continue;
            }*/
                objs[i++] = ((Map.Entry) entry).getValue();
            }
            ret.add(objs);
        }
        return ret;
    }
    //传入sql实现查询
    public List<Object> exeSelect(String sql) {
        //TODO 需要完成对数据库的查询操作
        List<Object> ret = new ArrayList<>();

        List<LinkedHashMap> maps = newTwentySqlMapper.select1(sql);
        for (LinkedHashMap map : maps) {
            Object objs[] = new Object[map.size()];
            int i = 0;
            for (Object entry : map.entrySet()) {
                //查询出现count(表名.字段名)时 返回的列名问题 count(*) count(字段名)不会出现这种问题
            /*if(((Map.Entry)entry).getValue() instanceof HashMap){
                for(Object entry1 : ((HashMap)((Map.Entry)entry).getValue()).entrySet()) {
                    objs[i++]=((Map.Entry)entry1).getValue();
                    break;
                }
                continue;
            }*/
                objs[i++] = ((Map.Entry) entry).getValue();
            }
            ret.add(objs);
        }
        return ret;
    }
}

配置🆗之后,哪里需要用到则直接调用service即可。

用法举例:

某个方法中需要用到,看一下代码:

package com.bonoon.twenty.globalremediation.service.impl;


@Slf4j
//若依框架 @DataSource 配置多数据源注解
//连接数据库源 
@DataSource(DataSourceType.DB_TWENTY)
@Service
public class JadNewReportFileServiceImpl implements JadNewReportFileService {
   
    //传入SQL实现查询接口
    @Autowired
    private NewSQLService newSQLService;

    /**
     * 
     * 下面那个改成通用的了
     */

    @Override
    public String getNewFileList(SysUser user, Long id, ServletContext context, String dept) {
      //查询的数据
        List<Object[]> vils = new ArrayList<>();
        List<Object[]> nats = new ArrayList<>();
            String nr_sql = " select x.C_ID,x.R_VILLAGEREPORT_ID,x.C_PLACENAME from db_twenty.t_d_nvfillform x where "+指定的查询条件+ " and x.R_TASK_ID = "+指定的查询条件+" and x.C_DELETED = 0 ";
          //查询出来的数据就可以根据想要的形式获取
nats =  newSQLService.exeSelect1(nr_sql);

           String vil_sql = " select x.C_ID,R_AGRUNITAUDIT_ID,x.C_VILNAME from db_twenty.t_d_villagereport x where "+指定的查询条件+" and x.R_TASK_ID = "+指定的查询条件+" and x.C_DELETED = 0 ";
            vils =  newSQLService.exeSelect1(vil_sql);
    }
    }

写到这里就结束了!!!!!需要给个三连支持一下博主

  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程源三zhang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值