封装spring jdbc

import java.lang.reflect.InvocationTargetException;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Map;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.PropertyUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.simple.SimpleJdbcTemplate;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;

@Repository("Dao")
public class Dao {

	@Autowired
	private SimpleJdbcTemplate jdbc;

	// 查询
	public <T> T query(Object findBy, final Class<T> clazz, String ColumnName) {
		// -----拼接sql---------
		StringBuffer sb = new StringBuffer("select * from ");
		sb.append(clazz.getSimpleName());
		sb.append(" where ");
		sb.append(ColumnName);
		sb.append("=");
		if (findBy instanceof String || findBy instanceof Character)
			findBy = "'" + findBy + "'";
		sb.append(findBy);
		// --------------

		return jdbc.queryForObject(sb.toString(), getRowMapper(clazz));
	}

	// 添加
	public <T> void add(T obj) {
		// 维护一个值队列,用来和列名对应
		LinkedList<Object> queue = new LinkedList<Object>();

		Map<?, ?> properties = getPropertyMap(obj);

		// ------拼接sql---------
		StringBuffer sb = new StringBuffer("insert into ");
		sb.append(obj.getClass().getSimpleName());
		sb.append(" (");
		for (Object fieldName : properties.keySet()) {
			sb.append(fieldName);
			sb.append(",");
			queue.addLast(properties.get(fieldName));
		}

		// 删除最后一个逗号
		int charAt = sb.lastIndexOf(",");
		sb.replace(charAt, charAt + 1, ") values (");

		for (Object value : queue) {
			sb.append(value);
			sb.append(",");
		}
		
		// 删除最后一个逗号
		charAt = sb.lastIndexOf(",");
		sb.replace(charAt, charAt + 1, ")");
		// ------------------

		// 执行sql
		jdbc.update(sb.toString());
	}

	// 获取映射对象
	private <T> RowMapper<T> getRowMapper(final Class<T> clazz) {
		return new RowMapper<T>() {
			@Override
			public T mapRow(ResultSet rs, int arg1) throws SQLException {

				// 获取ResultSet头信息
				ResultSetMetaData rmd = rs.getMetaData();

				// 获取列总数
				int colCount = rmd.getColumnCount();
				T obj = null;
				try {
					obj = clazz.newInstance();
					String colName;
					
					// 获取并封装数据
					for (int i = 0; i < colCount; i++) {
						colName = rmd.getColumnName(i + 1);
						BeanUtils.setProperty(obj, colName,
								rs.getObject(colName));
					}
				} catch (InstantiationException e) {
					e.printStackTrace();
				} catch (IllegalAccessException e) {
					e.printStackTrace();
				} catch (InvocationTargetException e) {
					e.printStackTrace();
				}
				return obj;
			}
		};
	}

	// 获取属性Map(bug:当字段为9种类型之一,但是表中又没有该字段,无法剔除(除非先查一次数据库))
	@SuppressWarnings("unchecked")
	private Map<?, ?> getPropertyMap(Object obj) {
		Map<String, Object> properties = null;
		
		//筛选出的类型
		final ArrayList<String> fieldType = new ArrayList<String>(
				Arrays.asList("String", "Character", "Integer", "Byte",
						"Double", "Long", "Float", "Short", "Boolean"));
		try {
			properties = PropertyUtils.describe(obj);
			String fieldTypeName = null;
			ArrayList<String> removeKeys = new ArrayList<String>();

			// 选择字段(剔除除基本数据类型和String外的其他字段)
			for (String key : properties.keySet()) {
				fieldTypeName = properties.get(key).getClass().getSimpleName();

				// 如果不是基本数据类型和String就标记该字段
				if (!fieldType.contains(fieldTypeName)) {
					removeKeys.add(key);
				}

				// 在String或char的前后加 "'"
				if ("String".equals(fieldTypeName)
						|| "Character".equals(fieldTypeName)) {
					properties.put(key,
							("'" + properties.get(key).toString() + "'"));
				}
			}
			
			//移除标记的字段(之所以标记是因为不能在迭代时移除元素)
			for (String rkey : removeKeys) {
				properties.remove(rkey);
			}
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		}
		return properties;
	}
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值