在我16年的博客中,写过"JavaEE中的MVC"系列的文章,解析了系统各个部分的基本设计,属于大学时期的作品了,原本想写在毕业设计上,不过老师们看不懂,算是大学的遗憾吧。
在不断地设计就发现,DAO的封装,几乎只会朝着这3个方向发展,一种是MyBatis这样,基于模版引擎,或者类似模版引擎的;另一种就是像Hibernate,把数据映射发挥到极致;或者像Beetl,二者兼有。
自己设计的价值基本没有,但是,这个过程,有利于加深对框架的理解。
这是最基本的封装,简单、有效,如果使用Sqlite数据库的话,会非常有用,SessionFactory可以按需求加入连接池的使用。
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; /** * "org.sqlite.JDBC" * "com.mysql.jdbc.driver" * * @author 41320 * @date 2017年4月7日,21:28:33 */ public class SessionFactory { final static Logger log = LoggerFactory.getLogger(SessionFactory.class); private static String sUrl = null; public void build(String driver, String url) throws IOException { try{ Class.forName(driver); SessionFactory.sUrl = url; } catch(Exception e){ throw new IOException("无法建立数据库连接:" + url, e); } } public static Connection getConnection(){ try { return DriverManager.getConnection(sUrl); } catch (SQLException e) { e.printStackTrace(); throw new RuntimeException(e); } } }
import java.sql.*; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * 作为Connection的一个包装类,提取了JDBC中常用的方法,简化数据库的操作难度, * 依托于SessionFactory,可以单独作为工具类使用,或者作为EasyDao的基类使用 * * @author 41320 * @date 2017年4月7日,21:28:33 */ public class Session implements AutoCloseable { private Connection conn; /** * 执行一条Sql语句,包括Insert、Delete、Update * @param sql * @param params * @return */ public int executeUpdate(String sql, Object... params) { try (PreparedStatement preparedStatement = conn.prepareStatement(sql)) { setParams(preparedStatement, params); return preparedStatement.executeUpdate(sql); } catch (SQLException e) { e.printStackTrace(); return 0; } } /** * 执行一条带参数查询语句,通过回调函数处理结果 * @param parser * @param sql * @param params * @param* @return */ publicT queryOne(ResultSetParser parser, String sql, Object... params) { try (PreparedStatement preparedStatement = conn.prepareStatement(sql)) { setParams(preparedStatement, params); try (ResultSet resultSet = preparedStatement.executeQuery()) { resultSet.next(); return parser.parse(resultSet); } } catch (SQLException e) { e.printStackTrace(); return null; } } /** * 执行一条带参数查询语句,通过回调函数处理结果 * * @param sql * @param params * @return Object * @throws SQLException */ public Map queryAsMap(String sql, Object... params) { try (PreparedStatement preparedStatement = conn.prepareStatement(sql)) { setParams(preparedStatement, params); try (ResultSet resultSet = preparedStatement.executeQuery()) { ResultSetMetaData metaData = resultSet.getMetaData(); int cols = metaData.getColumnCount(); resultSet.next(); Map map = new HashMap<>(cols); for (int i = 0; i < cols; i++) { String key = metaData.getColumnName(i + 1); Object value = resultSet.getObject(i + 1); map.put(key.toUpperCase(), value); } return map; } } catch (SQLException e) { e.printStackTrace(); return null; } } /** * 执行一条带参数查询语句,通过回调函数处理结果 * * @param parser * @param sql * @param params * @return Object */ public List queryList(ResultSetParser parser, String sql, Object... params) { try (PreparedStatement preparedStatement = conn.prepareStatement(sql)) { setParams(preparedStatement, params); try (ResultSet resultSet = preparedStatement.executeQuery()) { List retList = new ArrayList (); while (resultSet.next()) { retList.add(parser.parse(resultSet)); } return retList; } } catch (SQLException e) { e.printStackTrace(); return null; } } /** * 执行一条带参数查询语句,通过回调函数处理结果 * * @param sql * @param params * @return Object */ public List
2016