Skip to content

Latest commit

 

History

History
190 lines (161 loc) · 4.23 KB

6.dbutil.md

File metadata and controls

190 lines (161 loc) · 4.23 KB

数据库操作

这一小节是对数据库操作做一个简单的封装,不涉及复杂的事务操作等。

我选用了Sql2o作为底层数据库框架作为支持,它的简洁易用性让我刮目相看,后面我们也会写如何实现一个ORM框架。

/**
 * 数据库支持
 * @author biezhi
 *
 */
public final class MarioDb {
	
	private static Sql2o sql2o = null;
	
	private MarioDb() {
	}
	
	/**
	 * 初始化数据库配置
	 * @param url
	 * @param user
	 * @param pass
	 */
	public static void init(String url, String user, String pass){
		sql2o = new Sql2o(url, user, pass);
	}
	
	/**
	 * 初始化数据库配置
	 * @param dataSource
	 */
	public static void init(DataSource dataSource){
		sql2o = new Sql2o(dataSource);
	}
	
	/**
	 * 查询一个对象
	 * @param sql
	 * @param clazz
	 * @return
	 */
	public static <T> T get(String sql, Class<T> clazz){
		return get(sql, clazz, null);
	}
	
	/**
	 * 查询一个列表
	 * @param sql
	 * @param clazz
	 * @return
	 */
	public static <T> List<T> getList(String sql, Class<T> clazz){
		return getList(sql, clazz, null);
	}
	
	/**
	 * 查询一个对象返回为map类型
	 * @param sql
	 * @return
	 */
	public static Map<String, Object> getMap(String sql){
		return getMap(sql, null);
	}
	
	/**
	 * 查询一个列表并返回为list<map>类型
	 * @param sql
	 * @return
	 */
	public static List<Map<String, Object>> getMapList(String sql){
		return getMapList(sql, null);
	}
	
	/**
	 * 插入一条记录
	 * @param sql
	 * @param params
	 * @return
	 */
	public static int insert(String sql, Object ... params){
		StringBuffer sqlBuf = new StringBuffer(sql);
		sqlBuf.append(" values (");
		
		int start = sql.indexOf("(") + 1;
		int end = sql.indexOf(")");
		String a = sql.substring(start, end);
		String[] fields = a.split(",");
		
		Map<String, Object> map = new HashMap<String, Object>();
		
		int i=0;
		for(String name : fields){
			sqlBuf.append(":" + name.trim() + " ,");
			map.put(name.trim(), params[i]);
			i++;
		}
		
		String newSql = sqlBuf.substring(0, sqlBuf.length() - 1) + ")";
		
		Connection con = sql2o.open();
		Query query = con.createQuery(newSql);
		
		executeQuery(query, map);
		
		int res = query.executeUpdate().getResult();
		
		con.close();
		
		return res;
	}
	/**
	 * 更新
	 * @param sql
	 * @return
	 */
	public static int update(String sql){
		return update(sql, null);
	}
	
	/**
	 * 带参数更新
	 * @param sql
	 * @param params
	 * @return
	 */
	public static int update(String sql, Map<String, Object> params){
		Connection con = sql2o.open();
		Query query = con.createQuery(sql);
		executeQuery(query, params);
		int res = query.executeUpdate().getResult();
		con.close();
		return res;
	}
	
	public static <T> T get(String sql, Class<T> clazz, Map<String, Object> params){
		Connection con = sql2o.open();
		Query query = con.createQuery(sql);
		executeQuery(query, params);
		T t = query.executeAndFetchFirst(clazz);
		con.close();
		return t;
	}
	
	@SuppressWarnings("unchecked")
	public static Map<String, Object> getMap(String sql, Map<String, Object> params){
		Connection con = sql2o.open();
		Query query = con.createQuery(sql);
		executeQuery(query, params);
		Map<String, Object> t = (Map<String, Object>) query.executeScalar();
		con.close();
		return t;
	}
	
	public static List<Map<String, Object>> getMapList(String sql, Map<String, Object> params){
		Connection con = sql2o.open();
		Query query = con.createQuery(sql);
		executeQuery(query, params);
		List<Map<String, Object>> t = query.executeAndFetchTable().asList();
		con.close();
		return t;
	}
	
	public static <T> List<T> getList(String sql, Class<T> clazz, Map<String, Object> params){
		Connection con = sql2o.open();
		Query query = con.createQuery(sql);
		executeQuery(query, params);
		List<T> list = query.executeAndFetch(clazz);
		con.close();
		return list;
	}
	
	private static void executeQuery(Query query, Map<String, Object> params){
		if (null != params && params.size() > 0) {
			Set<String> keys = params.keySet();
			for(String key : keys){
				query.addParameter(key, params.get(key));
			}
		}
	}
}

设计MVC框架部分已经完成,下一节是一个增删改查的例子

links