如何通过注解Bean类来封装SQL插入语句
2017-02-22 16:37
295 查看
整体思路是酱紫的:
给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上注解说明该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
相关文章推荐
- 如何通过sql的insert语句插入大量字符串到oracle的clob字段?
- 学习在Sql Server中如何通过SQL语句创建Job
- 如何通过SQL语句修改系统日期和时间
- SQL语句oracle中如何插入Date类型的数据
- SQL语句 如何把从一个表中查出来数据插入到另一个表中
- SQL Server 2000如何用SQL语句在在指定位置插入列
- 学习在Sql Server中如何通过SQL语句创建Job
- 如何在sql的查询语句中插入特殊字符
- 如何通过sql日志,查看以前执行过的sql语句
- MSSQL数据库被插入木马如何用SQL语句批量删除
- sql语句如何在insert一条数据后直接返回刚刚插入的数据的ID
- hibernate通过sql语句查询出的结果集封装到bean里面去
- SQL Server 2000如何用SQL语句在在指定位置插入列
- 数据表中有字段time(类型为varchar),如何通过sql语句找出这个字段里力离当前最近的一个日期
- 如何用SQL语句在指定字段前面插入新的字段?
- 如何解决在.Net中用Sql语句向SqlServer数据库中插入特殊字符失败的问题?
- SQL2005 中 pivot() 的使用 如何通过一个SQL语句变成竖表
- 如何通过SQL语句查询出表中的列数
- 如何写高效的批量插入和删除sql语句
- SQL:语句如何插入N 年 每天日期