Exemplificando da maneira que um programador em white space faria, mas acho que será o suficiente para entender.
Consideremos a classe Pessoa, que tem getNome e setNome
BMP:
setNome( String nome )
{
String sql = "UPDATE tabelaPessoa ..."
... transação, datasource, conexão
Statement.execute( sql );
}
getNome()
{
String sql = "SELECT FROM tabelaPessoa ... WHERE ..."
ResultSet = Statement.executeQuery( sql );
... transação, datasource, conexão, manipular ResultSet
return nome;
}
É claro que não é só isso. Utilizando BMP há o controle sobre ciclos de vida de um montão de coisas bacanas e tudo mais. Porém, em suma, quem vai fazer todo o trabalho sujo (pools, transações, sql etc) é você.
CMP:
setNome( String nome )
{
this.nome = nome;
}
getNome()
{
return nome;
}
Cadê o sql??? Bem guardadinho num arquivo xml de 40 milhões de linhas. Dá trabalho para escrever, mas depois é só alegria. Ou seja, o CONTAINER vai ser responsável por todo o trabalho sujo do sql, transações, pools etc.
Maravilha então? Ah … nem tanto. Tem umas limitações beeem complicadinhas
Prefiro Hibernate 