數據庫-MySQL-JDBC框架

2020-08-14 01:04:38

POJO類

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)
				{					
				}
	        }
		}
	}