ibatis

news/2025/2/21 6:37:18/文章来源:https://www.cnblogs.com/cyj1/p/18723851

 

ibatis基本操作

import java.util.List;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import org.apache.ibatis.annotations.Param;

@Mapper
public interface FileMappigMapper {String selectSql = "SELECT URL, DOWNLOAD_SIZE,"+ "  DATE_FORMAT(EXPIRES_TIME, '%Y-%m-%d %H:%i:%s') AS EXPIRES_TIME,"+ "  FROM FILE_MAPPING ";@Select(selectSql + " WHERE EXPIRES_TIME <= #{expiresTime}")List<FileInfo> listFileMappingBefore(@Param("expiresTime") String expiresTime);@Insert("INSERT INTO FILE_MAPPING(URL, DOWNLOAD_SIZE, DOWNLOAD_TIME) VALUES (\n"+ "    #{url}, #{downloadSize}, #{downloadTime})")int addFileMapping(FileInfo file);@Update("UPDATE FILE_MAPPING SET EXPIRES_TIME=#{expiresTime}, UPDATED_TIME = CURRENT_TIMESTAMP WHERE URL=#{url}")int updateFileExpireTime(@Param("url") String url, @Param("expiresTime") String expiresTime);@Delete("DELETE FROM FILE_MAPPING WHERE URL=#{url}")int deleteFileMapping(String url);
}

 

JSON字段提取函数json_extract  及 sql集合操作示例

 @Select("SELECT SUM(json_extract(CONTENT_JSON, '$.bitrate')) from SESSION "+ "  WHERE CATEGORY='abc' and SERVICE_ID in (${serviceIdList})")public Integer getTotalRequestBitrate(@Param("serviceIdList") String serviceIdList);

将Java非基本类型映射到数据库的某个字符串字段中存储

将复杂Java类转换为JSON字符串,用于存储到数据库中

 @Update("UPDATE SESSION SET "+ "  STATUS_DETAIL=#{detail,typeHandler=io.example.scheduler.mapper.JsonTypeHandler},"+ "  UPDATED_TIME = CURRENT_TIMESTAMP WHERE GTSI = #{gtsi}")public int updateSession(@Param("gtsi") String gtsi, @Param("detail") StatusDetail detail);@Select("SELECT * FROM SESSION")@ResultMap("jobResult")public List<Job> listJob();

相应的在读取数据库时,需要将对应字符串转换为该复杂类,因此需要定义映射文件  

<?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="io.castera.datacastScheduler.mapper.NrtSessionInfoMapper"><resultMap id="jobResult" type="com.example.scheduler.Job" autoMapping="true"><result property="statusDetail" column="STATUS_DETAIL"javaType=""com.example.scheduler.StatusDetail"typeHandler=""com.example.scheduler.mapper.JsonTypeHandler"/></resultMap>
</mapper>

注意“将复杂Java类转换为JSON字符串”时,需要类型转换类

package com.example.scheduler.mapper;import com.fasterxml.jackson.core.JsonProcessingException;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.TypeHandler;public class JsonTypeHandler<T> implements TypeHandler<T>  {private Class<T> dataClass;public JsonTypeHandler(Class<T> dataClass) {if (dataClass == null)throw new IllegalArgumentException("should provide typeClass");this.dataClass = dataClass;}@Overridepublic void setParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException {try {ps.setString(i, parameter== null ? null : Utils.writerSnake.writeValueAsString(parameter));} catch (JsonProcessingException e) {ps.setString(i, null);}}@Overridepublic T getResult(ResultSet rs, String columnName) throws SQLException {return parseString(rs.getString(columnName));}@Overridepublic T getResult(ResultSet rs, int columnIndex) throws SQLException {return parseString(rs.getString(columnIndex));}@Overridepublic T getResult(CallableStatement cs, int columnIndex) throws SQLException {return parseString(cs.getString(columnIndex));}private T parseString(String value) {if (value == null || value.isBlank())return null;try {return Utils.mapperSnake.readValue(value, dataClass);} catch (JsonProcessingException e) {throw new RuntimeException(e);}}
}

