package com.ucky.annotation.hibernate;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
* 生成建表语句
*/
public class SqlUtil {
/*
* 生成创建table语句
* */
public static String create(Class<?> clazz) {
StringBuilder sb = new StringBuilder();
String tableName = getTableName(clazz);
if (null == tableName || "".equals(tableName)) {
return null;
}
sb.append("CREATE TABLE ").append(tableName).append("(");
Map<String, String> columnMap = getColumn(clazz);
for (Map.Entry<String, String> entry : columnMap.entrySet()) {
sb.append(entry.getKey());
sb.append(" ");
sb.append(entry.getValue());
sb.append(",");
}
sb.deleteCharAt(sb.length() - 1);
sb.append(")");
return sb.toString();
}
/*
* 生成插入语句
* */
public static String insert(Class<?> clazz) {
StringBuilder sb = new StringBuilder();
String tableName = getTableName(clazz);
sb.append("INSERT INTO ").append(tableName).append(" (");
Map<String, String> columnMap = getColumn(clazz);
for (Map.Entry<String, String> entry : columnMap.entrySet()) {
sb.append(entry.getKey());
sb.append(",");
}
sb.deleteCharAt(sb.length() - 1);
sb.append(") ").append("VALUES").append("(");
for (int i = 0; i < columnMap.size(); i++) {
sb.append("?").append(",");
}
sb.deleteCharAt(sb.length() - 1);
sb.append(")");
return sb.toString();
}
public static <T> String insert(Class<T> clazz , T entity){
String sql = insert(clazz);
Field[] fields = entity.getClass().getDeclaredFields();
for(int i$ = 0; i$<fields.length; i$++){
try {
//获取字段信息名
String value = getEntityValue(fields[i$].getName(),entity);
sql = sql.replaceFirst("\\?",value);
} catch (Exception e) {
e.printStackTrace();
}
}
return sql;
}
/*
* 通过id值进行修改
* */
public static <T> String updateById(Class<T> clazz , T entity){
StringBuilder sb = new StringBuilder();
sb.append("UPDATE ").append(getTableName(clazz)).append(" SET ");
Field[] fields = entity.getClass().getDeclaredFields();
try {
for(int i$ = 0 ; i$ < fields.length ; i$++){
if(!"id".equals(fields[i$].getName())){
sb.append(fields[i$].getName());
sb.append(" = ");
sb.append(getEntityValue(fields[i$].getName(),entity));
sb.append(" ,");
}
}
sb.deleteCharAt(sb.length()-1);
sb.append(" WHERE ").append("id = ").append(getEntityValue("id",entity));
} catch (Exception e) {
throw new RuntimeException("获取值出现错误",e);
}
return sb.toString();
}
public static <T> String deleteById(Class<T> clazz,T entity){
StringBuilder sb = new StringBuilder();
sb.append("DELETE FROM ").append(getTableName(clazz)).append(" WHERE ");
try {
sb.append("id = ").append(getEntityValue("id",entity));
} catch (Exception e) {
throw new RuntimeException("获deleteById出现错误",e);
}
return sb.toString();
}
/*
* 获取表名称
* */
private static String getTableName(Class<?> clazz) {
//判断是否为Table注释类型是方法返回true,否则返回false
if (clazz.isAnnotationPresent(Table.class)) {
//获取注解信息
Table table = clazz.getAnnotation(Table.class);
if(!"".equals(table.name())){
return table.name();
}
}
return null;
}
/*
* 获取字段信息的Map
* */
private static Map<String, String> getColumn(Class<?> clazz) {
Map<String, String> columns = new HashMap<String, String>();
//通过反射取得所有Field,因为table那里是注解指定的注解,类型,column是对应方法上的所以不能class.isAnnotationPresent直接判断
Field[] fields = clazz.getDeclaredFields();
if (fields != null) {
String columnName, type;
Column column;
for (int i$ = 0; i$ < fields.length; i$++) {
//判断当前field是否为Column注解
if (fields[i$].isAnnotationPresent(Column.class)) {
//获取注解对象
column = fields[i$].getAnnotation(Column.class);
columnName = column.name();
if("".equals(columnName)){
throw new RuntimeException("未找到对应字段名:" + i$);
}
//根据不同类型生成不同的SQL
if (int.class.isAssignableFrom(fields[i$].getType())) {
type = "int";
} else if (String.class.isAssignableFrom(fields[i$].getType())) {
type = "String";
} else if (Date.class.isAssignableFrom(fields[i$].getType())) {
type = "Date";
} else {
throw new RuntimeException("不支持数据类型:" + fields[i$].getType().getSimpleName());
}
type += (column.isNull() ? " " : " NOT NULL");
columns.put(columnName, type);
} else if (fields[i$].isAnnotationPresent(PrimaryKey.class)) {
PrimaryKey primaryKey = fields[i$].getAnnotation(PrimaryKey.class);
//将一个类的成员变量置为private,其实我也不知道啥意思,有知道的指点一下 ,谢谢!
fields[i$].setAccessible(true);
columnName = primaryKey.name();
if("".equals(columnName)){
throw new RuntimeException("未找到对应主键名" );
}
type = "INT PRIMARY KEY AUTO_INCREMENT";
columns.put(columnName, type);
}
}
}
return columns;
}
private static <T> String getEntityValue(String columnName , T entity ) throws Exception{
String getMethodStr = columnName.substring(0,1).toUpperCase() + columnName.substring(1);
Method method = entity.getClass().getMethod("get" + getMethodStr);
return method.invoke(entity).toString();
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
利用JAVA注解实现SQL语句自动生成 编写对应Entity添加相关注解,并通过SqlUtil工具,传入相关参数生成SQL语句 例如:要生成对应数据库Person的SQL增删改查 SqlUtil.create(Person.class) SqlUtil.insert(Person.class) SqlUtil.insert(Person.class,person) SqlUtil.updateById(Person.class,person) SqlUtil.deleteById(Person.class,person) 开发工具IDEA,MAVEN项目
资源推荐
资源详情
资源评论
收起资源包目录
AnnotationsqlUtil.zip (24个子文件)
AnnotationsqlUtil
src
main
webapp
WEB-INF
web.xml 222B
index.jsp 57B
resources
java
com.ucky.annotation
hibernate
PrimaryKey.java 340B
Column.java 424B
Table.java 341B
test.java 581B
Person.java 512B
SqlUtil.java 7KB
target
generated-sources
annotations
classes
com
ucky
annotation
hibernate
Column.class 538B
SqlUtil.class 6KB
PrimaryKey.class 472B
test.class 1KB
Table.class 461B
Person.class 979B
.idea
artifacts
AnnotationsqlUtil_war_exploded.xml 694B
AnnotationsqlUtil_war.xml 318B
libraries
Maven__junit_junit_3_8_1.xml 462B
misc.xml 566B
compiler.xml 646B
uiDesigner.xml 9KB
workspace.xml 55KB
modules.xml 274B
pom.xml 760B
AnnotationsqlUtil.iml 1KB
共 24 条
- 1
资源评论
- hejinlove2020-03-14蛮好的工具类
UckyK
- 粉丝: 14
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功