如何通过注解Bean类来封装SQL插入语句
整体思路是酱紫的:
给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插入语句的更多相关文章
- 快速将一个表的数据生成SQL插入语句
将一个表中的数据生成SQL插入语句,方便系统快速初始化,在数据库中执行创建以下过程就可以了. ) Drop Procedure GenerateData go CREATE PROCEDURE Gen ...
- [lua, mysql] 将多条记录数据组合成一条sql插入语句(for mysql)
-- 演示将多条记录数据组合成一条sql插入语句(for mysql) function getTpl0(tname) -- 获取表各个字段 local t = { tpl_pack = {" ...
- jdbc操作根据bean类自动组装sql,天啦,我感觉我实现了hibernate
场景:需要将从ODPS数仓中计算得到的大额可疑交易信息导入到业务系统的mysql中供业务系统审核.最简单的方式是用阿里云的组件自动进行数据同步了.但是本系统是开放是为了产品化,要保证不同环境的可移植性 ...
- 比较两个文件不同以及生成SQL插入语句
Tips 做一个终身学习的人! 日拱一卒,功不唐捐. 今天有个小小的需求,具体需求是这样的: 有两个文本文件,每个文件都有一些字符串文本: 比较第一个文件中,在第二个文件中,不存在的字符串文本: 把这 ...
- 小程序实现sql插入语句转换成Laravel迁移语句
sql的插入语句长这样: INSERT INTO `media` (`MediaID`, `type`, `filename`, `title`) VALUES (1, 'word', 'word1. ...
- SQL 插入语句汇总
INSERT VALUES 插入一行或多行到目标表中 -- single row INSERT INTO Sales.MyOrders(custid, empid, orderdate, shipco ...
- 最新省市区数据,sql插入语句
--省数据 insert into Province (ProvinceName) values('北京市'); insert into Province (ProvinceName) value ...
- pL/Sql插入语句时报错,对表空间没有权限 对表空间 'USERS' 无权限
进入dba为其授予权限:sqlplus sys/admin as sysdba; 为用户授予权限即可 grant unlimited tablespace to username;
- sql插入语句笔记
使用INSERT插入数据行 [一次插入一行数据] 全写: INSERT INTO renshi (name, sex, age ,tel) VALUES ('胡大姐','女','35','13 ...
随机推荐
- 【转】iOS开发路线简述
简单看了下楼主说的很详细,尤其是最后面那个图描述很直观,让想学习ISO开发的程序猿很清晰每个步骤学习的内容,在此收藏下. iOS系统以及iPhone的出来都要感谢乔布斯,一个完美主义者,从如此优秀的i ...
- iOS 改变导航栏高度
需求: appdelegate里 rootviewcontroller 是tabbarcontroller,tabbarcontroller里有4个navigationcontroller,改变每个n ...
- C++类的存储(部分可用与c的结构体)
c++中最重要的就是类,那么给你一个类的对象,你知道它在内存中如何存储的吗?它占内存中多少个字节? 首先确定类的构成: 1,数据成员:可以是内置类型,类类型. 2,函数成员:虚函数,非虚函数 1)数据 ...
- 深度学习caffe:Ubuntu16.04安装指南(1)
caffe [CPU ONLY] 2017-01-15 最简单的安装配置方式: 不用GPU加速,使用OPENCV2.4图像库, 这是根据官方教程(链接如下)简化而得到. Ubuntu 16.04 or ...
- mvn常用指令记录
maven工程版本号更新: -------------------------------------------------------------------------------------- ...
- 兼容ie6及以上的阴影滤镜的写法
.subnav{ width: 220px; _width:160px; min-height: 168px; border: 1px solid #d0d8da; background: #fff; ...
- js实时显示系统时间
刚刚在做后台页面最上面要动态显示时间刚写了这个代码 将这段代码加入<head></head> <!--时间显示代码 --><script>functio ...
- 解析STL中典型的内存分配
1 vector 在C++中使用vector应该是非常频繁的,但是你是否知道vector在计算内存分配是如何么? 在c++中vector是非常类似数组,但是他比数组更加灵活,这就表现在他的大小是可以自 ...
- XMLSocket的bug
"<cross-domain-policy>" "<site-control permitted-cross-domain-policies=\&quo ...
- 关于angularjs过滤器的小尝试
最近的项目中用到了angularjs,相比传统的jquery直接操作Dom, 开发web项目,angularjs在操作表格数据时的数据绑定,操作让我不禁直呼过瘾,好方便啊, 从后台接口传一个json过 ...