在看到了mongoTemplate
的操作之后,觉得这种东西是很符合我们程序员世界的操作的,但是看到mysql
的jdbc之后,瞬间一百万个小泥马从头飘过,所以就想自己实现一个mysql版本的upsert
功能,有set
与increase
,decrease
。
文章图片
实现操作 参考
mongoTemplate
,创建一个update.java
与query.java
类,方便两款db之间转换import java.util.HashMap;
import java.util.Map;
public class Update {private Map sets = new HashMap<>();
private Map incs = new HashMap<>();
//省略get set操作
}public class Query {private Map values = new HashMap<>();
public Query equals(String name,Object value){
values.put(name,value);
return this;
}//省略get set操作
}
只依赖一个包
compile group: 'mysql', name: 'mysql-connector-java', version: '5.1.39'
【Mysql - Upsert功能实现】
MysqlClient
客户端工具代码非常精简,大家可以根据自己的喜好添加功能
import java.sql.*;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.*;
import java.util.stream.Collectors;
public class MysqlClient {private Connection connection;
private String jdbcUrl;
private String driver = "com.mysql.jdbc.Driver";
public MysqlClient(String jdbcUrl) {
this.jdbcUrl = jdbcUrl;
this.init();
}public void init() {
try {
if (connection == null || connection.isClosed()) {
String[] split = jdbcUrl.split("\\|");
Class.forName(driver);
connection = DriverManager.getConnection(split[0], split[1], split[2]);
}
} catch (SQLException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}public void upsert(String table, Query query, Update update) {
List names = new ArrayList<>();
List
使用方法
@Test
public void testUpsert(){
MysqlClient mysqlClient = new MysqlClient("jdbc:mysql://demo.com:3306/db?useUnicode=true&useSSL=false&autoReconnect=true|root|password");
Update update = new Update();
update.set("count", 0);
update.inc("active", 1);
Query query = new Query();
query.equals("name", "abc");
mysqlClient.upsert("test", query, update);
//含义:对相同行的`name`='abc',对其字段`count`重置为0,`active`新增1
}
解析 生成的
sql
语句会像这样子INSERT INTO `test` (`name`,`count`,`active`,`value`) VALUES( ? , ? , ? , ? ) ON DUPLICATE KEY UPDATE`count` = ? , `active` = `active` + 1, `value` = `value` - 1
并且使用了占位符号,增加特殊符号的解析容错能力
推荐阅读
- mysql|InnoDB数据页结构
- javaweb|基于Servlet+jsp+mysql开发javaWeb学生成绩管理系统
- mysql|一文深入理解mysql
- Java毕业设计项目实战篇|Java项目:在线嘿嘿网盘系统设计和实现(java+Springboot+ssm+mysql+maven)
- SQL|SQL基本功(五)--函数、谓词、CASE表达式
- vue|电商后台管理系统(vue+python|node.js)
- Java及基础算法及数据结构|旧笔记整理(MySQL)
- mysql|双非本211硕,无实习无项目,自学大数据开发,秋招上岸
- 数据库|Mysql--InnoDB存储引擎详解
- MySQL学习笔记-9-order by