深入剖析Kubernetes

mybatis新增对象时, 使用拦截器自动生成uuid方案
有了它不再去xml中手动添加selectKey了, 生成id方案实现类自行实现, 实现IdGenerator接口便可, 主要代码由公司同事编写, 我进行改造

使用时可以在id字段上添加@Id注解, 也可以在getId方法上添加或者不添加, 但是主键名字必须是id, 类型必须是String

1

2

3

4

5

6

@Target({ METHOD, FIELD })

@Retention(RUNTIME)

public @interface Id {

    Class<?> strategy() default UUIDGenerator.class;

}

  

1

2

3

4

public interface IdGenerator {

    Serializable generator();

}

  

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

public class PropertySet {

    private Set<ProPertyStrategyMapper> propertys = new HashSet<ProPertyStrategyMapper>();

    private Class<?> entity;

    @SuppressWarnings("unused")

    private PropertySet() {

    }

    public PropertySet(Class<?> entity) {

        this.entity = entity;

        this.build();

    }

    public Set<ProPertyStrategyMapper> getPropertys() {

        return propertys;

    }

    public void setPropertys(Set<ProPertyStrategyMapper> propertys) {

        this.propertys = propertys;

    }

    public PropertySet build() {

        List<Field> fieldList = new ArrayList<>();

        Class clazz = entity;

        while (null != clazz) {

            Field[] declaredFields = clazz.getDeclaredFields();

            fieldList.addAll(Arrays.asList(declaredFields));

            clazz = clazz.getSuperclass();

        }

        for (Field field : fieldList) {

            if ("serialVersionUID".equals(field.getName()))

                continue;

            field.setAccessible(true);

            PropertyDescriptor propertyDescriptor = null;

            try {

                propertyDescriptor = new PropertyDescriptor(field.getName(), entity);

            catch (IntrospectionException e) {

                e.printStackTrace();

            }

            if (propertyDescriptor == null)

                continue;

            // 获取类的get方法

            Method method = propertyDescriptor.getReadMethod();

            if (method == null) {

                continue;

            }

            if (field.isAnnotationPresent(Id.class)) {

                Id id = field.getAnnotation(Id.class);

                if (null == id.strategy()) {

                    continue;

                }

                Class<?> strategy = id.strategy();

                Object newInstance = null;

                try {

                    newInstance = strategy.newInstance();

                catch (InstantiationException e) {

                    e.printStackTrace();

                catch (IllegalAccessException e) {

                    e.printStackTrace();

                }

                if (!(newInstance instanceof IdGenerator)) {

                    continue;

                }

                IdGenerator idGenerator = (IdGenerator) newInstance;

                ProPertyStrategyMapper proPertyStrategyMapper = new ProPertyStrategyMapper(field.getName(),

                        idGenerator);

                propertys.add(proPertyStrategyMapper);

            }

            else if (method.isAnnotationPresent(Id.class)) {

                Id id = method.getAnnotation(Id.class);

                if (id.strategy() == null) {

                    continue;

                }

                Class<?> generator = id.strategy();

                Object object = null;

                try {

                    object = generator.newInstance();

                catch (InstantiationException e) {

                    e.printStackTrace();

                catch (IllegalAccessException e) {

                    e.printStackTrace();

                }

                if (!(object instanceof IdGenerator)) {

                    continue;

                }

                IdGenerator idGenerator = (IdGenerator) object;

                ProPertyStrategyMapper proPertyStrategyMapper = new ProPertyStrategyMapper(field.getName(),

                        idGenerator);

                propertys.add(proPertyStrategyMapper);

                break;

            else if (String.class.equals(field.getType()) && "id".equalsIgnoreCase(field.getName())) {

                IdGenerator idGenerator = new UUIDGenerator();

                ProPertyStrategyMapper proPertyStrategyMapper = new ProPertyStrategyMapper(field.getName(),

                        idGenerator);

                propertys.add(proPertyStrategyMapper);

            }

        }

        return this;

    }

}

  

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

public class ProPertyStrategyMapper {

    private String propertyName;

    private IdGenerator generator;

    public ProPertyStrategyMapper(String propertyName, IdGenerator generator) {

        super();

        this.propertyName = propertyName;

        this.setGenerator(generator);

    }

    public String getPropertyName() {

        return propertyName;

    }

    public void setPropertyName(String propertyName) {

        this.propertyName = propertyName;

    }

    public IdGenerator getGenerator() {

        return generator;

    }

    public void setGenerator(IdGenerator generator) {

        this.generator = generator;

    }

}

  

1

2

3

4

5

6

7

8

9

public class UUIDGenerator implements IdGenerator {

    @Override

    public Serializable generator() {

        // 自行修改此处生成id方案

        return UUID.randomUUID().toString();

    }

}

  

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

@Intercepts({ @Signature(type = Executor.class, method = "update", args = { MappedStatement.class, Object.class }) })

public class UUIDInterceptor implements Interceptor {

    @Override

    public Object intercept(Invocation invocation) throws Throwable {

        Object[] args = invocation.getArgs();

        if (args == null || args.length != 2 || !(args[0instanceof MappedStatement) || (args[1instanceof Map)) {

            return invocation.proceed();

        }

        MappedStatement mappedStatement = (MappedStatement) args[0];

        SqlCommandType sqlCommandType = mappedStatement.getSqlCommandType();

        if (!SqlCommandType.INSERT.equals(sqlCommandType)) {

            return invocation.proceed();

        }

        setDefultProperty(args[1]);

        return invocation.proceed();

    }

    public void setDefultProperty(Object obj) {

        PropertySet propertySet = new PropertySet(obj.getClass());

        Set<ProPertyStrategyMapper> propers = propertySet.getPropertys();

        if (propers == null || propers.isEmpty())

            return;

        for (ProPertyStrategyMapper pro : propers) {

            try {

                BeanUtils.setProperty(obj, pro.getPropertyName(), pro.getGenerator().generator());

            catch (IllegalAccessException e) {

                e.printStackTrace();

            catch (InvocationTargetException e) {

                e.printStackTrace();

            }

        }

    }

    @Override

    public Object plugin(Object target) {

        return Plugin.wrap(target, this);

    }

    @Override

    public void setProperties(Properties properties) {

        System.out.println("init UUIDInterceptor");

    }

猜你喜欢

转载自blog.csdn.net/vannable/article/details/85449924
今日推荐