将Java非基本类型class展开存储为数据表的多个字段

当属性为非Java基本类型class,但想展开存储在数据库时,比如如下类

@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
public class Schedule {public Recurrence recurrence;public ExtraInfo extraInfo = new ExtraInfo();
}public class Recurrence {public Integer type;  @JsonInclude(value = JsonInclude.Include.CUSTOM, valueFilter = JsonIgnoreNumberFilter.class)public int dailyInterval = 0;@JsonProperty("week_days")public List<String> weekDays; public int monthlyType = 0;
}

想展开存储为如下数据库字段

CREATE TABLE SCHEDULE (RECURRENCE_TYPE  int(11)               DEFAULT NULL,DAILY_INTERVAL   int(11)               DEFAULT NULL,WEEK_DAYS        varchar(128)          DEFAULT NULL,MONTHLY_TYPE     int(11)               DEFAULT NULL,
) DEFAULT CHARSET = utf8;

那么当读取数据库时,需要将相关字段合并为原来的属性类,需要用到resultMap和association

<?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.example.scheduler.mapper.ScheduleMapper"><resultMap id="scheduleResult" type="com.example.scheduler.model.Schedule" autoMapping="true"><result property="extraInfo" column="EXTRA_INFO_JSON"javaType="com.example.scheduler.ExtraInfo"typeHandler="com.example.scheduler.mapper.JsonTypeHandler"/><association property="recurrence" notNullColumn="RECURRENCE_TYPE"javaType="com.example.scheduler.model.Recurrence"><result property="type" column="RECURRENCE_TYPE"/><result property="dailyInterval" column="DAILY_INTERVAL"/><result property="monthlyType" column="MONTHLY_TYPE"/><result property="weekDays" column="WEEK_DAYS" typeHandler="com.example.scheduler.mapper.StringListTypeHandler"/></association></resultMap>
</mapper>

 注意“result” 和“association”的区别:

     result定义数据库中的某个字段与对应属性的类的定义

    association将数据库中的多个字段合并为某个类的一部分属性

Annotation中包含<script> 和 <where>等

