java实现从实体到SQL语句的转换
使用过Hibernate,EF之类的ORM框架都知道一般的CRUD之类的简单操作,只要调用框架封装好了的方法,框架就自动生成相应的SQL语句了,参照实习公司给的代码,那个是C#版的,今天弄了一下java的,这里介绍怎么从实体转换为标准的Insert SQL语句,其他的也差不多
思路很简单:只要获取得了实例化后的类的信息,之后再进行组装
关于如何获取java类信息,我参照了:java获取对象属性类型、属性名称、属性值 这篇博客
由于个人水平的问题,这里还有一些bug:
1.约定实体的主键命名为“id”且由数据库库自动生成(如果想要自己设置id的值可以注释下面的代码),这里可以进行判断,不过有点麻烦就算了,所以自己弄了一个约定
if (list.get(i).get("f_name").toString() == "id") i++;
2.属性类型为数值类型时,没有手动赋值时会自动赋值为0,所以期待大神们帮忙解决
在代码里面也有标注;
下面是示例,这里我只写了生成Insert语句的方法,如下:
为了演示代码的通用性,首先准备两个不同的实体类:User 和 Book
User类:
-
package com.tan.ctesql;
-
-
public class User {
-
private int id;
-
private String name;
-
private String email;
-
private String sex;
-
-
public int getId() {
-
return id;
-
}
-
-
public void setId(int id) {
-
this.id = id;
-
}
-
-
public String getName() {
-
return name;
-
}
-
-
public void setName(String name) {
-
this.name = name;
-
}
-
-
public String getEmail() {
-
return email;
-
}
-
-
public void setEmail(String email) {
-
this.email = email;
-
}
-
-
public String getSex() {
-
return sex;
-
}
-
-
public void setSex(String sex) {
-
this.sex = sex;
-
}
-
-
}
-
Book类:
-
package com.tan.ctesql;
-
-
public class Book {
-
private int id;
-
private String name;
-
private String date;
-
private float price;
-
-
public int getId() {
-
return id;
-
}
-
public void setId(int id) {
-
this.id = id;
-
}
-
public String getName() {
-
return name;
-
}
-
public void setName(String name) {
-
this.name = name;
-
}
-
public String getDate() {
-
return date;
-
}
-
public void setDate(String date) {
-
this.date = date;
-
}
-
public float getPrice() {
-
return price;
-
}
-
public void setPrice(float price) {
-
this.price = price;
-
}
-
-
-
}
-
下面就是生成SQL语句的方法了:
-
package com.tan.ctesql;
-
-
import java.lang.reflect.Field;
-
import java.lang.reflect.Method;
-
import java.util.ArrayList;
-
import java.util.HashMap;
-
import java.util.List;
-
import java.util.Map;
-
-
public class CreateInsert<T> {
-
-
public String createinsert(T entity) {
-
-
String sql = "Insert into ";
-
String column = ""; // 列
-
String c_values = ""; // 列值
-
List<Map<String, Object>> list = getFiledsInfo(entity);
-
sql += list.get(0).get("obj_name").toString() + " ";
-
for (int i = 0; i < list.size(); i++) {
-
-
//約定id在數據庫自動生成-20130807
-
-
if (list.get(i).get("f_name").toString() == "id")
-
i++;
-
if (list.get(i).get("f_value") != null) {
-
-
// System.out.println("属性数据类型:" + list.get(i).get("f_type"));
-
column += list.get(i).get("f_name") + ",";
-
c_values += "'" + list.get(i).get("f_value") + "',";
-
}
-
-
}
-
sql += "(" + column.substring(0, column.length() - 1) + ") values ("
-
+ c_values.substring(0, c_values.length() - 1) + ");";
-
-
return sql;
-
}
-
-
/**
-
* 根据属性名获取属性值
-
* */
-
protected Object getFieldValueByName(String fieldName, Object o) {
-
try {
-
String firstLetter = fieldName.substring(0, 1).toUpperCase();
-
String getter = "get" + firstLetter + fieldName.substring(1);
-
Method method = o.getClass().getMethod(getter, new Class[] {});
-
Object value = method.invoke(o, new Object[] {});
-
return value;
-
} catch (Exception e) {
-
// log.error(e.getMessage(), e);
-
return null;
-
}
-
}
-
-
/**
-
* 类名(obj_name)获取属性类型(f_type),属性名(f_name),属性值(f_value)的map组成的list
-
* */
-
@SuppressWarnings("unused")
-
protected List getFiledsInfo(Object o) {
-
-
String obj_name = o.getClass().getSimpleName().toString();
-
Field[] fields = o.getClass().getDeclaredFields();
-
String[] fieldNames = new String[fields.length];
-
List<Map> list = new ArrayList();
-
Map<String, Object> infoMap;
-
-
for (int i = 0; i < fields.length; i++) {
-
infoMap = new HashMap<String, Object>();
-
-
infoMap.put("obj_name", obj_name);
-
infoMap.put("f_type", fields[i].getType().toString());
-
infoMap.put("f_name", fields[i].getName());
-
infoMap.put("f_value", getFieldValueByName(fields[i].getName(), o));
-
list.add(infoMap);
-
}
-
return list;
-
}
-
-
// // 判断属性类型
-
// protected boolean checkType(String f_type) {
-
// if (f_type.equals("int") || f_type.equals("float")
-
// || f_type.equals("double")) {
-
//
-
// return true;
-
// }
-
// return false;
-
// }
-
//
-
// // 轉換
-
// protected boolean convert(String f_value) {
-
//
-
// if (Integer.parseInt(f_value) == 0)
-
// return false;
-
// return true;
-
//
-
// }
-
-
}
-
最后是测试代码:
-
package com.tan.ctesql;
-
-
import static org.junit.Assert.*;
-
-
import java.text.SimpleDateFormat;
-
import java.util.Date;
-
import java.util.Iterator;
-
import java.util.List;
-
import java.util.Map;
-
-
import org.junit.Test;
-
-
public class MyTest {
-
-
@Test
-
public void test() {
-
// fail("Not yet implemented");
-
-
User user = new User();
-
//user.setId(1);
-
user.setName("Tan");
-
user.setEmail("tan@sina.cn");
-
user.setSex("boy");
-
-
Date dt = new Date();
-
SimpleDateFormat sf=new SimpleDateFormat("yyyy-MM-dd");
-
-
Book book = new Book();
-
book.setName("精通SQL");
-
book.setPrice(100);
-
book.setDate(sf.format(dt));
-
-
CreateInsert ci = new CreateInsert();
-
// User
-
System.out.println("生成User的插入SQL語句:" + ci.createinsert(user));
-
//Book
-
System.out.println("生成Book的插入SQL語句:" + ci.createinsert(book));
-
-
}
-
}
-
测试结果:
原文地址:https://blog.csdn.net/mr_tank_/article/details/9816771
java实现从实体到SQL语句的转换的更多相关文章
- java实现从实体到SQL语句的转换(二)
前面写过一篇生成insert语句的博客,今天把CRUD的都完善了一下,需要的上次写的获取实体信息的类,这里就不贴出来了[点击打开查看] 下面是完整的代码: package tan.code.utils ...
- 详解Java的MyBatis框架中SQL语句映射部分的编写
这篇文章主要介绍了Java的MyBatis框架中SQL语句映射部分的编写,文中分为resultMap和增删查改实现两个部分来讲解,需要的朋友可以参考下 1.resultMap SQL 映射XML 文件 ...
- SqlServer数据库表生成C# Model实体类SQL语句——补充
在sql语句最前边加上 use[数据库名] 原链接:https://www.cnblogs.com/jhli/p/11552105.html --[SQL骚操作]SqlServer数据库表生成C ...
- Java下拼接运行动态SQL语句
mod=viewthread&tid=3039" target="_blank">Java拼接动态SQL的一般做法有 1.使用动态语句 非常多数 ...
- Java下拼接执行动态SQL语句(转)
在实际业务中经常需要拼接动态SQL来完成复杂数据计算,网上各类技术论坛都有讨论,比如下面这些问题: http://bbs.csdn.net/topics/390876591 http://bbs.cs ...
- java for循环里面执行sql语句操作,有效结果只有一次,只执行了一次sql mybatis 循环执行update生效一次 实际只执行一次
java后台controller中,for循环执行数据库操作,但是发现实际仅仅执行了一次,或者说提交成功了一次,并没有实际的个数循环 有可能是同一个对象导致的 可以仔细看一下下面两段代码有什么区别 p ...
- Java获取Date类型-针对SQL语句
简便使用Date类型: import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedState ...
- 【SQL骚操作】SqlServer数据库表生成C# Model实体类SQL语句
已知现有表T1 想快速获取cs类结构 /// <summary> /// T1 /// </summary> public class T1 { /// <summary ...
- 【转发】SqlServer数据库表生成C# Model实体类SQL语句
已知现有表T1 通过运行下面的sql即可,先配置表名. declare @TableName sysname = 'T1' declare @Result varchar(max) = ' /// & ...
随机推荐
- MD5/SHA1/Hmac_SHA1
1.MD5 #import <CommonCrypto/CommonDigest.h> + (NSString *) md5:(NSString *) input { const char ...
- Benchmark of Large-scale Unconstrained Face Recognition-blufr 算法的理解
Many efforts have been made in recent years to tackle the unconstrained face recognition challenge. ...
- hibernate的核心思想
Hibernate的核心思想是ROM对象关系映射机制.它是将表与表之间的操作映射成对象与对象之间的操作.也就是从数据库中提取的信息会自动按照你设置的映射要求封装成特定的对象.所以hibernate就是 ...
- vue 兄弟组件的传值
handleLetterClick方法,采用emit 传递给父组件 父组件触发的方法: handleLetterChange方法: 父组件传递给子组件: CityList组件: 兄弟组件的传值可以 ...
- windwos下的转excel到PDF并预览的工具,有Aspose,Spire,原生Office三种方式
SchacoPDFViewer 项目链接:https://github.com/tiancai4652/SchacoPDFViewer/tree/master 主要实现了对于Excel文件转换PDF, ...
- oracle 删除掉重复数据只保留一条
用SQL语句,删除掉重复项只保留一条 在几千条记录里,存在着些相同的记录,如何能用SQL语句,删除掉重复的呢 .查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断 select ...
- 模式识别原理(Pattern Recognition)、概念、系统、特征选择和特征
§1.1 模式识别的基本概念 一.广义定义 1.模式:一个客观事物的描述,一个可用来仿效的完善的例子. 2.模式识别:按哲学的定义是一个“外部信息到达感觉器官,并被转换成有意义的感觉经验”的过程. 例 ...
- [SNOI 2017] 炸弹
题目描述: 给定炸弹和爆炸范围,求对于每个炸弹连锁爆炸的炸弹总和对\(1e9+7\)取膜 思路: 为啥都是线段树+TS+tarjan呢? 实在是搞不懂~~ 线性\(O(n)\)递推即可. #inclu ...
- WordPress 3.8 中文正式版下载 - 建站与学习首选!全球最流行的开源PHP博客网站程序
转载自:http://www.iplaysoft.com/wordpress.html 话说虽然我一直都在网站底部写着本站基于 WordPress 构建,但时常还是有人问我网站是用什么程序建的,还真有 ...
- 面试系列九 es 提高查询效率
,es性能优化是没有什么银弹的,啥意思呢?就是不要期待着随手调一个参数,就可以万能的应对所有的性能慢的场景.也许有的场景是你换个参数,或者调整一下语法,就可以搞定,但是绝对不是所有场景都可以这样. 一 ...