POJO(Plain Ordinary Java Object)即普通Java類,具有一部分getter/setter方法的那種類就可以稱作POJO。
/* POJO類,與數據庫表中的欄位一一對應
* 1 類名與表名一致
* 2 屬性與表欄位一致
* - 屬性的名稱與表欄位名相同
* - 屬性的型別與表欄位屬性一致,且使用包裝型別,如 Long, Integer等
* 3 生成 Getter/Setter方法
*/
public class Student
{
public Integer id;
public String name;
public Boolean sex;
public String phone;
public Date birthday;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Boolean getSex() {
return sex;
}
public void setSex(Boolean sex) {
this.sex = sex;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
}
public List query(String sql, Class clazz) throws Exception
{
// 查詢
ResultSet rs = executeQuery(sql);
// 取得MetaData
ResultSetMetaData rsmd = rs.getMetaData();
AfSqlMeta[] metaArray = AfSqlMeta.read(rsmd);
// 構造一個List返回
int numColumn = metaArray.length;
List result = new ArrayList();
while(rs.next())
{
// 將每行數據轉爲一個POJO物件
Object pojo = clazz.newInstance();
result.add(pojo);
// 通過setter設定pojo的各個屬性
for(int i=0; i<numColumn; i++)
{
AfSqlMeta meta = metaArray[i]; // 該列的Meta數據
String value = rs.getString(i+1); // 該列的值
// 根據型別提示,轉成Integer, String, Boolean, Date等基本型別
Object typedValue = AfSqlReflect.typedValue(ctx, meta.type, value);
// 將列值設定給POJO的屬性
try {
AfSqlReflect.setPojo(pojo, meta.label, typedValue);
}catch(Exception e)
{
// e.printStackTrace();
System.out.println("** 錯誤: " + e.getMessage());
}
}
}
return result;
}
public void insert(Object pojo) throws Exception
{
// 解析類的資訊
Class clazz = pojo.getClass();
AfSqlPojo po = AfSqlPojo.from(clazz);
if(po.tableName == null)
throw new Exception("類 " + clazz.getName() + "中缺少AFTABLE註解! 無法自動插入!");
// 準備建立SQL語句
AfSqlInsert insertSQL = new AfSqlInsert(po.tableName);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// 根據對映關係,類的屬性名 <-> 列名,拼湊SQL語句
for(AfSqlColumn c : po.columns)
{
String fieldName = c.name; // 列名
Method getter = po.findGetter(fieldName);
try {
Object value = getter.invoke(pojo); // 每一列的值
if(value != null)
{
if(value instanceof Boolean)
{
Boolean v = (Boolean)value;
value = v ? "1" : "0";
}
else if(value instanceof Date)
{
Date v = (Date) value;
value = sdf.format(v);
}
insertSQL.add(fieldName, value.toString());
}
}catch(Exception e)
{
}
}
// 執行INSERT語句
String sql = insertSQL.toString();
System.out.println("** INSERT SQL:" + sql);
Statement stmt = conn.createStatement();
if(po.generatedKey == null)
{
// 無自增ID
stmt.execute(sql);
}
else
{
// 自增主鍵ID處理
// 1 如果使用者在插入時已經自己指定了一個值,則MySQL會使用這個值,並返回這個值
// 2 如果使用者在插入時未定自增主鍵的值,則MySQL會生成一個自增的值,並返回
stmt.execute(sql,Statement.RETURN_GENERATED_KEYS);
ResultSet keys = stmt.getGeneratedKeys();
if(keys.next())
{
// 取回自增的ID
String id = keys.getString(1);
try {
Method setter = AfSqlReflect.findSetter(clazz, po.generatedKey);
AfSqlReflect.setPojo(pojo, setter, id);
}catch(Exception e)
{
}
}
}
}