import java.util.List;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.ResultMap;
import org.apache.ibatis.annotations.Select;@Mapper
public interface ScheduleMapper {@Select({"<script>","SELECT * from SCHEDULE","  <where> ","    <if test='startDate != null'> START_DATE >= #{startDate} </if>","    <if test='endDate   != null'> AND  #{endDate} >= END_DATE </if>","  </where> ","</script>"})@ResultMap("scheduleResult")public List<Schedule> listSchedules(@Param("startDate") Date startDate, @Param("endDate") Date endDate);@Select({"<script>", selectSql, " WHERE ID= #{id}", "</script>"})@ResultMap("scheduleResult")public Schedule getSchedule(String id);/*** reference to https://mybatis.org/mybatis-3/dynamic-sql.html*/@Insert({"<script> INSERT INTO DS_SCHEDULE(ID, RECURRENCE_TYPE,WEEK_DAYS) VALUES (#{id}, "+ "  <if test='recurrence != null'>"+ "    #{recurrence.type}, #{recurrence.weekDays,typeHandler=io.castera.datacastScheduler.mapper.StringListTypeHandler}"+ "  </if>"+ "  <if test='recurrence == null'> null, null</if>"+ " )","</script>"})public int addSchedule(Schedule sch);
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/886646.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【日记】文竹已经长得比路灯还要高了(1069 字)

正文最近陷入了一个深刻的情感漩涡。一边有些嫌恶爱情,一边又为它焦虑。一边觉得自己只有友谊已经足够了,一边又看见大多数友情并不能如爱情一般陪伴那样长的时间,不说二三十年,甚至不到十年可能便会消亡。觉得其实自己仍然需要它。然而目前这个不太喜欢、又需要一个东西的…

苹果使用AI让皮克斯的灯具复活了。

苹果让皮克斯著名的开场灯具复活,发布了一项新的研究,其中描述它的形容词并不是你通常会在AI研究中使用的那些。 这与我们习惯的一切都不同。它在技术上并不更聪明、更强大,也不是那些害怕AI的人噩梦般的存在。 相反,它似乎是科技巨头首次尝试以不同的方向提升AI和机器人智…

react-native-snap-carousel 轮播图卡在中间的问题

今天在使用react-native-snap-carousel组件的时候,发现一个问题,就是轮播有时候会卡在两个轮播图之间,不左不右的。研究了半天,才发现,开启动量滚动即可 关于enableMomentum的解释 enableMomentum 是 React Native 中 ScrollView 和 FlatList 组件的一个属性,用于控制滚动…

安川机器人维修JZRCR - YPP01 - 1示教器按键故障

在工业生产领域,安川机器人发挥着极为重要的作用。然而,像JZRCR - YPP01 - 1示教器按键出现故障这样的问题会影响机器人的正常运行。一、安川机器人JZRCR - YPP01 - 1示教器按键故障的初步检查外观检查首先,在进行任何深入维修之前,对示教器进行外观检查是必要的。检查按键…

Svelte 最新中文文档教程(13)—— 样式

前言 Svelte,一个非常“有趣”、用起来“很爽”的前端框架。从 Svelte 诞生之初,就备受开发者的喜爱,根据统计,从 2019 年到 2024 年,连续 6 年一直是开发者最感兴趣的前端框架 No.1:Svelte 以其独特的编译时优化机制著称,具有轻量级、高性能、易上手等特性,非常适合构…

数据结构选讲-1 总结

数据结构选讲-1 总结 线段树技巧及其应用。 前言 出题特点:树形 \(polylog\) 数据结构为主,尤其线段树。 侧重数据结构维护算法,使用数据结构进行统计。 强调“从具体情境中抽象出合适的数据及目标”的过程。数据结构本质上是要在数据和目标不变的情况下,优化算法复杂度,降…

Jenkins通过私钥连接Node

本文只要提供一种Jenkins通过私钥连接Node的方法。方法不区分Jenkins版本。大体步骤: (1)生成密钥对 (2)Jenkins上使用私钥配置Credentials (3)Node上配置authorized_keys 文件 (4)添加Node实例 下面演示一个实例。 需求:Jenkins通过私钥方式连接Node(app用户)(1)…

基于条件的访问控制——RBAC

网络威胁极为普遍,无论是公共组织还是私营组织,都面临着数据泄露的风险。一个拥有过多权限的账户,就足以让黑客渗透整个组织。为保护组织免受此类事件的影响,可以根据用户的角色和职责来分配权限。基于角色的访问控制(RBAC)便应运而生。 一、什么是基于条件的访问控制(R…

周界入侵智能识别摄像机

周界入侵智能识别摄像机持续捕捉监控区域内的视频流,并将数据实时传输至中央控制系统。目标检测与跟踪:采用深度学习算法,系统能够自动识别画面中的人、动物或其他物体,并对其进行跟踪分析。行为分析:系统通过对目标运动轨迹和行为模式的分析,判断是否存在异常活动。例如…

解锁零食店管理高效密码:精选工具助你制胜市场

零食集合店管理工具的选择对于提高店铺运营效率、优化库存管理、提升客户满意度等方面至关重要。以下是一些关键的零食集合店管理工具及其功能介绍: 一、门店管理软件 ● 板栗看板: 简单易用,适合小型团队使用。 ● Trello: 以看板形式组织任务,适合敏捷开发团队。 ● Asa…

负载均衡下的Webshell连接处理

免责声明 本文仅用于技术讨论与学习,利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。最近打金融项目的时候,webshell遇见了负载均衡,自己之前其实看过相关文章,但是实战操作起来还是遇见了不少坑点的,接下来…

STAR: 利用时空注意力机制和动态频率损失的视频超分辨率增强框架

STAR (Spatial-Temporal Augmentation with Text-to-Video Models) 提出了一种创新的视频超分辨率解决方案,针对现有模型中存在的过度平滑和时间一致性不足等问题进行了系统性改进。该方法基于文本到视频(T2V)扩散模型架构,通过优化时序建模能力,有效处理复杂退化场景下的视…