Alters

La pseudo-capa: generalizando


Hola de nuevo,

Vamos a empezar una nueva entrega de cómo crear esta pseudo-capa con la que llevo dando la brasa desde el primer día.

En la entrada anterior vimos cómo se conecta, pide y recogen datos tanto desde java como desde php a una base de datos mysql.

En esta entrada, os voy a comentar un poco en detalle la generalización de los coneceptos vistos anteriormente. Esto es para poder desarrollar con más rapidez, ya que tener que ir poniendo todo el código cada vez resultaría engorroso.

Parto de la base de que todo aquel que lee esto sabe lo que es una función y cómo funcionan.

Sin más, empecemos el siguiente punto!


- Generalizar: funciones y objetos
   · Crear las funciones
   · Crear los objetos


Crear las funciones

Con php

$con = null;
$connection = null;
$H = "localhost";
$U = "user"; //el que tengáis vosotros
$P = "pass"; //el password
$D = "database"; //la base de datos
$started = false;

function execute($sql){
 if(!$started){
  return null;
 }

 return mysql_query($sql) or die($sql."<br />
".mysql_error());
}

function getId(){
 if(!$started){
  return null;
 }

 return mysql_insert_id($con);
}

function getRowNum(){
 if(!$started){
  return null;
 }

 return mysql_affected_rows($this-&gt;con);
}

function connect($host, $usr, $pass){
 if(!$started){
  return $conection = mysql_connect($host, $usr, $pass);
 }else{
    return $con;
 }
}

function setdb($name, $database){
 return mysql_select_db($name, $database);
}

function free($launched){
 if($started){
  mysql_free_result($launched);
 }
}

function disconnect(){
 if($started){
  mysql_close($con);
   $started = false;
 }
}

function start(){
 if(!$started){
  $con = $connect($H, $U, $P);
  $connection = $setdb($D, $con);
  $started = true;
 }
}

Como veis, he declarado varias variables, que uso en las funciones. Además he añadido algunas funcinoes que pueden ser útiles. A continuación explico todas:

 - execute: ejecuta una sentencia sql (de cualquier tipo)
 - getId: retorna el último id insertado
 - getRowNum: retorna el número de filas afectadas por la última sentencia
 - connect: conecta a la base de datos
 - setdb: establece una base de datos. Es llamada desde connect
 - free: libera los recursos usados por la última sentencia
 - disconnect: desconecta de la base de datos
 - start: conecta a una base de datos dada.

Seguramente hayáis visto que no tienen mucha conexión entre sí. Esto es porque estas funciones están diseñadas para estar dentro de un mismo objeto.

Yo he quitado el tema de encapsulamiento (private, public...) así como constructores y demás. En la siguiente sección (objetos) veremos qué hacemos con esto.

Como último apunte, fijaros que he añadido algo de control con la variable "started", para evitar que se haga una conexión dos veces.

Con java


Connection connect(){
 Connection con = null;

 try{
         Class.forName("com.mysql.jdbc.Driver");

  con = DriverManager.getConnection("jdbc:mysql://localhost/db", "user", "pass");
 }catch (ClassNotFoundException e){
  //ToDo
 }catch (SQLException e){
  //ToDo
 }

 return con;
}

ResultSet ask(String     sql,
           Connection con){
 ResultSet rs = null;

 try{
  rs = con.createStatement().executeQuery(sql);
 }catch (SQLException e){
  //ToDo
 }

 return rs;
}


void execute (String     sql,
            Connection con){
 try{
  con.createStatement().executeUpdate(sql);
 }catch (SQLException e){
  //ToDo
 }
}



Crear los objetos

Como había escrito antes, las funciones precedentes iban a ser parte de un objeto. Para aquellos que no estén familiarizados con las clases, decir que se tienen que crear en un fichero aparte.

La estructura básica es:

Class clase{
  atributo1;
  atributo2:

  funcion1(){}
  funcion2(){}
}

Con php

Solo tenemos que crear la clase, un constructor que llame a start, y encapsular las funciones y atributos. Mis recomendaciones son:

 - Declarar $con como public, y el resto de atributos como private
 - Declarar connect y setdb como private, el resto public

¿Y cómo usaríamos la clase? Así:

$bridge = new MyBridge(); //suponiendo que la clase la llaméis así
$array = $bridge-&gt;execute("select curdate() from dual");
$bridge-&gt;disconnect();

Como se ve, se elimina bastante código, ya que en 3 líneas se hace prácticamente todo.

Con java

Connection con = null;
ResultSet  rs  = null;
String     sql = "select curdate() from dual";

try{
 con = this.connect();
 rs  = this.ask(sql, con);
 
 try{
  while(rs.next())
   //ToDo
         }catch (SQLException e){
              //ToDo
         }
}catch (ParseErrorException e){
     //ToDo
}


Aquí el código también se ve más limpio y el desarrollo se puede hacer más rápido.

En la siguiente entrada entraré más en detalle en la creación de clases y tablas auxiliares para generalizar todo el código y hacer que la programación sea más fácil.

Hasta la próxima!