以前用惯了Hibernate,一下不用很不习惯,因为Hibernate的确为程序员省下了很多事。很多小的项目都在用Hibernate,暂且不说有没有跨数据库的特性,也不说对象关系映射是否重要,基本的SQL 动作处理也是一件很麻烦的事。
总结一下,至少有三方面比较麻烦:
1. 异常处理。如果直接用JDBC,几乎每个操作都要抛出几个异常,因此代码看起来很不优雅。
2. 创建的对象很多。大多数操作都要显示的建立statement,ResultSet对象,致使代码看起 来很长,其实这些都可以再封装。
3. JavaBean与ResultSet对象的转化。这是一个很枯燥的工作,而且这样的工作还会重复做很多次,严重影响了开发速度。
本来自己计划在有空的时候自己来尝试封装一下的,但哪知前人早把这些事做了,的确令自己汗颜。那就是commons的DbUtils组件。这个组件很小,做的事也不多,但几乎把上面几个问题都处理好了。因此只要花许时间学习一下就可以了,自己何必再去造轮子呢?
下面简单的介绍一下其用法,用JDBC开发,最好建立一件连接池,由于以前在博客里面也介绍过C3P0组件的用法,因此现在直接拿来用就行了。
环境:
commons-dbutils-1.2
junit4.5
c3p0-0.9.1.2
mysql-connector-java-5.1.7
由于DbUtils组件中有一个DbUtils类专门用来处理数据连接的关闭问题,因此以前的那个类也可以去掉一些代码,为了方便阅读,还是把它放在这里吧!
更详细的说明可见以前的博客。
要进行基本的查询,也非常的容易,主要用到的对象是DbUtils,QueryRunner,ResultSetHandler
具体用法见如下代码:
上面的代码相对直接用JDBC操作的确简化了很多,主要作用就是查询一个User对象列表。
值得注意的是,上面查询参数加入了conn对象,如果每次查询都要conn,可能也不太好。
所以QueryRunner还一个不需要conn参数的查询,但在创建QueryRunner对象的时候必须要加上一个DataSource对象,这也很简单,因为ComboPooledDataSource 类实现了DataSource接口,所以上面有一个返回DataSource的方法,直接拿来用即可:
值得一提的是,query有几种形式:
如果需要加参数,只需要选择有参数的方法即可。当然对应的update方法与此方法完全类似,不毕多说。
1. 异常处理。如果直接用JDBC,几乎每个操作都要抛出几个异常,因此代码看起来很不优雅。
2. 创建的对象很多。大多数操作都要显示的建立statement,ResultSet对象,致使代码看起 来很长,其实这些都可以再封装。
3. JavaBean与ResultSet对象的转化。这是一个很枯燥的工作,而且这样的工作还会重复做很多次,严重影响了开发速度。
本来自己计划在有空的时候自己来尝试封装一下的,但哪知前人早把这些事做了,的确令自己汗颜。那就是commons的DbUtils组件。这个组件很小,做的事也不多,但几乎把上面几个问题都处理好了。因此只要花许时间学习一下就可以了,自己何必再去造轮子呢?
下面简单的介绍一下其用法,用JDBC开发,最好建立一件连接池,由于以前在博客里面也介绍过C3P0组件的用法,因此现在直接拿来用就行了。
环境:
commons-dbutils-1.2
junit4.5
c3p0-0.9.1.2
mysql-connector-java-5.1.7
由于DbUtils组件中有一个DbUtils类专门用来处理数据连接的关闭问题,因此以前的那个类也可以去掉一些代码,为了方便阅读,还是把它放在这里吧!
- public class ConnectionPool {
- public static void destroy() throws SQLException {
- _instance._destroy();
- }
- public static Connection getConnection() throws SQLException {
- return _instance._getConnection();
- }
- public static Properties getProperties() {
- return _instance._props;
- }
- private ConnectionPool() {
- try {
- // Properties
- ClassLoader classLoader = getClass().getClassLoader();
- _props = new Properties();
- _props.load(classLoader
- .getResourceAsStream("connection-pool.properties"));
- _props.list(System.out);
- // Pooled data source
- String driverClass = _props.getProperty("driver.class");
- String jdbcUrl = _props.getProperty("jdbc.url");
- String user = _props.getProperty("user");
- String password = _props.getProperty("password");
- int minPoolSize = 5;
- try {
- minPoolSize = Integer.parseInt(_props
- .getProperty("min.pool.size"));
- } catch (Exception e) {
- }
- int maxPoolSize = 5;
- try {
- maxPoolSize = Integer.parseInt(_props
- .getProperty("max.pool.size"));
- } catch (Exception e) {
- }
- int acquireIncrement = 5;
- try {
- acquireIncrement = Integer.parseInt(_props
- .getProperty("acquire.increment"));
- } catch (Exception e) {
- }
- _cpds = new ComboPooledDataSource();
- _cpds.setDriverClass(driverClass);
- _cpds.setJdbcUrl(jdbcUrl);
- _cpds.setUser(user);
- _cpds.setPassword(password);
- _cpds.setMinPoolSize(minPoolSize);
- _cpds.setMaxPoolSize(maxPoolSize);
- _cpds.setAcquireIncrement(acquireIncrement);
- } catch (Exception e) {
- _log.error(e);
- }
- }
- private void _destroy() throws SQLException {
- DataSources.destroy(_cpds);
- }
- private Connection _getConnection() throws SQLException {
- return _cpds.getConnection();
- }
- private DataSource _getDataSource(){
- return _cpds;
- }
- public static DataSource getDataSource(){
- return _instance._getDataSource();
- }
- private static Log _log = LogFactory.getLog(ConnectionPool.class);
- private static ConnectionPool _instance = new ConnectionPool();
- private Properties _props;
- private ComboPooledDataSource _cpds;
- }
更详细的说明可见以前的博客。
要进行基本的查询,也非常的容易,主要用到的对象是DbUtils,QueryRunner,ResultSetHandler
具体用法见如下代码:
- .......................
- Connection conn = null;
- @Before
- public void init(){
- try {
- conn = ConnectionPool.getConnection();
- } catch (SQLException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- @Test
- public void testWithConnParamQuery() throws SQLException{
- String sql = "select * from user";
- QueryRunner query = new QueryRunner();
- ResultSetHandler bean = new BeanListHandler(User.class);
- @SuppressWarnings("unchecked")
- List<User> list = (List<User>) query.query(conn, sql, bean);
- for(User user:list){
- System.out.println(user.getName());
- }
- }
- @After
- public void close(){
- DbUtils.closeQuietly(conn);
- }
- ............
上面的代码相对直接用JDBC操作的确简化了很多,主要作用就是查询一个User对象列表。
值得注意的是,上面查询参数加入了conn对象,如果每次查询都要conn,可能也不太好。
所以QueryRunner还一个不需要conn参数的查询,但在创建QueryRunner对象的时候必须要加上一个DataSource对象,这也很简单,因为ComboPooledDataSource 类实现了DataSource接口,所以上面有一个返回DataSource的方法,直接拿来用即可:
- ..........
- @Test
- public void testNoConnParamQuery() throws SQLException{
- String sql = "select * from user";
- QueryRunner query = new QueryRunner(ConnectionPool.getDataSource());
- ResultSetHandler bean = new BeanListHandler(User.class);
- @SuppressWarnings("unchecked")
- List<User> list = (List<User>) query.query(conn, sql, bean);
- for(User user:list){
- System.out.println(user.getName());
- }
- }
- ..............
值得一提的是,query有几种形式:
- query(Connection conn, String sql, ResultSetHandler rsh)
- query(Connection conn, String sql, ResultSetHandler rsh, Object[] params) query(String sql, ResultSetHandler rsh)
- query(String sql, ResultSetHandler rsh, Object[] params)
如果需要加参数,只需要选择有参数的方法即可。当然对应的update方法与此方法完全类似,不毕多说。