@Autowired
private TbUserMapper tbUserMapper;
@Override
public boolean saveBatch(Collection<TbUser> entityList, int batchSize) {
return tbUserMapper.insertBatch(entityList, BeanUtil.getTableClassBean(TbUser.class))>0?true:false;
}
@Repository
public interface TbUserMapper extends BaseMapper<TbUser> {
int insertBatch(@Param("list") Collection<TbUser> list, @Param("tc") TableClassBean tc);
}
<?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.dev.demo.mapper.TbUserMapper">
<insert id="insertBatch">
INSERT INTO ${tc.tbName}
<foreach collection ="tc.dbFiledList" item="col" separator ="," open="(" close=")">
${col.tfName}
</foreach >
VALUES
<foreach collection ="list" item="item" separator =",">
<foreach collection ="tc.dbFiledList" item="col" separator ="," open="(" close=")">
#{item.${col.cfName}}
</foreach >
</foreach >
</insert>
</mapper>
package com.dev.demo.model;
import com.baomidou.mybatisplus.annotation.TableField;
import com.dev.demo.mapper.TbUserMapper;
import javax.persistence.*;
import java.io.Serializable;
import java.util.Date;
/**
* 新增字段后会自动更新数据库表结构
* @Table注解 {@link TbUserMapper#insertBatch(java.util.Collection, com.dev.demo.util.TableClassBean)}该注解可以通过反射获取表名称
*/
@Entity
@Table(name = "tb_user", indexes = {@Index(name = "id", columnList = "id",unique = true)
, @Index(name = "status", columnList = "status")
, @Index(name = "adminFlag", columnList = "admin_flag")
, @Index(name = "createDate", columnList = "create_date")})
public class TbUser implements Serializable {
@Id
@PrimaryKeyJoinColumn
@Column
private Long id;
@Column(name = "user_name" ) //自动创建表结构使用
@TableField(value = "user_name") //mybatis-plus mapper实体类映射使用
private String username;
@Column
private String password;
@Column(length = 4)
private Byte status;
@Column(name = "create_date") //自动创建表结构使用
@TableField(value = "create_date") //mybatis-plus mapper实体类映射使用
private Date createDate;
/**
* 用户昵称
*/
@Column(name = "nickname",length = 32)
private String nickname;
@Column(name = "admin_flag" ,length = 11)
@TableField(value = "admin_flag") //mybatis-plus mapper实体类映射使用
private Integer adminFlag;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Byte getStatus() {
return status;
}
public void setStatus(Byte status) {
this.status = status;
}
public Date getCreateDate() {
return createDate;
}
public void setCreateDate(Date createDate) {
this.createDate = createDate;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public Integer getAdminFlag() {
return adminFlag;
}
public void setAdminFlag(Integer adminFlag) {
this.adminFlag = adminFlag;
}
}
package com.dev.demo.util;
import com.baomidou.mybatisplus.annotation.TableField;
import com.dev.demo.model.TbUser;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.persistence.Column;
import javax.persistence.Table;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class BeanUtil {
static Logger log = LoggerFactory.getLogger(BeanUtil.class);
/**
* 获取table中的columns和类中的字段集合
*
* @param clazz
* @return
*/
public static List<DbFiled> getFieldName(Class clazz) {
List<DbFiled> list = new ArrayList<>();
Field[] fields = clazz.getDeclaredFields();
for (int j = 0; j < fields.length; j++) {
Field field = fields[j];
if (field.isAnnotationPresent(Column.class)) {
if (field.isAnnotationPresent(TableField.class)) {
try {
//获取SignalsRuleExportDTO字段上的ExcelProperty注解实例
TableField column = field.getAnnotation(TableField.class);
//获取 ExcelProperty 这个代理实例所持有的 InvocationHandler
InvocationHandler ch = Proxy.getInvocationHandler(column);
// 获取 AnnotationInvocationHandler 的 memberValues 字段
Field fv = ch.getClass().getDeclaredField("memberValues");
// 因为这个字段事 private final 修饰,所以要打开权限
fv.setAccessible(true);
// 获取 memberValues
Map kvs = (Map) fv.get(ch);
// 修改 value 属性值
Object columnName = kvs.get("value");
list.add(new DbFiled(columnName.toString(), field.getName()));
} catch (Exception e) {
log.error("getFieldName", e);
}
} else {
list.add(new DbFiled(field.getName(), field.getName()));
}
}
}
return list;
}
/**
* 获取table中的columns和类中的字段集合(包括表名前提model配置@Table注解且注解包含name属性)
*
* @param clazz
* @return
*/
public static TableClassBean getTableClassBean(Class clazz) {
List<DbFiled> list = new ArrayList<>();
Field[] fields = clazz.getDeclaredFields();
for (int j = 0; j < fields.length; j++) {
Field field = fields[j];
if (field.isAnnotationPresent(Column.class)) {
if (field.isAnnotationPresent(TableField.class)) {
try {
//获取SignalsRuleExportDTO字段上的ExcelProperty注解实例
TableField column = field.getAnnotation(TableField.class);
//获取 ExcelProperty 这个代理实例所持有的 InvocationHandler
InvocationHandler ch = Proxy.getInvocationHandler(column);
// 获取 AnnotationInvocationHandler 的 memberValues 字段
Field fv = ch.getClass().getDeclaredField("memberValues");
// 因为这个字段事 private final 修饰,所以要打开权限
fv.setAccessible(true);
// 获取 memberValues
Map kvs = (Map) fv.get(ch);
// 修改 value 属性值
Object columnName = kvs.get("value");
list.add(new DbFiled(columnName.toString(), field.getName()));
} catch (Exception e) {
log.error("getFieldName", e);
}
} else {
list.add(new DbFiled(field.getName(), field.getName()));
}
}
}
Table[] annotationsByType = TbUser.class.getAnnotationsByType(Table.class);
if (annotationsByType != null && annotationsByType.length >= 1) {
Table table = annotationsByType[0];
if (table.name() != null && !"".equals(table.name().trim())) {
return new TableClassBean(table.name(), list);
}
}
log.info("no annotation or javax.persistence.Table");
return new TableClassBean(TbUser.class.getSimpleName(), list);
}
public static void main(String[] args) {
System.out.println(getFieldName(TbUser.class));
System.out.println(getTableClassBean(TbUser.class));
}
}
package com.dev.demo.util;
import java.io.Serializable;
public class DbFiled implements Serializable {
public DbFiled() {
}
public DbFiled(String tfName, String cfName) {
this.tfName = tfName;
this.cfName = cfName;
}
/**
* 数据库字段名称
*/
private String tfName;
/**
* 类中字段名称
*/
private String cfName;
public String getTfName() {
return tfName;
}
public void setTfName(String tfName) {
this.tfName = tfName;
}
public String getCfName() {
return cfName;
}
public void setCfName(String cfName) {
this.cfName = cfName;
}
@Override
public String toString() {
return "DbFiled{" +
"tfName='" + tfName + '\'' +
", cfName='" + cfName + '\'' +
'}';
}
}
package com.dev.demo.util;
import java.io.Serializable;
import java.util.List;
public class TableClassBean implements Serializable {
public TableClassBean() {
}
public TableClassBean(String tbName, List<DbFiled> dbFiledList) {
this.tbName = tbName;
this.dbFiledList = dbFiledList;
}
/**
* table name
*/
private String tbName;
/**
* table columns /class fileds
*/
private List<DbFiled> dbFiledList;
public String getTbName() {
return tbName;
}
public void setTbName(String tbName) {
this.tbName = tbName;
}
public List<DbFiled> getDbFiledList() {
return dbFiledList;
}
public void setDbFiledList(List<DbFiled> dbFiledList) {
this.dbFiledList = dbFiledList;
}
@Override
public String toString() {
return "BatchInsertBean{" +
"tbName='" + tbName + '\'' +
", dbFiledList=" + dbFiledList +
'}';
}
}
项目地址:https://gitee.com/ctllin/spring-cloud/blob/master/spring-boot-druid/read.me