使用過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