Java实现MySQL批量新增

7 篇文章 0 订阅

注意:Oracle与MySQL不同,该方法在Oracle无效,并且会报ORA-00933:SQL命令未正确结束
这个SQL命令在Oracle高版本是能够运行的,但是在Java引入的jar包,版本过低,无法运行。
首先创建两个自定义注解

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface TableName {
    String value() default "";
}
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Column {
    String value() default "";
}

然后,在Bean上面的使用

@TableName("USER")
public class User{
    @Column("IID")
    private String iid;
    @Column("NAME")
    private String name;
    
    // 省略get/set
}

实现:

/**
 * <p>
 * 生成批量新增SQL语句
 * </p>
 *
 * @author lisonglin
 * @version 1.0
 * @since 2022/2/28 17:59
 */
public class SqlTool<T> {

	public static void main(String[] args) {
        // PreparedStatement statement = null;
		List<User> userList = new ArrayList<>();
		User user = new User();
		user.setIid("123");
		user.setName("456");
		zjdspNhTzList.add(zjdspNhTz);
		SqlTool<User> sqlTool = new SqlTool<>();
		String sqlInsert = sqlTool.genSqlInsert(user, userList.size());
		System.out.println(sqlInsert);
        // 执行就可以了
        // statement.executeUpdate(sqlInsert, sqlTool.genColumn(list));
	}

	/**
	 * 根据Table对象生成批量新增SQL
	 * 生成语句格式:INSERT INTO TABLENAME(FIELD,...) VALUES(?,...),(?,...)
	 *
	 * @param table Bean对象,映射表名
	 * @return 批量新增SQL语句
	 */
	public String genSqlInsert(T table, int size) {
		StringBuilder sbField = new StringBuilder();
		StringBuilder sbValue = new StringBuilder();
		Class<?> aClass = table.getClass();
		TableName tableNameDeclared = aClass.getDeclaredAnnotation(TableName.class);
		String tableName = tableNameDeclared.value();
		sbField.append("INSERT INTO ").append(tableName.toUpperCase()).append(" (");
		for (Field field : aClass.getDeclaredFields()) {
			if (field.isAnnotationPresent(Column.class)) {
				Column column = field.getAnnotation(Column.class);
				sbField.append(column.value()).append(",");
			}
		}
		// 根据字段
		String field = sbField.substring(0, sbField.length() - 1);
		String[] columns;
		if (StringUtil.isNotEmpty(field)) {
			columns = field.split(",");
			sbValue.append("(");
			for (int i = 0; i < columns.length; i++) {
				// 拼接SQL语句,生成VALUES('value1','value2') 部分
				if (i == columns.length - 1) {
					sbValue.append("?");
				} else {
					sbValue.append("?,");
				}
			}
		}
		StringBuilder sb = new StringBuilder();
		for (int i = 0; i < size; i++) {
			sb.append(sbValue);
			if (i == size - 1) {
				sb.append(")");
			} else {
				sb.append("),");
			}
		}
		return field + ") VALUES " + sb;
	}

	/**
	 * 批量新增的SQL,匹配新增语句的参数
	 *
	 * @param jsonData 批量新增对象
	 * @return 参数
	 */
	public Object[] genColumn(List<T> jsonData) {
		List<Object> param = new ArrayList<>(10);
		Map<String, Object> fieldAndValueMap = new LinkedHashMap<>(10);
		// 循环遍历list对象
		jsonData.forEach(obj -> {
			Class<?> clazz = obj.getClass();
			try {
				for (Field field : clazz.getDeclaredFields()) {
					field.setAccessible(true);
					// 获取一个字段的值
					Object pojoValue = field.get(obj);
					if (field.isAnnotationPresent(Column.class)) {
						Column column = field.getAnnotation(Column.class);
						// 反射获取Column注解的值
						String columnValue = column.value();
						fieldAndValueMap.put(columnValue, pojoValue);
					}
					field.setAccessible(false);
				}
			} catch (IllegalAccessException e) {
				e.printStackTrace();
			}
			for (Map.Entry<String, Object> entry : fieldAndValueMap.entrySet()) {
				Object value = entry.getValue();
				param.add(value);
			}
		});
		return param.toArray();
	}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hikktn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值