整体思路是酱紫的:

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

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

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

细细道来

定义bean :

你需要定义一个有getter、setter及注解的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注解类也是类似的定义方式。

 

反射获取Class与Method :

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

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

如何通过注解Bean类来封装SQL插入语句的更多相关文章

  1. 快速将一个表的数据生成SQL插入语句

    将一个表中的数据生成SQL插入语句,方便系统快速初始化,在数据库中执行创建以下过程就可以了. ) Drop Procedure GenerateData go CREATE PROCEDURE Gen ...

  2. [lua, mysql] 将多条记录数据组合成一条sql插入语句(for mysql)

    -- 演示将多条记录数据组合成一条sql插入语句(for mysql) function getTpl0(tname) -- 获取表各个字段 local t = { tpl_pack = {" ...

  3. jdbc操作根据bean类自动组装sql,天啦,我感觉我实现了hibernate

    场景:需要将从ODPS数仓中计算得到的大额可疑交易信息导入到业务系统的mysql中供业务系统审核.最简单的方式是用阿里云的组件自动进行数据同步了.但是本系统是开放是为了产品化,要保证不同环境的可移植性 ...

  4. 比较两个文件不同以及生成SQL插入语句

    Tips 做一个终身学习的人! 日拱一卒,功不唐捐. 今天有个小小的需求,具体需求是这样的: 有两个文本文件,每个文件都有一些字符串文本: 比较第一个文件中,在第二个文件中,不存在的字符串文本: 把这 ...

  5. 小程序实现sql插入语句转换成Laravel迁移语句

    sql的插入语句长这样: INSERT INTO `media` (`MediaID`, `type`, `filename`, `title`) VALUES (1, 'word', 'word1. ...

  6. SQL 插入语句汇总

    INSERT VALUES 插入一行或多行到目标表中 -- single row INSERT INTO Sales.MyOrders(custid, empid, orderdate, shipco ...

  7. 最新省市区数据,sql插入语句

    --省数据 insert into Province (ProvinceName)  values('北京市'); insert into Province (ProvinceName)  value ...

  8. pL/Sql插入语句时报错,对表空间没有权限 对表空间 'USERS' 无权限

    进入dba为其授予权限:sqlplus sys/admin as sysdba; 为用户授予权限即可 grant unlimited tablespace to username;

  9. sql插入语句笔记

    使用INSERT插入数据行 [一次插入一行数据] 全写: INSERT  INTO  renshi  (name, sex, age ,tel) VALUES  ('胡大姐','女','35','13 ...

随机推荐

  1. UE4上传图片到服务器

    客户端代码: void AHttpTestCharacter::MyHttpCall(FString Url){ // TexturePath contains the local file full ...

  2. FB面经 Prepare: All Palindromic Substrings

    Given a string, calculate how many substring is palindrome. Ignore non-char characters. Ignore case; ...

  3. Jquery插件之ajaxForm ajaxSubmit的理解用法

      如今ajax满天飞,作为重点的form自然也受到照顾. 其实,我们在平常使用Jquery异步提交表单,一般是在submit()中,使用$.ajax进行.比如:   $(function(){ $( ...

  4. UVa 573 - The Snail

    题目大意:有一只蜗牛位于深一个深度为h米的井底,它白天向上爬u米,晚上向下滑d米,由于疲劳原因,蜗牛白天爬的高度会比上一天少f%(总是相对于第一天),如果白天爬的高度小于0,那么这天它就不再向上爬,问 ...

  5. [Angular Tutorial] 5-Filtering Repeaters

    在上一步中,我们花了很大功夫来布局应用的基础,所以我们现在做点简单点的吧!我们将会添加一个全文本搜索框(没错,这很简单). ·我们的应用现在会有一个搜索框,注意页面中手机列表的改变取决于用户在搜索框键 ...

  6. (转载)HTML、CSS、JavaScript、PHP、MySQL 的学习顺序是什么?

    文章转载自 鸟巢 - 技术分享的社区 http://t.runoob.com/question/13 1.HTML.CSS.JavaScript 前端学习三部曲,照着这个顺序依次学习 HTML教程.C ...

  7. Angular - - $anchorScroll、$controller、$document

    $anchorScroll 根据HTML5的规则,当调用这个函数时,它检查当前的url的hash值并且滚动到相应的元素. 监听$location.hash()并且滚动到url指定的锚点的地方.可以通过 ...

  8. 浅谈ServletContext

    ServletContext是什么? WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的ServletContext对象,它代表当前web应用.ServletConfig对象中维护了Serv ...

  9. 关于ExtJS必输框,多选项

    必填项: //页面内传值用ID,和后台联系用name <div class="col-xs-4">                     <div class= ...

  10. nmp install 异常

    由于网络的原因,需要多试几次才可以的: -g参数 不会安装在当前目录的: