zoukankan      html  css  js  c++  java
  • 如何通过注解Bean类来封装SQL插入语句

    整体思路是酱紫的:

    给bean注解说明该bean对应着数据库中哪张表,给每个bean的属性都注解说明各自对应着这张表的哪个字段。

    通过类反射获取表名,通过逐个反射每个属性的getter方法,获取注解在属性上的字段名,以及属性值。

    拿到表名、字段名、值,就可以拼接插入语句了。

    细细道来

    定义bean :

    你需要定义一个有gettersetter及注解的bean,like this

    @Table(name = "PUPIL_STUDENT")

    public class StudentBean {

     

    @Column(name = "ROW_ID")

    private String id;

     

    @Column(name = "NAME")

    private String name;

     

    public String getId() {

    return id;

    }

    public void setId(String id) {

    this.id = id;

    }

    public String getName() {

    return name;

    }

    public void setName(String name) {

    this.name = name;

    }

     

    }

    定义注解类:

    使用注解的前提是你必须先定义注解类:

    @Target(ElementType.TYPE)

    @Retention(RetentionPolicy.RUNTIME)

    public @interface Table

    {

    /**

     * 数据库表名

     */

    public abstract String name();

     

    }

    这是注解的一般定义方法,三点说明:

    1.使用@interface定义注解类

    2.@Retention(RetentionPolicy.RUNTIME) 表示该注解可以在运行期被读取;

    3.@Target(ElementType.TYPE)表示这个注解只能被用到目标类(如StudentBean)的方法上

    Column注解类也是类似的定义方式。

     

    反射获取ClassMethod :

    想要通过反射获取表名字段名等,需要先获取类对象和方法对象(反射的惯用套路)

    Class<?> clz = obj.getClass(); //obj就是bean对象的名称

    Method[] methods = clz.getMethods();

    获取表名:

    获取表名的关键代码是:

    Table _table = clazz.getAnnotation( Table.class );//获取注解类

    String table_name = _table.name();//获取注解类的属性

    通过bean上面的代码:@Table(name = "PUPIL_STUDENT") 就可以看出,获取的table_name就等于:”PUPIL_STUDENT”。

    需要注意的地方是:

    如果在当前类中并未找到Table注解,:上面的_table变量null,这时,你需要“上诉”到父类继续去寻找,也就是说此时需要把clazz改为父类的Class实例

    clazz = clazz.getSuperclass();

    然后获取注解。这个逻辑应该要用到一个do{}while()循环吧。

    获取每一个字段名:

    通过Method[] methods = clz.getMethods()已经获取到所有方法了,遍历每个方法,我们现在的目标是,拿到属性值和属性上方的注解字段名。

    对每一个method,调用getName()就能得到method的名称,然后拿到以”get”开头方法。getId()为例,这个方法的方法名为:”getId”,截取”get”之后的字符串,即:Id,然后将其首字母变为小写,即:id,就得到了一个属性名。其他属性名也是这样获取。

    由于getter方法就是获取属性值的方法,那么通过反射技术:method.invoke(obj, new Object[]{});获取到了该属性的值。

    反射技术中,变量对应的类是Field,既然拿到了变量名,那么通过变量名来获取对应的Field通过Field来获取变量(属性)上方的Column注解,通过注解获取字段名称,一气呵成:

    Field f= clz.getDeclaredField(m_name);

    Column col = f.getAnnotation(Column.class);

    String col_name = col.name();

    表名有了,每一个字段名,字段值也有了,接下来就可以拼接成SQL


    更多内容关注微信号:it_pupil

  • 相关阅读:
    QDUOJ LC的课后辅导 单调递增栈
    蓝桥杯 时间问题
    区间sum 和为k的连续区间-前缀和
    康托展开-全排列的编码与解码
    康托展开-全排列应用
    背包之01背包、完全背包、多重背包详解
    HDU
    辗转相除求最大公约数与最小公倍数
    快速幂(反复平方法)
    HDU
  • 原文地址:https://www.cnblogs.com/mesopotamia/p/6429622.html
Copyright © 2011-2022 走看看