JDBC高级部分

JDBC高级部分

Mysql JDBC驱动的jar包和源代码包下载:http://www.mysql.com/downloads/connector/j/

1、    数据源和连接池

lDataSource用来取代DriverManager来获取Connection

l通过DataSource获得Connection速度很快;

l通过DataSource获得的Connection都是已经被包裹过的(不是驱动原来的连接),他的close方法已经被修改。

l一般DataSource内部会用一个连接池来缓存Connection,这样可以大幅度提高数据库的访问速度;

l连接池可以理解成一个能够存放ConnectionCollection

l我们的程序只和DataSource打交道,不会直接访问连接池;

 

2、   一个简单的数据源实现

l  使用代理模式的Connection(核心代码)

        class MyConnection implements Connection{
                 private Connection realConn;
                 private LinkedList connPool;
                 MyConnection(Connection rConn, LinkedList cPool){
                           this.realConn=rConn;
                           this.connPool=cPool;
                 }
                 public void close(){
                           this.connPool.addLast(this);
                 }
                 //….
        }

l  DataSource(核心代码)

         class MyDataSource implements DataSource{
                   private LinkedList connPool = new Vector();
                   public Connection getConneciton (){
                            if(this.connPool.size()>0)
                                      return this.connPool.removeFirst(0);
                            return createConnection();
                   }
                   private Connection createConnection(){
                     Connection realConn = DriverManager.getConnection();
                     Connection myConn =
                            new MyConnection(realConn,this.connPool);
                     return myConn;
                   }
                   //….
         }

3、   常用的开源实现DBCP

l  使用DBCP必须用的三个包:

         commons-dbcp-1.2.1.jar, commons-pool-1.2.jar, commons-collections-3.1.jar

l  配置参数。

l  Java API: BasicDataSourceFactory.createDataSource(

properties);
 

4、   使用继承优化JDBC代码(模板模式)

l  优化查询操作,区分开变化和不变的部分:

         sql ResultSet 的处理是变化部分,创建和释放资源部分是不变部分。

l  提取超类,将不变部分放入超类,变化部分留给子类实现。

l  超类的主要代码:

         public Object find(String sql, Object[] args) {
           …
           rs = ps.executeQuery();
           if (rs.next()) return rowMapper(rs);
           …
         }
         protected abstract Object rowMapper(ResultSet rs);

5、   使用组合优化JDBC代码(策略模式)

l  优化查询操作,区分开变化和不变的部分:

         sql ResultSet 的处理是变化部分,创建和释放资源部分是不变部分。

l  提取接口封装变化部分。

l  JDBC操作主要代码:

         public Object find(String sql, Object[] args, RowMapper rowMapper) {
                   …
                   rs = ps.executeQuery();
                   if (rs.next())return rowMapper.mapRow(rs);
                   …
         }

l  回调接口:

         public interface RowMapper {
                   public Object mapRow(ResultSet rs) throws SQLException;
         }
 

6、   SpringJdbcTemplate

l  查询带有参数,和行映射方法:

         public Object queryForObject(String sql, Object[] args, RowMapper rowMapper), 使用自定义的 UserRowMapper 完成映射。

l  一个RowMapper的常用实现BeanPropertyRowMapper,该实现可将结果集转换成一个Java Bean(字段名与Java Bean属性名不符合规范,可用别名处理)

l  public List query(String sql, Object[] args, RowMapper rowMapper)返回多个结果。

l  public int queryForInt(String sql)(:select count(*) from user),其他结果比如String可用queryForObject方法向下转型。

l  public Map queryForMap(String sql, Object[] args)返回若类型的Mapkey:字段名或别名,value:列值)。

l  public List queryForList(String sql, Object[] args)返回多Map

l  更新public int update(String sql, Object[] args)

l  插入数据并获得结果:

         public Object execute(ConnectionCallback action)

l  其他方法简介

 

7、   SpringNamedParameterJdbcTemplate

l  NamedParameterJdbcTemplate内部包含了一个JdbcTemplate,所以JdbcTemplate能做的事情NamedParameterJdbcTemplate都能干; NamedParameterJdbcTemplate相对于JdbcTemplate主要增加了参数可以命名的功能。

l  public Object queryForObject(String sql, Map paramMap, RowMapper rowMapper)

l  public Object queryForObject(String sql, SqlParameterSource paramSource, RowMapper rowMapper)

         SqlParameterSource 的两个主要实现 MapSqlParameterSource
         BeanPropertySqlParameterSource

l  public int update(String sql, SqlParameterSource paramSource, KeyHolder generatedKeyHolder)保存数据获得主键。

 

8、   SpringSimpleJdbcTemplate

l  SimpleJdbcTemplate内部包含了一个NamedParameterJdbcTemplate;所以NamedParameterJdbcTemplate能做的事情SimpleJdbcTemplate都能干,SimpleJdbcTemplate相对于NamedParameterJdbcTemplate主要增加了JDK5.0的泛型和可变长度参数支持。

l  public <T> List<T> query(String sql, ParameterizedRowMapper<T> rm, Object... args)

l  public <T> T queryForObject(String sql, ParameterizedRowMapper<T> rm, SqlParameterSource args)

l  public <T> List<T> query(String sql, ParameterizedRowMapper<T> rm, SqlParameterSource args)

l  getJdbcOperations返回的是JdbcOperations(实现JdbcTemplate)

l  getNamedParameterJdbcOperations返回的是NamedParameterJdbcOperations(实现是NamedParameterJdbcTemplate)

 

9、   实现UserDao接口

l  实现UserDao接口

l  修改daoconfig.properties文件,切换UserDao的实现。

l  测试UserDao的新的实现类。

 

你可能感兴趣的:(jdbc,职场,高级,休闲)