Spring Boot2.x 开发技巧及实战 第2章:Spring Boot2( 二 )


@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)public @interface Mytable {String name() default "";}@Target({ElementType.FIELD})@Retention(RetentionPolicy.RUNTIME)public @interface MyColumn {String name() default "";}
2.1.2.4 注解使用类
紧接着我们创建注解的使用类:User.java,就是一个使用注解的Java bean,这里使用我们的自定义注解@
package com.binge.springboot.lesson21.entity;import com.binge.springboot.lesson21.annotation.MyColumn;import com.binge.springboot.lesson21.annotation.Mytable;/*** @Title: User.java* @Package com.binge.springboot.lesson21.entity* @Description: 用户实体类* @author: binge* @date 2020/2/27* @version V1.0*/@Mytable("user")public class User {@MyColumn("user_id")String userId;//用户ID@MyColumn("user_name")String userName; //用户名@MyColumn("password")String password; //用户密码public String getUserId() {return userId;}public void setUserId(String userId) {this.userId = userId;}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;}}
2.1.2.5 注解解释类
有了下面这个类,我们创建的两个注解才有实际的意义 。这个类的思路就是:
我们会判断一个类是否已经添加我们自定义的两个注解然后获取到注解的参数值,加以使用
代码中的注释,非常清晰的注明了注解的使用,代码如下:
package com.binge.springboot.lesson21.service;import com.binge.springboot.lesson21.annotation.MyColumn;import com.binge.springboot.lesson21.annotation.Mytable;import com.binge.springboot.lesson21.entity.User;import java.lang.reflect.Field;import java.lang.reflect.Method;/*** @Title: UserService.java* @Package com.binge.springboot.lesson21.service* @Description: 用户业务类* @author: binge* @date 2020/2/27* @version V1.0*/public class UserService {/*** 通过用户对象生成查询SQL语句的方法* @param user用户对象* @return 生成的sql语句*/public static String createSql(User user){StringBuffer sb = new StringBuffer();//通过反射,获取用户的class对象Class cla = user.getClass();//判断是否添加了某种注解,这里判断是否添加了Mytable注解boolean hasAnnotation = cla.isAnnotationPresent(Mytable.class);//如果没有添加注解,则直接返回,因为没有添加注解,无法生成sql语句if(!hasAnnotation){return null;}//如果添加了注解,把此注解类型强制转换为MytableMytable mytable = (Mytable)cla.getAnnotation(Mytable.class);//这个就是给User类上添加注解时,传入的参数String tableName = mytable.value();//接下来便是,利用反射机制,遍历类的变量进行生成拼接sql语句sb.append("select * from ").append(tableName).append(" where 1=1 ");Field[] fields = cla.getDeclaredFields();for (Field field : fields){//判断字段是否添加了MyColumn注解hasAnnotation = field.isAnnotationPresent(MyColumn.class);if(!hasAnnotation){return null;}//此处将生成getXXX方法,然后利用反射机制,获取字段的值String fieldName = field.getName();String methodName = "get" + fieldName.substring(0,1).toUpperCase()+ fieldName.substring(1);//这个变量用户存储每个变量的数值//这部分代码就是利用反射机制获取每个变量的数值Object fieldValueObj = null;try{Method method = cla.getMethod(methodName);fieldValueObj = method.invoke(user);}catch (Exception e){e.printStackTrace();}//获取列上配置的参数名,这个一般是数据库的字段名MyColumn myColumn = (MyColumn)field.getAnnotation(MyColumn.class);String colName = myColumn.value();//拼接数据库的字段及值sb.append(" and ").append(colName).append("=").append(fieldValueObj);}//返回拼接好的sqlreturn sb.toString();}public static void main(String[] args) {//创建一个user对象,只设置部分变量的值User user = new User();user.setUserId("12");user.setUserName("binge");String sql = UserService.createSql(user);System.out.println(sql);}}