前言
翻了以前搭的框架,發現了一套基於Spring JDBC寫的ORM。感覺很適合學習,跟大家分享一下。
1:代碼簡單,易懂。
2:功能應有盡有。包括增刪查改,分頁等。
3:底層使用的Spring JDBC,比較穩定,可以放心使用。
如果有不懂的地方,給我留言
代碼
實體註解
package jum.utility.Comments;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface TableEntity {
String tableName() default "";
}
主鍵註解
package jum.utility.Comments;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Method;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@Documented
public @interface TablePrimaryKey {
String keyName() default "";
}
數據訪問層
import jum.model.Page;
import jum.utility.Comments.TableEntity;
import jum.utility.Comments.TablePrimaryKey;
import jum.utility.MapUtils;
import org.springframework.beans.factory.annotation.Autowired;
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.util.StringUtils;
public class BaseDAO<T> {
/**
* T 對應的類對象
*/
private Class<T> entityClass;
/**
* spring jdbcTemplate 對象
*/
@Autowired
protected NamedParameterJdbcTemplate jdbcTemplate;
/**
* 表名
*/
private String tableName = "";
/*主鍵名稱(DB 對應的列名稱)*/
private String primaryKey = "";
/*主鍵對應的T字段名稱*/
private String idFieldName ="";
/*T的字段的List*/
private List<Field> filedList =null;
protected String getTableName ()
{
if(StringUtils.isEmpty(tableName)) {
TableEntity tableEntity = entityClass.getAnnotation(TableEntity.class);
if(tableEntity!=null )
{
tableName= tableEntity.tableName();
}
}
return tableName;
}
/**
* 主健字段名
*/
protected String getPrimaryKey()
{
if(StringUtils.isEmpty(primaryKey)) {
primaryKey=getColumnName(getIdFieldName());
}
return primaryKey;
}
private String getIdFieldName()
{
if(StringUtils.isEmpty(idFieldName)) {
Field[] fields= entityClass.getDeclaredFields();
for(Field field :fields)
{
TablePrimaryKey key= field.getAnnotation(TablePrimaryKey.class);
if(key !=null)
{
idFieldName=field.getName();
break;
}
}
}
return idFieldName;
}
protected List<Field> getFieldList() {
if(filedList==null) {
filedList =new ArrayList<Field>();
Field[] fields= entityClass.getDeclaredFields();
for(Field field :fields)
{
filedList.add(field);
}
}
return filedList;
}
/**
* 通過屬性獲取表字段
*
* @param field
* @return
*/
protected static String getColumnName(String field) {
if (StringUtils.isEmpty(field))
return "";
else {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < field.length(); i++) {
char temp = field.charAt(i);
if ((temp >= 'A') && (temp <= 'Z')) {
sb.append("_").append((char) (temp + 32));
} else {
sb.append(temp);
}
}
return sb.toString();
}
}
protected String getIdsCondition(String pids)
{
String[] idArray = pids.split(",");
String idsN = null;
for (String id : idArray) {
if (idsN == null) {
idsN = "'" + id + "'";
} else {
idsN = idsN + "," + "'" + id + "'";
}
}
return idsN;
}
@SuppressWarnings("unchecked") // 作用:用於抑制編譯器產生警告信息
public BaseDAO() {
Type superclass = getClass().getGenericSuperclass();
ParameterizedType type = (ParameterizedType) superclass;
entityClass = (Class<T>) type.getActualTypeArguments()[0];
}
private String getInsertSql(Map<String, Object> paramMap) {
StringBuffer sql = new StringBuffer();
sql.append(" INSERT INTO " + getTableName());
sql.append("(");
for (int i = 0; this.getFieldList() != null && i < getFieldList().size(); i++) {
getFieldList().get(i).setAccessible(true); // 暴力反射
String column = getColumnName(this.getFieldList().get(i).getName());
Object object = paramMap.get((Object) this.getFieldList().get(i).getName());
if (object != null && !object.equals(""))
sql.append(column).append(",");
}
sql = sql.deleteCharAt(sql.length() - 1);
sql.append(") VALUES (");
for (int i = 0; getFieldList() != null && i < getFieldList().size(); i++) {
Object object = paramMap.get((Object) getFieldList().get(i).getName());
if (object != null && !object.equals(""))
sql.append(":" + getFieldList().get(i).getName() + ",");
//sql.append("?,");
}
sql = sql.deleteCharAt(sql.length() - 1);
sql.append(")");
return sql.toString();
}
private String getUpdateSql(Map<String, Object> paramMap) {
StringBuffer sql = new StringBuffer();
sql.append(" update " + getTableName() + " set ");
for (int i = 0; getFieldList() != null && i < getFieldList().size(); i++) {
getFieldList().get(i).setAccessible(true); // 暴力反射
String field = getFieldList().get(i).getName();
String column = getColumnName(field);
Object object = paramMap.get((Object) field);
if (object != null && !field.equals(getPrimaryKey())) {
sql.append(column).append("=:").append(field).append(",");
}
}
sql = sql.deleteCharAt(sql.length() - 1);
sql.append(" where 1=1 and ").append(getPrimaryKey()).append("=:").append(getIdFieldName());
return sql.toString();
}
private String getSelectSql(Map<String,Object> paramMap) {
StringBuilder sql =new StringBuilder("");
sql.append("select * from ").append(getTableName());
sql.append(" where 1=1 ");
for (int i=0;i<getFieldList().size();i++)
{
getFieldList().get(i).setAccessible(true);
String field = getFieldList().get(i).getName();
String column = getColumnName(field);
Object object = paramMap.get((Object) field);
if (object != null) {
sql.append(" and ").append(column).append("=:").append(field);
}
}
return sql.toString();
}
public T find(String id) {
StringBuffer sql = new StringBuffer("select * from ");
sql.append(getTableName()).append(" where ").append(this.getPrimaryKey()).append(" =:").append(getIdFieldName());
Map<String,Object> map =new HashMap<String,Object>();
map.put(getIdFieldName(),id);
List<T> list = jdbcTemplate.query(sql.toString(), map,
new BeanPropertyRowMapper<T>(entityClass));
if (list!=null && list.size()>0) {
return list.get(0);
}
return null;
}
public List<T> getList(T entity) throws IllegalAccessException {
Map<String,Object> paras= MapUtils.objectToMap(entity);
String strSql= getSelectSql(paras);
List<T> list = jdbcTemplate.query(strSql,paras, new BeanPropertyRowMapper<T>(entityClass));
return list;
}
public int insert(T entity) throws IllegalArgumentException, IllegalAccessException {
Map<String, Object> paramMap = MapUtils.objectToMap(entity);
String sql = getInsertSql(paramMap);
//log.debug(sql);
return jdbcTemplate.update(sql, paramMap);
}
private String getBathInsertSql(Map<String, Object> paramMap) {
StringBuffer sql = new StringBuffer();
sql.append(" INSERT INTO " + tableName);
sql.append("(");
for (int i = 0; filedList != null && i < filedList.size(); i++) {
filedList.get(i).setAccessible(true); // 暴力反射
String column = getColumnName(filedList.get(i).getName());
Object object = paramMap.get((Object) filedList.get(i).getName());
if (object != null)
sql.append(column).append(",");
}
sql = sql.deleteCharAt(sql.length() - 1);
sql.append(") VALUES (");
for (int i = 0; filedList != null && i < filedList.size(); i++) {
Object object = paramMap.get((Object) filedList.get(i).getName());
if (object != null)
sql.append(":" + filedList.get(i).getName() + ",");
}
sql = sql.deleteCharAt(sql.length() - 1);
sql.append(")");
return sql.toString();
}
public int update(T entity) throws IllegalArgumentException, IllegalAccessException {
Map<String, Object> paramMap = MapUtils.objectToMap(entity);
String sql = getUpdateSql(paramMap);
return jdbcTemplate.update(sql, paramMap);
}
public int[] batchUpdate(List<T> entityList) {
Map<String, Object>[] batchValues = MapUtils.objListToMapArray(entityList);
String sql = getUpdateSql(batchValues[0]);
return jdbcTemplate.batchUpdate(sql, batchValues);
}
public int delete(String pids) {
if (StringUtils.isEmpty(pids)) {
return 0;
}
String[] idArray = pids.split(",");
String idsN = null;
for (String id : idArray) {
if (idsN == null) {
idsN = "'" + id + "'";
} else {
idsN = idsN + "," + "'" + id + "'";
}
}
StringBuffer sql = new StringBuffer("delete from " + getTableName() + " where "+getPrimaryKey()+" in (");
sql.append(idsN).append(")");
Map<String, Object> paramMap = new HashMap<String, Object>();
//log.debug(sql.toString());
return jdbcTemplate.update(sql.toString(), paramMap);
}
public int delete(String keyName, String pids) {
if (StringUtils.isEmpty(pids)) {
return 0;
}
String[] idArray = pids.split(",");
String idsN = null;
for (String id : idArray) {
if (idsN == null) {
idsN = "'" + id + "'";
} else {
idsN = idsN + "," + "'" + id + "'";
}
}
StringBuffer sql = new StringBuffer("delete from " + getTableName() + " where "+keyName+" in (");
sql.append(idsN).append(")");
Map<String, Object> paramMap = new HashMap<String, Object>();
//log.debug(sql.toString());
return jdbcTemplate.update(sql.toString(), paramMap);
}
public Page<T> getPage(T entity,int pageIndex, int pageSize) throws IllegalAccessException {
Map<String,Object> paras= MapUtils.objectToMap(entity);
String strSql= getSelectSql(paras);
return getPage(strSql,paras,pageIndex,pageSize);
}
public Page<T> getPage(String strSql,Map<String,Object> pars,int pageIndex, int pageSize) throws IllegalAccessException
{
if(pageIndex<=0)
throw new IllegalAccessException("pageIndex必須大於0");
if(pageSize<=0)
throw new IllegalAccessException("pageSize必須大於0");
Page<T> page =new Page<T>();
String strSql1="select * from (" +strSql +" ) as t limit " + (pageIndex-1)*pageSize + "," +pageSize *pageIndex ;
page.setLst(jdbcTemplate.query(strSql1,pars, new BeanPropertyRowMapper<T>(entityClass)));
String strSql2= "select count(1) as ac from (" +strSql +" ) as t " ;
Integer recordCount = jdbcTemplate.queryForObject(strSql2,pars, Integer.class );
page.setPageCount( (int)recordCount/pageSize +1);
page.setPageIndex(pageIndex);
page.setPageSize(pageSize);
return page;
}
}
分頁實體層
package jum.model;
import java.util.List;
public class Page<T> {
private List<T> lst;
private Integer pageIndex;
private Integer pageSize;
private Integer pageCount;
public List<T> getLst() {
return lst;
}
public void setLst(List<T> lst) {
this.lst = lst;
}
public Integer getPageIndex() {
return pageIndex;
}
public void setPageIndex(Integer pageIndex) {
this.pageIndex = pageIndex;
}
public Integer getPageSize() {
return pageSize;
}
public void setPageSize(Integer pageSize) {
this.pageSize = pageSize;
}
public Integer getPageCount() {
return pageCount;
}
public void setPageCount(Integer pageCount) {
this.pageCount = pageCount;
}
}
應用
只要自己寫個實體層和一個DAO 繼承 BaseDAO,就可以實現增刪查改等功能,還有分頁
下面是實例。
Entity
package jum.model;
import jum.utility.Comments.TableEntity;
import jum.utility.Comments.TablePrimaryKey;
import org.springframework.stereotype.Component;
@Component
@TableEntity( tableName = "um_user")
public class User {
@TablePrimaryKey(keyName = "USER_ID")
private String userId;
private String loginId;
private String pwd;
private String userName;
private String email;
private String mobile;
private Integer isSupperAdmin;
private Integer status;
private String telephone;
private String loginError;
public String getUserId() {
return userId;
}
public void setUserId(String useId) {
this.userId = useId;
}
public String getLoginId() {
return loginId;
}
public void setLoginId(String loginId) {
this.loginId = loginId;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}
public Integer getIsSupperAdmin() {
return isSupperAdmin;
}
public void setIsSupperAdmin(Integer supperAdmin) {
isSupperAdmin = supperAdmin;
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
public String getTelephone() {
return telephone;
}
public void setTelephone(String telephone) {
this.telephone = telephone;
}
public String getLoginError() {
return loginError;
}
public void setLoginError(String loginError) {
this.loginError = loginError;
}
}
DAO
package jum.dao;
import jum.model.Page;
import jum.model.User;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;
import org.springframework.util.StringUtils;
@Component
public class UserDAO extends BaseDAO<User> {
public Page<User> getUsers(String userName, String loginId, Integer pageIndex, Integer pageSize) throws IllegalAccessException {
String strsql ="select * from um_user where 1=1 ";
Map<String,Object> map =new HashMap<String,Object>();
if(!StringUtils.isEmpty(userName))
{
strsql +=" and user_name like '%' :user_name '%' ";
map.put("user_name",userName);
}
if(!StringUtils.isEmpty(loginId))
{
strsql +=" and login_id like '%' :login_id '%'";
map.put("login_id",loginId);
}
return this.getPage(strsql,map,pageIndex,pageSize);
}
}