在项目开发过程中,高效地查询数据库数据是一项关键任务。本文将介绍如何使用 MyBatis Plus 自定义 SQL 查询语句来获取特定的数据,以满足项目中的实际需求。
一、项目背景
在高校办事大厅数据分析大屏项目中,需要从数据库中获取个人事务中心的相关数据,包括事务 ID 和状态信息,以及特定事务 ID 的热门计数。为了实现这些功能,我们采用了 MyBatis Plus 框架,并通过自定义 SQL 查询语句来获取所需的数据。
二、技术选型
- MyBatis Plus:MyBatis Plus 是一个 MyBatis 的增强工具包,在 MyBatis 的基础上进行了扩展,提供了更多便捷的功能,如通用 CRUD 操作、分页插件、代码生成器等。它简化了数据库操作,提高了开发效率。
三、具体实现
1. MyBatisX代码生成
步骤一:安装插件
步骤二:右键单击需要查询的表格,再点击MybatisX-Generator项
步骤三:选择代码生成模块包位置
步骤四:配置代码生成项如图
步骤五:最后将generate包中的代码类分别移到Controller包、Service包、Mapper包下,并且修正引用类即可。
2. Mapper 层定义
首先,在 Mapper 接口中定义了三个查询方法,分别用于获取个人事务中心的事务 ID 和状态信息、仅获取事务 ID 以及获取特定事务 ID 的热门计数。
@Mapper
public interface OshPersonalAffairsCenterMapper extends BaseMapper<JSONObject> {List<JSONObject> selectPersonalAffairsIdAndStatus();List<JSONObject> selectPersonalAffairsId();Long selectHotCount(@Param("affairId") String affairId);
}
这里使用了@Mapper
注解将接口标记为 MyBatis 的 Mapper 接口,以便在运行时自动生成实现类。同时,resultType
被设置为com.alibaba.fastjson.JSONObject
,表示查询结果将以 JSON 对象的形式返回。
3. SQL 语句定义
在 Mapper 的 XML 文件中,定义了三个 SQL 查询语句:
<select id="selectPersonalAffairsIdAndStatus" resultType="com.alibaba.fastjson.JSONObject">SELECT DISTINCT process_type_code,status from osh_personal_affairs_center
</select>
<select id="selectPersonalAffairsId" resultType="com.alibaba.fastjson.JSONObject">SELECT DISTINCT process_type_code from osh_personal_affairs_center
</select>
<select id="selectHotCount" resultType="java.lang.Long" parameterType="java.lang.String">SELECT count(process_type_code) from osh_personal_affairs_center where process_type_code = #{affairId}
</select>
这三个查询语句分别用于获取不同的数据:
selectPersonalAffairsIdAndStatus
:获取个人事务中心的不同事务 ID 和对应的状态。selectPersonalAffairsId
:仅获取个人事务中心的不同事务 ID。selectHotCount
:根据传入的事务 ID,获取该事务 ID 在数据库中的出现次数,即热门计数。
4. Service 层实现
在 Service 实现类中,通过调用 Mapper 层的方法来实现具体的业务逻辑。
@Service
public class OshPersonalAffairsCenterServiceImpl extends ServiceImpl<OshPersonalAffairsCenterMapper, JSONObject>implements OshPersonalAffairsCenterService {@ResourceOshPersonalAffairsCenterMapper oshPersonalAffairsCenterMapper;// 获取当前状态列表@Overridepublic List<DynamicsResVo> getCurrentStatus() {List<JSONObject> jsonObjects = oshPersonalAffairsCenterMapper.selectPersonalAffairsIdAndStatus();List<DynamicsResVo> contentRespVOS = new ArrayList<>();Set<String> uniqueTransactions = new HashSet<>();for (JSONObject jsonObject : jsonObjects) {String transaction = jsonObject.getString("process_type_code");if (!uniqueTransactions.contains(transaction)) {DynamicsResVo respVO = new DynamicsResVo();respVO.setTransaction(transaction);int status = jsonObject.getInteger("status");String statusText;switch (status) {case 0:if (!checkForHigherStatus(jsonObjects, transaction, 1) &&!checkForHigherStatus(jsonObjects, transaction, 2)) {statusText = "已处理";respVO.setStatus(statusText);}break;case 1:if (!checkForHigherStatus(jsonObjects, transaction, 2)) {statusText = "待处理";respVO.setStatus(statusText);}break;default:statusText = "未知状态";}if (respVO.getStatus()!= null) {contentRespVOS.add(respVO);uniqueTransactions.add(transaction);}}}return contentRespVOS;}// 检查是否存在更高优先级的状态private boolean checkForHigherStatus(List<JSONObject> jsonObjects, String transaction, int higherStatus) {for (JSONObject jsonObject : jsonObjects) {if (jsonObject.getString("process_type_code").equals(transaction) && jsonObject.getInteger("status") == higherStatus) {return true;}}return false;}// 获取热门图表数据@Overridepublic List<ChartResVo> getHotChart() {List<JSONObject> jsonObjects = oshPersonalAffairsCenterMapper.selectPersonalAffairsId();List<ChartResVo> chartData = new ArrayList<>();for (JSONObject jsonObject : jsonObjects) {String affairId = jsonObject.getString("process_type_code");Long count = oshPersonalAffairsCenterMapper.selectHotCount(affairId);ChartResVo chartVo = new ChartResVo();chartVo.setTransaction(affairId);chartVo.setTimes(count);chartData.add(chartVo);}return chartData;}
}
在getCurrentStatus
方法中,首先调用selectPersonalAffairsIdAndStatus
方法获取事务 ID 和状态信息的列表。然后,通过遍历列表,为每个不同的事务 ID 创建一个DynamicsResVo
对象,并根据状态值设置对应的状态文本。同时,使用一个Set
集合进行去重操作,确保每个事务 ID 只出现一次。
在checkForHigherStatus
方法中,遍历 JSON 对象列表,检查是否存在特定事务 ID 且状态为更高优先级的情况。
在getHotChart
方法中,先调用selectPersonalAffairsId
方法获取事务 ID 列表,然后遍历列表,对于每个事务 ID,调用selectHotCount
方法获取热门计数,并创建ChartResVo
对象添加到结果列表中。
四、总结
通过使用 MyBatis Plus 自定义 SQL 查询语句,我们成功地实现了从数据库中获取特定数据的功能。这种方式灵活高效,可以根据项目的实际需求进行定制化的查询。在项目开发中,合理地运用 MyBatis Plus 的功能,可以大大提高开发效率,同时也能保证代码的可读性和可维护性。
希望本文能为大家在使用 MyBatis Plus 进行数据库查询时提供一些参考和帮助。