前面了解了封装数据库操作,现在了解下对SQL语句自动生成封装,平常的数据库业务项目中经常写SQL语句,增加、删除、修改、查询,常用的SQL语句构造方法都一致,常用的SQL语句与表名,列名有关,我们知道项目开发一般都会针对一张表建立一个数据实体模型,模型中的属性与数据库表中 的列名一一对应,试想如果能构建一个封装的插件,根据模型自动生成SQL的插入,删除,修改,查询语句,这样多节约开发时间。

    本插件即com.spkg,com在SQLString中封装了生成SQL常用语句的功能,其中T是泛型,在条件查询中,key是搜索关键词,num每页显示的数量,page当前页码;最后用toString方法输出SQL语句。

/**
 * 根据实体以及实体内的注解形成插入的sql语句,列名需和属性名一致
 * @param t 实体
 * @return SQL语句
 * @throws Exception 
 */
 public <T>void insertSQL(T t) throws Exception;
/**
 * 根据实体以及实体内的注解形成更新的sql语句,列名需和属性名一致
 * @param t 实体
 * @return SQL语句
 * @throws Exception 
 */
 public <T>void updateSQL(T t) throws Exception;
/**
 * 根据实体以及实体内的注解形成删除的sql语句,列名需和属性名一致
 * @param t 实体
 * @return SQL语句
 * @throws Exception 
 */
 public <T>void deleteSQL(T t) throws Exception;
/**
 * 根据实体以及实体内的注解形成根据主键查询单条数据的sql语句,列名需和属性名一致
 * @param t 实体
 * @return SQL语句
 * @throws Exception 
 */
 public <T>void selectSingleSQL(T t) throws Exception;
/**
 * 生成字符串类型字段根据key值或条件查询SQL语句,仅限本表String类型,mysql可使用
 * 生成条件查询语句,提供自定义单个对象PK查询,mysql可使用
 * @param t
 * @param num
 * @param page
 * @throws Exception 
 */
 public <T>void searchSqlByCond(T t, Integer num, Integer page, String key) throws Exception;
/**
 * 根据查询结果计数sql,mysql可使用
 * @param t
 * @param key
 * @throws Exception
 */
 public <T>void searchResultCount(T t, String key) throws Exception;

   使用过程中,我们还需要对实体模型进行注解,注解方式如下(一个实体模型例子):

package com.spkg.test;

import java.util.Date;

import com.spkg.annotation.db.FieldName;
import com.spkg.annotation.db.PK;
import com.spkg.annotation.db.TableName;

@TableName("dt_managers")
public class Manager {

	@PK
	private Integer jno;
	private String password;
	private String name;
	private Integer sex;
	private Date birth;
	private String position;
	@FieldName("bid")
	private Book book;
	
	public Book getBook() {
		return book;
	}
	//...其他get,set方法
}

其中,TableName是注明本模型所对应的表名,PK标注属性为主键,FieldName标注数据库对应列名的值是此属性类型中的哪个属性,这种属性类型在其类中需构建一个构造器,构造器的参数为FieldName标记的属性名对应属性。此外还提供了其他注解,Disregard:标记为在数据库操作中此属性被忽略,即数据库中没有与之对应的列,标记对象为属性;OrderBy:标记本模型对应的表执行查询语句时的排序方式,标记对象为类;Statics:标记此属性对应的列在插入数据时是固定的字符串,例如获取当前的时间属性,直接给属性标记@Statics("now()");UnWrite:标记属性为不写,即此属性不参与SQL语句的形成,有Type.YES插入更新都不写,Type.INSERT插入不写,Type.UPDATE更新不写。


注:本封装中使用了大量反射、注解、泛型,反射面对大量会影响项目的访问效率,平常作业的项目开发中因为不用在意效率所以关系不大,实际的项目中需要考虑。