diff --git a/Web/html/body/video.html b/Web/html/body/video.html
index e7e2316..7d33b11 100644
--- a/Web/html/body/video.html
+++ b/Web/html/body/video.html
@@ -242,21 +242,22 @@
var chartView = null;
function initChart(roomId, videoId) {
getVideoGiftInfo(roomId, videoId)
- .then(data => {
- if (data.status != 100) {
+ .then(json => {
+ if (json.status != 100) {
return
}
var lables = [];
var values = [];
- data.data.guardInfo.forEach(item => {
+ json.data.guardInfo.forEach(item => {
lables.push(item.gift_name + "\n" + item.total_price + "¥")
values.push(item.total_num)
});
- data.data.giftInfo.forEach(item => {
+ json.data.giftInfo.forEach(item => {
lables.push(item.gift_name + "\n" + item.total_price + "¥")
values.push(item.total_gift_num)
});
- setChart(lables, values, data)
+ setChart(lables, values, json)
+ initSC(json.data.superChat)
})
}
@@ -364,7 +365,6 @@
getDanmu(getParam('roomId'), videoId, page)
.then(data => {
if (page === 0) {
- initSC(data.data.superChat)
$('#danmuSize').get(0).innerHTML = data.data.danmuCount;
barrageRenderer.setBarrages(data.data.danmu)
} else {
diff --git a/src/main/java/com/yutou/biliapi/databases/BiliLiveDatabase.java b/src/main/java/com/yutou/biliapi/databases/BiliLiveDatabase.java
index a7e6501..2ab2fb7 100644
--- a/src/main/java/com/yutou/biliapi/databases/BiliLiveDatabase.java
+++ b/src/main/java/com/yutou/biliapi/databases/BiliLiveDatabase.java
@@ -2,26 +2,23 @@ package com.yutou.biliapi.databases;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
-import com.alibaba.fastjson2.util.DateUtils;
import com.yutou.biliapi.bean.live.*;
import com.yutou.biliapi.bean.live.database.*;
import com.yutou.biliapi.bean.websocket.live.*;
-import com.yutou.bilibili.Tools.DateFormatUtils;
+import com.yutou.bilibili.datas.web.LiveWebDanmuBean;
import com.yutou.common.databases.AbsDatabasesBean;
import com.yutou.common.databases.SQLiteManager;
import com.yutou.common.okhttp.HttpDownloadUtils;
import com.yutou.common.utils.Log;
-import lombok.Getter;
-import org.apache.poi.ss.usermodel.DataFormat;
import java.io.File;
+import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
+import java.util.ArrayList;
import java.util.Date;
import java.util.List;
-import static com.alibaba.fastjson2.util.DateUtils.DateTimeFormatPattern.DATE_FORMAT_10_DASH;
-
public class BiliLiveDatabase extends SQLiteManager {
LiveRoomConfig config;
String fileName;
@@ -125,7 +122,7 @@ public class BiliLiveDatabase extends SQLiteManager {
"SUM(`gift_num`) AS `total_gift_num`," +
"CASE " +
"WHEN `coin_type` = 'silver' THEN 0 " +
- "ELSE SUM(`price` / 100 * `gift_num`) " +
+ "ELSE SUM(`price` / 1000 * `gift_num`) " +
"END AS `total_price`" +
"FROM " +
"`gift` " +
@@ -144,10 +141,10 @@ public class BiliLiveDatabase extends SQLiteManager {
"filtered_gifts " +
"GROUP BY " +
"`gift_name`, `icon`;";
- String guardSql = "SELECT `gift_name`, SUM(`num`) AS `total_num`,SUM(`price` /100 *`num`) as `total_price`" +
+ String guardSql = "SELECT `gift_name`, SUM(`num`) AS `total_num`,SUM(`price` / 1000 *`num`) as `total_price`" +
"FROM `guardBuy` where `sql_time` >= '" + startTimeLong + "' and `sql_time` <= '" + endTimeLong + "'" +
"GROUP BY `gift_name`;";
- String superChatSql = "SELECT SUM(`price`*100) as `total_price`, count(`price`) as `total_count`" +
+ String superChatSql = "SELECT SUM(`price`/ 1000) as `total_price`, count(`price`) as `total_count`" +
"FROM `superChat` where `sql_time` >= '" + startTimeLong + "' and `sql_time` <= '" + endTimeLong + "';";
JSONObject json = new JSONObject();
JSONArray giftInfo = get(giftSql);
@@ -207,30 +204,50 @@ public class BiliLiveDatabase extends SQLiteManager {
return super.get(tableName, where, clazz);
}
- public List getOfTime(Long startTime, Long endTime, int page,int pageSize, Class clazz) {
- String tableName = null;
- StringBuilder sb = new StringBuilder();
- String where = null;
- if (startTime != null) {
- sb.append(" `sql_time` >= ").append("\"").append(startTime).append("\"");
- }
- if (endTime != null) {
- if (!sb.isEmpty()) {
- sb.append(" and ");
+
+ public List getDanmu(Long startTime, Long endTime, int page, int pageSize) {
+ List list=new ArrayList<>();
+
+ String query = "SELECT danmu AS text, fontSize, color, (sql_time - ?) AS `time`, "
+ + "CASE WHEN model < 4 THEN 'scroll' "
+ + " WHEN model = 4 THEN 'bottom' "
+ + " WHEN model = 5 THEN 'top' "
+ + "END AS model "
+ + "FROM danmu "
+ + "WHERE sql_time BETWEEN ? AND ? "
+ + "ORDER BY sql_time "
+ + "LIMIT ?, ?";
+ try (PreparedStatement pstmt = conn.prepareStatement(query)) {
+
+ // 设置参数
+ pstmt.setLong(1, startTime);
+ pstmt.setLong(2, startTime);
+ pstmt.setLong(3, endTime);
+ pstmt.setInt(4, (page - 1) * pageSize); // 计算偏移量
+ pstmt.setInt(5, pageSize);
+
+ pstmt.closeOnCompletion();
+ ResultSet rs = pstmt.executeQuery();
+
+ while (rs.next()) {
+ String text = rs.getString("text");
+ int fontSize = rs.getInt("fontSize");
+ String color = rs.getString("color");
+ long time = rs.getLong("time");
+ String model = rs.getString("model");
+ LiveWebDanmuBean.Danmu danmu = new LiveWebDanmuBean.Danmu();
+ danmu.setText(text);
+ danmu.setFontSize(fontSize);
+ danmu.setColor(color);
+ danmu.setTime(time);
+ danmu.setBarrageType(model);
+ list.add(danmu);
}
- sb.append(" `sql_time` <= ").append("\"").append(endTime).append("\"");
+ rs.close();
+ } catch (SQLException e) {
+ Log.e(e);
}
- sb.append("ORDER BY `sql_time` LIMIT ").append(page).append("*").append(pageSize).append(",").append(pageSize);
- if (!sb.isEmpty()) {
- where = sb.toString();
- }
- for (AbsDatabasesBean bean : getDataBean()) {
- if (bean.getClass() == clazz) {
- tableName = bean.getTableName();
- break;
- }
- }
- return super.get(tableName, where, clazz);
+ return list;
}
@Override
diff --git a/src/main/java/com/yutou/bilibili/datas/web/LiveVideoDanmu.java b/src/main/java/com/yutou/bilibili/datas/web/LiveVideoDanmu.java
deleted file mode 100644
index e4568b7..0000000
--- a/src/main/java/com/yutou/bilibili/datas/web/LiveVideoDanmu.java
+++ /dev/null
@@ -1,67 +0,0 @@
-package com.yutou.bilibili.datas.web;
-
-import com.yutou.biliapi.bean.live.database.LiveSuperChatDatabaseBean;
-import lombok.Data;
-
-import java.util.ArrayList;
-import java.util.List;
-
-@Data
-public class LiveVideoDanmu {
-
- List danmu = new ArrayList<>();
- List superChat = new ArrayList<>();
- boolean isNextDanmu = false;
- long danmuCount = 0;
-
- @Data
- public static class Addition {
- private int grade = 2;
- }
-
- @Data
- public static class Danmu {
- public static final String DANMU_TYPE_SCROLL = "scroll";
- public static final String DANMU_TYPE_TOP = "top";
- public static final String DANMU_TYPE_BOTTOM = "bottom";
- private String id;
- private String barrageType = DANMU_TYPE_SCROLL;
- private long time;
- private String text;
- private int fontSize = 25;
- private int lineHeight = 1;
- private String color = "#ffffff";
- private Addition addition = new Addition();
- }
-
- @Data
- public static class SuperChat {
- private int id;
- private long price;
- private String uid;
- private long start_time;
- private long duration;
- private String message;
- private String message_trans;
- private String message_font_color;
- private String backgroundBottomColor;
- private String userName;
- private String userNameColor;
- private String userAvatar;
-
- public SuperChat(long videoTime, LiveSuperChatDatabaseBean bean) {
- this.id = bean.getId();
- this.price = bean.getPrice();
- this.uid = bean.getUid();
- this.start_time = (bean.getSql_time().getTime() - videoTime) / 1000;
- this.duration = bean.getEnd_time() - bean.getStart_time();
- this.message = bean.getMessage();
- this.message_trans = bean.getMessage_trans();
- this.message_font_color = bean.getMessage_font_color();
- this.backgroundBottomColor = bean.getBackgroundBottomColor();
- this.userName = bean.getUserName();
- this.userAvatar = bean.getUserAvatar();
- this.userNameColor = bean.getUserNameColor();
- }
- }
-}
diff --git a/src/main/java/com/yutou/bilibili/datas/web/LiveWebDanmuBean.java b/src/main/java/com/yutou/bilibili/datas/web/LiveWebDanmuBean.java
new file mode 100644
index 0000000..9b64cfa
--- /dev/null
+++ b/src/main/java/com/yutou/bilibili/datas/web/LiveWebDanmuBean.java
@@ -0,0 +1,36 @@
+package com.yutou.bilibili.datas.web;
+
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Data
+public class LiveWebDanmuBean {
+
+ List danmu = new ArrayList<>();
+ boolean isNextDanmu = false;
+ long danmuCount = 0;
+
+ @Data
+ public static class Addition {
+ private int grade = 2;
+ }
+
+ @Data
+ public static class Danmu {
+ public static final String DANMU_TYPE_SCROLL = "scroll";
+ public static final String DANMU_TYPE_TOP = "top";
+ public static final String DANMU_TYPE_BOTTOM = "bottom";
+ private String id;
+ private String barrageType = DANMU_TYPE_SCROLL;
+ private long time;
+ private String text;
+ private int fontSize = 25;
+ private int lineHeight = 1;
+ private String color = "#ffffff";
+ private Addition addition = new Addition();
+ }
+
+
+}
diff --git a/src/main/java/com/yutou/bilibili/datas/web/SuperChatGiftBean.java b/src/main/java/com/yutou/bilibili/datas/web/SuperChatGiftBean.java
new file mode 100644
index 0000000..75d5fa7
--- /dev/null
+++ b/src/main/java/com/yutou/bilibili/datas/web/SuperChatGiftBean.java
@@ -0,0 +1,35 @@
+package com.yutou.bilibili.datas.web;
+
+import com.yutou.biliapi.bean.live.database.LiveSuperChatDatabaseBean;
+import lombok.Data;
+
+@Data
+public class SuperChatGiftBean {
+ private int id;
+ private long price;
+ private String uid;
+ private long start_time;
+ private long duration;
+ private String message;
+ private String message_trans;
+ private String message_font_color;
+ private String backgroundBottomColor;
+ private String userName;
+ private String userNameColor;
+ private String userAvatar;
+
+ public SuperChatGiftBean(long videoTime, LiveSuperChatDatabaseBean bean) {
+ this.id = bean.getId();
+ this.price = bean.getPrice();
+ this.uid = bean.getUid();
+ this.start_time = (bean.getSql_time().getTime() - videoTime) / 1000;
+ this.duration = bean.getEnd_time() - bean.getStart_time();
+ this.message = bean.getMessage();
+ this.message_trans = bean.getMessage_trans();
+ this.message_font_color = bean.getMessage_font_color();
+ this.backgroundBottomColor = bean.getBackgroundBottomColor();
+ this.userName = bean.getUserName();
+ this.userAvatar = bean.getUserAvatar();
+ this.userNameColor = bean.getUserNameColor();
+ }
+}
diff --git a/src/main/java/com/yutou/bilibili/services/LiveDanmuService.java b/src/main/java/com/yutou/bilibili/services/LiveDanmuService.java
index 8ac6caa..2b095b4 100644
--- a/src/main/java/com/yutou/bilibili/services/LiveDanmuService.java
+++ b/src/main/java/com/yutou/bilibili/services/LiveDanmuService.java
@@ -5,15 +5,13 @@ import com.alibaba.fastjson2.JSONObject;
import com.yutou.biliapi.bean.live.LiveRoomConfig;
import com.yutou.biliapi.bean.live.database.LiveConfigDatabaseBean;
import com.yutou.biliapi.bean.live.database.LiveDanmuDatabaseBean;
-import com.yutou.biliapi.bean.live.database.LiveSuperChatDatabaseBean;
import com.yutou.biliapi.bean.live.database.LiveVideoDatabaseBean;
import com.yutou.biliapi.bean.websocket.live.WSData;
-import com.yutou.biliapi.databases.BiliLiveConfigDatabase;
import com.yutou.biliapi.databases.BiliLiveDatabase;
import com.yutou.biliapi.net.WebSocketServer;
import com.yutou.bilibili.Tools.AssTools;
import com.yutou.bilibili.Tools.Tools;
-import com.yutou.bilibili.datas.web.LiveVideoDanmu;
+import com.yutou.bilibili.datas.web.LiveWebDanmuBean;
import com.yutou.common.utils.Log;
import jakarta.annotation.Resource;
import org.jetbrains.annotations.NotNull;
@@ -95,39 +93,28 @@ public class LiveDanmuService {
return String.format("%d小时%d分钟%d秒", hours, minutes, finalRemainingSeconds);
}
- public LiveVideoDanmu getDanmu(String roomId, String videoId, int page) {
- LiveVideoDanmu danmus = new LiveVideoDanmu();
+ public LiveWebDanmuBean getDanmu(String roomId, String videoId, int page) {
+ LiveWebDanmuBean danmus = new LiveWebDanmuBean();
BiliLiveDatabase liveDatabase = liveDatabasesService.getLiveDatabase(roomId);
try {
LiveVideoDatabaseBean videoBean = liveDatabase.getVideo(videoId);
if (videoBean == null) {
- return new LiveVideoDanmu();
+ return new LiveWebDanmuBean();
}
long startTime = videoBean.getStartTime().getTime();
long endTime = videoBean.getStopTime() == null ? System.currentTimeMillis() : videoBean.getStopTime().getTime();
- List superChatList = liveDatabase.getOfTime(startTime, endTime, LiveSuperChatDatabaseBean.class);
long count = liveDatabase.getCount(new LiveDanmuDatabaseBean().getTableName());
- int pageSize = 10000;
+ int pageSize = 3000;
int pageCount = (int) Math.ceil((double) count / pageSize);
- List danmuList = liveDatabase.getOfTime(startTime, endTime, page, pageSize, LiveDanmuDatabaseBean.class)
- .stream()
- .map(item -> createDanmu(item, startTime))
- .filter(item -> item.getTime() >= 0)
- .toList();
+ List danmuList = liveDatabase.getDanmu(startTime, endTime, page, pageSize);
danmus.getDanmu().addAll(danmuList);
danmus.setDanmuCount(count);
if (page < pageCount) {
danmus.setNextDanmu(true);
}
-
- for (LiveSuperChatDatabaseBean bean : superChatList) {
- LiveVideoDanmu.SuperChat superChat = new LiveVideoDanmu.SuperChat(startTime, bean);
- danmus.getSuperChat().add(superChat);
- }
-
} catch (Exception e) {
Log.e(e);
}
@@ -136,19 +123,19 @@ public class LiveDanmuService {
}
@NotNull
- private static LiveVideoDanmu.Danmu createDanmu(LiveDanmuDatabaseBean bean, long startTime) {
- LiveVideoDanmu.Danmu danmu = new LiveVideoDanmu.Danmu();
+ private static LiveWebDanmuBean.Danmu createDanmu(LiveDanmuDatabaseBean bean, long startTime) {
+ LiveWebDanmuBean.Danmu danmu = new LiveWebDanmuBean.Danmu();
danmu.setId(bean.getId() + "");
danmu.setText(bean.getDanmu());
danmu.setColor("#" + bean.getFontColor());
danmu.setFontSize(bean.getFontSize());
danmu.setTime(bean.getTime().getTime() - startTime);
if (bean.getModel() < 4) {
- danmu.setBarrageType(LiveVideoDanmu.Danmu.DANMU_TYPE_SCROLL);
+ danmu.setBarrageType(LiveWebDanmuBean.Danmu.DANMU_TYPE_SCROLL);
} else if (bean.getModel() == 4) {
- danmu.setBarrageType(LiveVideoDanmu.Danmu.DANMU_TYPE_BOTTOM);
+ danmu.setBarrageType(LiveWebDanmuBean.Danmu.DANMU_TYPE_BOTTOM);
} else if (bean.getModel() == 5) {
- danmu.setBarrageType(LiveVideoDanmu.Danmu.DANMU_TYPE_TOP);
+ danmu.setBarrageType(LiveWebDanmuBean.Danmu.DANMU_TYPE_TOP);
}
return danmu;
}
diff --git a/src/main/java/com/yutou/bilibili/services/LiveDatabasesService.java b/src/main/java/com/yutou/bilibili/services/LiveDatabasesService.java
index 8bb2ced..e5f3116 100644
--- a/src/main/java/com/yutou/bilibili/services/LiveDatabasesService.java
+++ b/src/main/java/com/yutou/bilibili/services/LiveDatabasesService.java
@@ -1,5 +1,7 @@
package com.yutou.bilibili.services;
+import com.google.common.cache.Cache;
+import com.google.common.cache.CacheBuilder;
import com.yutou.biliapi.bean.live.LiveRoomConfig;
import com.yutou.biliapi.bean.live.database.LiveConfigDatabaseBean;
import com.yutou.biliapi.databases.BiliLiveConfigDatabase;
@@ -10,30 +12,49 @@ import org.springframework.util.StringUtils;
import java.util.HashMap;
import java.util.Map;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
+@Getter
@Service
public class LiveDatabasesService {
- private final Map liveDatabases=new HashMap<>();
- @Getter
+ private static final Cache liveDatabases = CacheBuilder.newBuilder()
+ .maximumSize(1000)
+ .expireAfterAccess(30, TimeUnit.MINUTES)
+ .removalListener(it -> {
+ if (it.wasEvicted()) {
+ if (it.getValue() != null) {
+ ((BiliLiveDatabase) it.getValue()).close();
+ }
+ }
+ })
+ .build();
private final BiliLiveConfigDatabase configDatabase;
private LiveDatabasesService() {
- configDatabase=new BiliLiveConfigDatabase();
- }
- public BiliLiveDatabase getLiveDatabase(String roomId) {
- if(liveDatabases.containsKey(roomId)) {
- return liveDatabases.get(roomId);
- }
- BiliLiveDatabase liveDatabase = new BiliLiveDatabase(buildConfig(roomId));
- liveDatabases.put(roomId, liveDatabase);
- return liveDatabase;
- }
- public void closeAll(){
- liveDatabases.forEach((k,v)->v.close());
- configDatabase.close();
+ configDatabase = new BiliLiveConfigDatabase();
}
- public LiveRoomConfig buildConfig(String roomId){
+ public BiliLiveDatabase getLiveDatabase(String roomId) {
+ try {
+ return liveDatabases.get(roomId, () -> new BiliLiveDatabase(buildConfig(roomId)));
+ } catch (ExecutionException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ public void closeAll() {
+ try {
+ for (BiliLiveDatabase db : liveDatabases.asMap().values()) {
+ db.close();
+ }
+ } finally {
+ liveDatabases.invalidateAll();
+ configDatabase.close();
+ }
+ }
+
+ public LiveRoomConfig buildConfig(String roomId) {
LiveConfigDatabaseBean bean = configDatabase.getConfig(roomId);
LiveRoomConfig config = new LiveRoomConfig();
config.setLoginUid(bean.getRecordUid());
diff --git a/src/main/java/com/yutou/bilibili/services/LiveService.java b/src/main/java/com/yutou/bilibili/services/LiveService.java
index 43632a3..c946214 100644
--- a/src/main/java/com/yutou/bilibili/services/LiveService.java
+++ b/src/main/java/com/yutou/bilibili/services/LiveService.java
@@ -4,15 +4,13 @@ import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.yutou.biliapi.api.LiveApi;
import com.yutou.biliapi.bean.live.LiveAnchorInfo;
-import com.yutou.biliapi.bean.live.database.LiveConfigDatabaseBean;
-import com.yutou.biliapi.bean.live.database.LiveGiftDatabaseBean;
-import com.yutou.biliapi.bean.live.database.LiveGuardBuyBean;
-import com.yutou.biliapi.bean.live.database.LiveVideoDatabaseBean;
+import com.yutou.biliapi.bean.live.database.*;
import com.yutou.biliapi.databases.BiliLiveDatabase;
import com.yutou.biliapi.net.BiliLiveNetApiManager;
import com.yutou.bilibili.Tools.DateFormatUtils;
import com.yutou.bilibili.datas.web.LiveData;
-import com.yutou.common.databases.AbsDatabasesBean;
+import com.yutou.bilibili.datas.web.LiveWebDanmuBean;
+import com.yutou.bilibili.datas.web.SuperChatGiftBean;
import com.yutou.common.okhttp.HttpLoggingInterceptor;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
@@ -111,7 +109,11 @@ public class LiveService {
}
long startTime = videoBean.getStartTime().getTime();
long endTime = videoBean.getStopTime() == null ? System.currentTimeMillis() : videoBean.getStopTime().getTime();
- return database.getGiftInfo(startTime, endTime);
+ List superChatList = database.getOfTime(startTime, endTime, LiveSuperChatDatabaseBean.class)
+ .stream().map(it-> new SuperChatGiftBean(startTime,it)).toList();
+ JSONObject giftInfo = database.getGiftInfo(startTime, endTime);
+ giftInfo.put("superChat",superChatList);
+ return giftInfo;
}
public JSONArray getGiftItemInfo(String roomId, String videoId, String giftName) {
diff --git a/src/main/java/com/yutou/common/databases/SQLiteManager.java b/src/main/java/com/yutou/common/databases/SQLiteManager.java
index 1bdfc42..ee0822a 100644
--- a/src/main/java/com/yutou/common/databases/SQLiteManager.java
+++ b/src/main/java/com/yutou/common/databases/SQLiteManager.java
@@ -105,132 +105,121 @@ public abstract class SQLiteManager {
protected void add(T t) {
StringBuilder sb = new StringBuilder();
- PreparedStatement statement = null;
- try {
-
- StringBuilder value = new StringBuilder();
- sb.append("INSERT INTO `").append(t.getTableName()).append("` ");
- sb.append("(");
- value.append("(");
+ try (PreparedStatement statement = getConnection().prepareStatement(buildInsertSql(t))) {
JSONObject json = t.toJson();
Set keySet = json.keySet();
- for (String key : keySet) {
- if ("id".equals(key)) {
- continue;
- }
- sb.append("`").append(key).append("`,");
- //value.append("'").append(json.get(key)).append("',");
- value.append("?").append(",");
- }
- sb.deleteCharAt(sb.length() - 1);
- value.deleteCharAt(value.length() - 1);
- value.append(")");
- sb.append(") VALUES ");
- sb.append(value);
- statement = getConnection().prepareStatement(sb.toString());
int i = 1;
for (String key : keySet) {
if ("id".equals(key)) {
continue;
}
- if ("sql_time".equals(key)) {
- statement.setLong(i++, json.getDate(key).getTime());
+ Object value = json.get(key);
+ if ("sql_time".equals(key) && value instanceof Date) {
+ statement.setLong(i++, ((Date) value).getTime());
continue;
}
- if (json.get(key) instanceof String) {
- statement.setString(i++, json.get(key).toString());
- } else if (json.get(key) instanceof Integer) {
- statement.setInt(i++, json.getInteger(key));
- } else if (json.get(key) instanceof Long) {
- statement.setLong(i++, json.getLong(key));
- } else if (json.get(key) instanceof Boolean) {
- statement.setBoolean(i++, json.getBoolean(key));
- } else if (json.get(key) instanceof Date) {
- statement.setLong(i++, json.getDate(key).getTime());
+ if (value instanceof String) {
+ statement.setString(i++, (String) value);
+ } else if (value instanceof Integer) {
+ statement.setInt(i++, (Integer) value);
+ } else if (value instanceof Long) {
+ statement.setLong(i++, (Long) value);
+ } else if (value instanceof Boolean) {
+ statement.setBoolean(i++, (Boolean) value);
+ } else if (value instanceof Date) {
+ statement.setTimestamp(i++, new Timestamp(((Date) value).getTime()));
} else {
- statement.setObject(i++, json.get(key));
+ statement.setObject(i++, value);
}
}
statement.execute();
} catch (SQLException e) {
- Log.e(e, sb);
+ Log.e(e, sb.toString());
throw new RuntimeException(e);
- } finally {
- try {
- if (statement != null) {
- statement.closeOnCompletion();
- }
- } catch (SQLException e) {
- Log.e(e);
- }
}
}
- protected void update(T t) {
- PreparedStatement statement = null;
- try {
- StringBuilder sb = new StringBuilder();
- StringBuilder setPart = new StringBuilder();
+ private String buildInsertSql(AbsDatabasesBean bean) {
+ StringBuilder sb = new StringBuilder();
+ StringBuilder value = new StringBuilder();
+ sb.append("INSERT INTO `").append(bean.getTableName()).append("` ");
+ sb.append("(");
+ value.append("(");
+ JSONObject json = bean.toJson();
+ Set keySet = json.keySet();
+ for (String key : keySet) {
+ if ("id".equals(key)) {
+ continue;
+ }
+ sb.append("`").append(key).append("`,").append(" ");
+ value.append("?").append(",");
+ }
+ sb.deleteCharAt(sb.length() - 1); // 删除最后一个逗号
+ value.deleteCharAt(value.length() - 1); // 删除最后一个逗号
+ value.append(")");
+ sb.append(") VALUES ").append(value);
+ return sb.toString();
+ }
+ protected void update(T t) {
+ try (PreparedStatement statement = getConnection().prepareStatement(buildUpdateSql(t))) {
JSONObject json = t.toJson();
Set keySet = json.keySet();
-
- for (String key : keySet) {
- if ("id".equals(key) || "sql_time".equals(key)) {
- continue;
- }
- setPart.append("`").append(key).append("` = ?, ");
- }
-
- setPart.deleteCharAt(setPart.length() - 2);
-
- sb.append("UPDATE `").append(t.getTableName()).append("` ");
- sb.append("SET ").append(setPart);
- sb.append(" WHERE `sql_time` = ?");
-
- statement = getConnection().prepareStatement(sb.toString());
-
int i = 1;
for (String key : keySet) {
if ("id".equals(key) || "sql_time".equals(key)) {
continue;
}
-
- if (json.get(key) instanceof String) {
- statement.setString(i++, json.getString(key));
- } else if (json.get(key) instanceof Integer) {
- statement.setInt(i++, json.getInteger(key));
- } else if (json.get(key) instanceof Long) {
- statement.setLong(i++, json.getLong(key));
- } else if (json.get(key) instanceof Boolean) {
- statement.setBoolean(i++, json.getBoolean(key));
- } else if (json.get(key) instanceof Date) {
- statement.setLong(i++, json.getDate(key).getTime());
+ Object value = json.get(key);
+ if (value instanceof String) {
+ statement.setString(i++, (String) value);
+ } else if (value instanceof Integer) {
+ statement.setInt(i++, (Integer) value);
+ } else if (value instanceof Long) {
+ statement.setLong(i++, (Long) value);
+ } else if (value instanceof Boolean) {
+ statement.setBoolean(i++, (Boolean) value);
+ } else if (value instanceof Date) {
+ statement.setTimestamp(i++, new Timestamp(((Date) value).getTime()));
} else {
- statement.setObject(i++, json.get(key));
+ statement.setObject(i++, value);
}
}
// 设置 sql_time 的值
- long id = t.getSql_time().getTime();
- statement.setLong(i, id);
+ long sqlTime = t.getSql_time().getTime();
+ statement.setLong(i, sqlTime);
statement.executeUpdate();
-
} catch (SQLException e) {
Log.e(e);
throw new RuntimeException(e);
- } finally {
- try {
- if (statement != null) {
- statement.closeOnCompletion();
- }
- } catch (SQLException e) {
- Log.e(e);
- }
}
}
+ private String buildUpdateSql(AbsDatabasesBean bean) {
+ StringBuilder sb = new StringBuilder();
+ StringBuilder setPart = new StringBuilder();
+
+ JSONObject json = bean.toJson();
+ Set keySet = json.keySet();
+
+ for (String key : keySet) {
+ if ("id".equals(key) || "sql_time".equals(key)) {
+ continue;
+ }
+ setPart.append("`").append(key).append("` = ?, ");
+ }
+
+ setPart.deleteCharAt(setPart.length() - 2); // 删除最后一个逗号和空格
+
+ sb.append("UPDATE `").append(bean.getTableName()).append("` ");
+ sb.append("SET ").append(setPart);
+ sb.append(" WHERE `sql_time` = ?");
+
+ return sb.toString();
+ }
+
protected JSONArray getJSONArray(String table) {
return getJSONArray(table, null);
}