前提:本文基于 springboot + mybatis 架构阐述
在工作中项目在不断的迭代和拓展分支,那么可能会出现有些分支使用的数据库是mysql有些是Oracle,那么在项目重构(合并多个分支)时候如何用最合理的方式实现这种需求呢?
难点就在于如何用一套代码同时支持MySQL和Oracle数据源。这两种数据源的大部分sql都一样,但是分页查询的sql就不一样,重点也是解决这种问题。
【1】使用 mybatis的 databaseId来实现,但是需要一个查询接口需要在mapper.xml里写两个sql,
一个是这个接口支持MySQL数据源的,
一个是这个接口支持Oracle数据源的
这样实现代码量变多,后期不利于维护,那么我们完全可以使用 pagehelper 来解决这个问题
【2】使用 pagehelper
首先,引入pagehelper的依赖
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.3</version>
</dependency>
controller 控制层
@RestController
@Slf4j
@RequestMapping("data")
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("query")
public JSONObject query(@RequestBody(required = false) SysMenu sysMenu, PageInfo page){
log.info("收到的请求参数jsonObject:"+sysMenu);
JSONObject result = new JSONObject();
List<JSONObject> list = new ArrayList<>();
list = userService.query(sysMenu, page);
result.put("total",((Page) list).getTotal());
result.put("list",list);
return result;
}
}
业务层
public interface UserService {
List<JSONObject> query(SysMenu sysMenu, PageInfo page);
}
业务层实现类
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
@Override
public List<JSONObject> query(SysMenu sysMenu, PageInfo page) {
PageHelper.startPage(page.getPageNum(), page.getPageSize());
//查询
List<JSONObject> list = userDao.query(sysMenu);
return list;
}
}
dao层
@Mapper
public interface UserDao {
List<JSONObject> query(@Param("sysMenu") SysMenu sysMenu);
}
mapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.zxy.dataone.dao.UserDao" >
<select id="query" resultType="com.alibaba.fastjson.JSONObject">
select
MENU_NAME menuName,
OID ,
MENU_DESC menuDesc
from CCOD_SYS_MENU
where 1=1
<if test="sysMenu != null">
<if test="sysMenu.menuName != null and sysMenu.menuName != ''">
and MENU_NAME = #{sysMenu.menuName}
</if>
<if test="sysMenu.menuDesc != null and sysMenu.menuDesc != ''">
and MENU_DESC = #{sysMenu.menuDesc}
</if>
</if>
order by oid ASC
</select>
</mapper>
实体类
public class SysMenu {
@JsonProperty(value = "menuName")
private String menuName;
@JsonProperty(value = "menuDesc")
private String menuDesc;
private Integer oid;
public String getMenuName() {
return menuName;
}
public void setMenuName(String menuName) {
this.menuName = menuName;
}
public String getMenuDesc() {
return menuDesc;
}
public void setMenuDesc(String menuDesc) {
this.menuDesc = menuDesc;
}
public Integer getOid() {
return oid;
}
public void setOid(Integer oid) {
this.oid = oid;
}
}
启动测试即可,本章仅做入门阐述,具体的原理下一篇再进行深入剖析