原因:
最近在做老项目迁移
框架【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);
}
}
写到这里就结束了!!!!!需要给个三连支持一下博主