[04] 利用注解生成实体类对应的建表sql语句
1、实现功能
@Table(name = "t_student")
public class Student {
@Column(name = "c_name")
public String name;
@Column(name = "c_sex")
public String sex;
...
}
@Table(name = "t_student")
public class Student {
@Column(name = "c_name")
public String name;
@Column(name = "c_sex")
public String sex;
...
}
2、自定义注解
@Retention(RetentionPolicy.RUNTIME)
public @interface Table {
//设置表名
String name();
}
@Retention(RetentionPolicy.RUNTIME)
public @interface Column {
//设置字段名
String name();
}
@Retention(RetentionPolicy.RUNTIME)
public @interface Table {
//设置表名
String name();
}
@Retention(RetentionPolicy.RUNTIME)
public @interface Column {
//设置字段名
String name();
}
3、对实体类使用注解
/**
* 学生类
*/
@Table(name = "t_student")
public class Student {
@Column(name = "c_name")
public String name;
@Column(name = "c_sex")
public String sex;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
/**
* 学生类
*/
@Table(name = "t_student")
public class Student {
@Column(name = "c_name")
public String name;
@Column(name = "c_sex")
public String sex;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
4、运行时获取注解并转化
4.1 获取表名
private static String getTableName(Class<?> clazz) {
String name = null;
//如果有@Table注解
if (clazz.isAnnotationPresent(Table.class)) {
Table table = clazz.getAnnotation(Table.class);
name = table.name();
}
return name;
}
private static String getTableName(Class<?> clazz) {
String name = null;
//如果有@Table注解
if (clazz.isAnnotationPresent(Table.class)) {
Table table = clazz.getAnnotation(Table.class);
name = table.name();
}
return name;
}
4.2 获取字段名和类型
public class NameAndType {
String name;
String type;
public NameAndType(String name, String type) {
this.name = name;
this.type = type;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}
public class NameAndType {
String name;
String type;
public NameAndType(String name, String type) {
this.name = name;
this.type = type;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}
private static List<NameAndType> getColumns(Class<?> clazz) throws Exception {
List<NameAndType> colums = new ArrayList<NameAndType>();
Field[] fields = clazz.getDeclaredFields();
if (fields != null) {
//分析clazz中变量是否需要生成sql字段
for (Field field : fields) {
if (field.isAnnotationPresent(Column.class)) {
//生成sql字段的字段名
Column column = field.getAnnotation(Column.class);
String name = column.name();
//生成sql字段的字段类型
String type;
if (int.class.isAssignableFrom(field.getType())) {
type = "integer";
}
else if (String.class.isAssignableFrom(field.getType())) {
type = "text";
}
else {
throw new Exception("unsupported type");
}
colums.add(new NameAndType(name, type));
}
}
}
return colums;
}
private static List<NameAndType> getColumns(Class<?> clazz) throws Exception {
List<NameAndType> colums = new ArrayList<NameAndType>();
Field[] fields = clazz.getDeclaredFields();
if (fields != null) {
//分析clazz中变量是否需要生成sql字段
for (Field field : fields) {
if (field.isAnnotationPresent(Column.class)) {
//生成sql字段的字段名
Column column = field.getAnnotation(Column.class);
String name = column.name();
//生成sql字段的字段类型
String type;
if (int.class.isAssignableFrom(field.getType())) {
type = "integer";
}
else if (String.class.isAssignableFrom(field.getType())) {
type = "text";
}
else {
throw new Exception("unsupported type");
}
colums.add(new NameAndType(name, type));
}
}
}
return colums;
}
4.3 生成建表sql
public static String createTable(Class<?> clazz) throws Exception {
String sql = null;
String tableName = getTableName(clazz);
List<NameAndType> columns = getColumns(clazz);
if (tableName != null && !tableName.equals("") && !columns.isEmpty()) {
StringBuffer strBuffer = new StringBuffer("CREATE TABLE " + tableName + "( ");
for (NameAndType column : columns) {
String bean = column.getName() + " " + column.getType() + ", ";
strBuffer.append(bean);
}
//删除最后多余的一个逗号
strBuffer.deleteCharAt(strBuffer.length() - 2);
strBuffer.append(");");
sql = strBuffer.toString();
}
return sql;
}
public static String createTable(Class<?> clazz) throws Exception {
String sql = null;
String tableName = getTableName(clazz);
List<NameAndType> columns = getColumns(clazz);
if (tableName != null && !tableName.equals("") && !columns.isEmpty()) {
StringBuffer strBuffer = new StringBuffer("CREATE TABLE " + tableName + "( ");
for (NameAndType column : columns) {
String bean = column.getName() + " " + column.getType() + ", ";
strBuffer.append(bean);
}
//删除最后多余的一个逗号
strBuffer.deleteCharAt(strBuffer.length() - 2);
strBuffer.append(");");
sql = strBuffer.toString();
}
return sql;
}
4.4 测试和结果
public class TestAnnotation {
public static void main(String[] args) throws Exception {
String sql = TableAnnotationUtil.createTable(Student.class);
System.out.println(sql);
}
}
//结果输出
CREATE TABLE t_student( c_name text, c_sex text );
public class TestAnnotation {
public static void main(String[] args) throws Exception {
String sql = TableAnnotationUtil.createTable(Student.class);
System.out.println(sql);
}
}
//结果输出
CREATE TABLE t_student( c_name text, c_sex text );
5、参考链接
附件列表
[04] 利用注解生成实体类对应的建表sql语句的更多相关文章
- 阶段3 1.Mybatis_12.Mybatis注解开发_5 mybatis注解建立实体类属性和数据库表中列的对应关系
创建新项目,一对多 复制刚才关闭的项目的文件 复制到们的新项目里面 复制包的依赖 删减相关代码.只保留这三个查询的方法 模糊查询改成传统的占位符的方式 之前是可以自定义实体类的属性字段,和数据库的字典 ...
- 通过实体类生成建表SQL语句实现方法
import java.io.File; import java.io.FileOutputStream; import java.lang.reflect.Field; import java.ut ...
- 提升开发效率的notepad++一些快捷方法(实体类的创建和查询sql语句的编写)
新手要创建数据库表中,对应字段名的实体类,是不是感觉很麻烦,可以用notepad++快速的把实体类中的字段名进行排版,随后直接粘入idea使用 下面是navicat的演示 选择一个表,右键选择设计表 ...
- IDEA03 连接数据库、自动生成实体类
1 版本说明 JDK:1.8 MAVEN:3.5 SpringBoot:2.0.4 IDEA:旗舰版207.2 MySQL:5.5 2 利用IDEA连接数据库 说明:本案例以MySQL为例 2.1 打 ...
- eclipse逆向生成实体类注解方式或者xml方式
转载自:http://www.2cto.com/database/201501/372023.html http://blog.csdn.net/wangpeng047/article/details ...
- 利用org.mybatis.generator生成实体类
springboot+maven+mybatis+mysql 利用org.mybatis.generator生成实体类 1.添加pom依赖: 2.编写generatorConfig.xml文件 ( ...
- 使用hibernate利用实体类生成表和利用表生成实体类
1,配置数据库,这里以oracle数据库为例.点击右侧Database图标:
- Myeclipse 10使用hibernate生成注解(annotation)实体类
以MySQL数据库为例,请在数据库里面建好对应的表. 1.配置数据库链接 打开Myelipse Database Explorer视图 Window-->Open Perspective--&g ...
- Hibernate框架学习之注解映射实体类
前面的相关文章中,我们已经介绍了使用XML配置文件映射实体类及其各种类型的属性的相关知识.然而不论是时代的潮流还是臃肿繁杂的配置代码告诉我们,注解配置才是更人性化的设计,于是学习了基本的映射 ...
随机推荐
- Linux学习总结(六)—— CentOS软件包管理:源代码安装
源代码包安装方式相对RPM/YUM安装方式较为复杂,并且安装过程更长,一般只在源码研究的时候才会使用这种方式去编译. 源码安装分为解压缩包.配置信息.编译安装三个步骤,安装地址地址一般是/usr/lo ...
- 去除ios反调试
在逆向过程中经常会遇到反调试,如下段代码: 0008bd8e movs r1, #0xa ; argument #2 for method imp___symbolstub1__dlopen 0008 ...
- SQL语句:Group By总结
1. Group By 语句简介: Group By语句从英文的字面意义上理解就是"根据(by)一定的规则进行分组(Group)".它的作用是通过一定的规则将一个数据集划分成若干个 ...
- tomcat调优的几个方面(转)
tomcat调优的几个方面 和早期版本相比最新的Tomcat提供更好的性能和稳定性.所以一直使用最新的Tomcat版本.现在本文使用下面几步来提高Tomcat服务器的性能. 增加JVM堆内存大小 修复 ...
- linux之有名管道
有名管道1.查看命令:man 3 mkfifo 2.头文件:#include <sys/types.h> #include <sys/stat.h> 3.函数原型:int mk ...
- spring boot 登录注册 demo (三) -- 前后端传递
前端页面通过thymeleaf渲染 <dependency> <groupId>org.springframework.boot</groupId> <art ...
- Callable+Future+newFixedThreadPool的应用
最近在处理很多的数据,数据量比较大,但是处理的相对简单一些,没有什么复杂的业务逻辑,然后就使用了多线程去处理.因为一直停留在Thread和Runnable的知识中,项目中使用Callable,刚好可以 ...
- JavaScript面向对象(一)——JS OOP基础与JS 中This指向详解
前 言 JRedu 学过程序语言的都知道,我们的程序语言进化是从"面向机器".到"面向过程".再到"面向对象"一步步的发展而来.类似于 ...
- 监听 window.open 打开的窗口关闭并回调
第三方的登录的解决方案通常有两种方式,一是打开一个新的标签页,然后登录回调回来: 二是通过父窗口打开一个子窗体去第三方登录,登陆成功时关掉子窗体回到父窗口. 问题来了 我的父窗体怎么样才知道子窗体被关 ...
- 【Zigbee技术入门教程-02】一图读懂ZStack协议栈的基本架构和工作机理
[Zigbee技术入门教程-02]一图读懂ZStack协议栈的基本架构和工作机理 广东职业技术学院 欧浩源 ohy3686@foxmail.com Z-Stack协议栈是一个基于任务轮询方式的操作 ...