Archivo de la categoría: Java

Tutorial Material Design en Android #5

Crear un RecyclerView para Android

Hola lectores, ha pasado un tiempo desde que publique la última entrega del tutorial de Material Design en Android en donde aprendimos a crear un Navigation Drawer, continuamos con los tutoriales y en esta ocasión les enseñare a crear un RecyclerView.

Pero antes, ¿Que es un RecyclerView?, seguramente muchos lo abran visto ya en acción, este tipo de componente es cada vez más y más popular y ha venido remplazando a las antiguas ListViews, se trata de un componente que nos permite crear listas de contenedores que a su vez pueden tener dentro otros componentes (TextView, EditText, ImageView, etc.). El RecyclerView tiene la particularidad de haber sido diseñado con la eficiencia en mente, como su nombre lo indica los objetos que son visible en la pantalla son los que se dibujan en pantalla y una vez que desaparecen (el usuario hace scroll) estos remplazan su contenido (se reciclan) para mostrar otro tipo de información.

Imaginemos una lista de 100 contactos, en la pantalla de nuestro teléfono solo podemos renderizar 5 contactos a la vez, en lugar de renderizar los 100 desde un inicio solo vamos remplazando la información en las filas de nuestro RecyclerView conforme lo vamos necesitando, cabe decir que este es un proceso automático.

list_mail

Pero el RecyclerView es mucho más que eso, a diferencia de su predecesor con este nuevo componente podemos crear listas con diferentes tipos de layouts

20150415193645985

images

EAF-MD3

Retomamos nuestro proyecto, como les comentaba en la publicación pasada he subido el código realizado hasta el momento en el siguiente repositorio https://github.com/Alevsk/Material-design-en-Android.

Lo primero que vamos a hacer sera agregar la dependencia a nuestro proyecto en el archivo de gradle, abrimos el archivo build.gradle que se encuentra en MaterialdesignApp (proyecto)> app > build.gradle y en la parte de abajo en el apartado de dependencias agregaremos
compile ‘com.android.support:recyclerview-v7:+’ quedando de la siguiente forma

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:22.2.0'
    compile 'com.android.support:recyclerview-v7:22.2.0'
}

Sincronizamos gradle para descargar las dependencias (o también podemos dar re build al proyecto) y una vez tenemos la dependencia vamos a comenzar a utilizar el componente, vamos a nuestro archivo fragment_navigation_drawer.xml (aquí vamos a crear el menú), si no recuerdan donde está el archivo se encuentra en MaterialdesignApp > app > src > main > res > layout > fragment_navigation_drawer.xml

Por el momento tenemos esto, un simple texto ¿bastante simple cierto?

Capture

drawer_navigation

Al final de nuestro tutorial vamos aprender a crear algo como esto :), pues manos a la obra, o mejor dicho al codigo XD

16170261501_9b7ce86ca7_b

En nuestro archivo XML (fragment_navigation_drawer.xml) vamos a crear nuestro RecyclerView con el siguiente código, si se fijan elimine el TextView que teníamos porque ya no lo necesitamos.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/grayPanel"
    tools:context="com.alevsk.materialdesignapp.fragments.NavigationDrawerFragment">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/drawerList"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    </android.support.v7.widget.RecyclerView>

</RelativeLayout>

Una vez añadido el componente en nuestra vista xml vamos a nuestro controller NavigationDrawerFragment.java (MaterialdesignApp > app > src > main > java > com.alevsk.materialdesignapp > fragments > NavigationDrawerFragment.java) y definimos una nueva variable tipo RecyclerView como propiedad de la clase

public class NavigationDrawerFragment extends Fragment {

    private RecyclerView mRecyclerView;
    private ActionBarDrawerToggle mDrawerToggle;
    private DrawerLayout mDrawerLayout;
    private Toolbar mToolbar;
    ....
    ..

Una vez creado nuestro RecyclerView vamos a agregar la referencia hacia su objeto xml, para eso en el método onCreateView, vamos a modificar un poco el código, actualmente tenemos algo como esto

Capture

Lo remplazamos por esto, sencillo, a estas alturas del tutorial ya deberían saber que estamos obteniendo el elemento mediante el id (layout.findViewById(R.id.drawerList)) que definimos, estamos haciendo un cast (RecyclerView) y lo estamos asignando a la variable mRecyclerView, por ultimo retornamos el layout (View) que es con el que trabajara la aplicacion.

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View layout = inflater.inflate(R.layout.fragment_navigation_drawer, container, false);
        mRecyclerView = (RecyclerView) layout.findViewById(R.id.drawerList);
        return layout;
    }

Pero no tan rápido, antes de correr nuestra aplicación nos falta crear un par de componentes más, un Adapter (un manejador lógico para los elementos de nuestra lista), ViewHolders y un modelo (representación de un elemento en la lista)

Pero antes, para tener todo más organizado, vamos a crear dos nuevos Package en nuestro proyecto, uno llamado adapters y otro models

Capture

Vamos a comenzar a pensar en MVC (Model View Controller), si bien no existe un estándar totalmente definido para utilizar MVC en Android podemos tomar el concepto y definir lo siguiente:

  • Model: Qué vamos a renderizar en la aplicación (objetos principales utilizados en los controladores)
  • View: Como lo vamos a renderizar (xml)
  • Controller: Eventos del ciclo de vida de las pantallas, manejar las entradas de usuario, definición de componentes de Android como el RecyclerView, etc.

Creando un Modelo en Android

Teniendo lo anterior como premisa al momento de definir nuestro menú lo que necesitamos es una imagen que sirva como icono y un texto que sirva como título, procedemos a crear nuestra clase Menu.java en el Package models que definimos previamente

Quicktip: en nuestra clase primero definimos las propiedades de nuestro objeto (int icon, String title) y después para generar nuestros gets y sets usamos el shortcut “alt + insert” lo que desplegara un menú en donde elegimos getters and settters y marcamos todas las propiedades (variables) de nuestra clase.

Capture

public class Menu {
    private int icon;
    private String title;

    public int getIcon() {
        return icon;
    }

    public void setIcon(int icon) {
        this.icon = icon;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }
}

Creando un Adapter personalizado para el RecyclerView

Ahora en el Package adapters creamos una clase llamada MenuAdapter que extenderá o heredara sus metodos de RecyclerView.Adapter, el código inicialmente queda así.

package com.alevsk.materialdesignapp.adapters;

import android.support.v7.widget.RecyclerView;
import android.view.ViewGroup;

/**
 * Created by Alevskey on 23/01/2016.
 */
public class MenuAdapter extends RecyclerView.Adapter {
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        return null;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {

    }

    @Override
    public int getItemCount() {
        return 0;
    }
}

Creando un ViewHolder personalizado

Ademas de eso también vamos a crear un ViewHolder, podemos definir la clase como una subclase de nuestro MenuAdapter, como siempre aquí tienen más documentación respecto a lo que vamos a utilizar http://developer.android.com/reference/android/support/v7/widget/RecyclerView.ViewHolder.html

Quedando el codigo final de la siguiente forma

Capture

Continuamos, Si leyeron la documentación acerca del comportamiento de los Adapter sabrán que por default manejan el tipo de objeto ViewHolder, pero nosotros acabamos de definir uno llamado MenuViewHolder que será el encargado de “contener” elementos como TextView, ImageView y todo lo que necesitemos para personalizar nuestro elemento de menú, sabiendo eso necesitamos realizar algunos cambios en nuestra clase, para empezar en la definición de nuestra clase vamos a definir (valga la redundancia) explícitamente que queremos utilizar MenuViewHolder

public class MenuAdapter extends RecyclerView.Adapter<MenuAdapter.MenuViewHolder> {
...
..
.

Ahora tenemos un montón de errores en la clase y esto es porque tenemos que modificar el tipo de objeto que retorna la función onCreateViewHolder de RecyclerView.ViewHolder a MenuViewHolder, también deberemos definir otra función llamada OnBindViewHolder, una vez realizados los cambios tenemos lo siguiente.

public class MenuAdapter extends RecyclerView.Adapter<MenuAdapter.MenuViewHolder> {
    @Override
    public MenuViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        return null;
    }

    @Override
    public void onBindViewHolder(MenuViewHolder holder, int position) {

    }

    @Override
    public int getItemCount() {
        return 0;
    }

    class MenuViewHolder extends RecyclerView.ViewHolder {

        public MenuViewHolder(View itemView) {
            super(itemView);
        }
    }
}

Ahora vamos a crear la vista xml de nuestro item de Menu, en la carpeta layout creamos un archivo llamado viewholder_menu.xml que contendrá dos cosas, un ImageView y un TextView

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">

    <ImageView
        android:id="@+id/listIcon"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:padding="8dp"
        android:layout_gravity="center_vertical"
        android:src="@drawable/dummy" />

    <TextView
        android:id="@+id/listText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="8dp"
        android:layout_gravity="center_vertical"
        android:text="@string/dummy_text" />

</LinearLayout>

La imagen @drawable/dummy es una imagen de ejemplo que yo utilice, ustedes pueden usar la que más les guste.

Regresamos a nuestro MenuAdapter.java y vamos a comenzar a utilizar los métodos que creamos anteriormente, primero vamos a crear un constructor para nuestro adapter, el cual recibirá un Context que nos servirá para hacer el binding de los elementos xml en nuestro ViewHolder, y una lista (de objetos Menu) que será la información con la cual llenaremos el RecyclerView después de eso vamos a realizar ese binding en el método onCreateView, tambien modificamos la función getItemCount para retornar el tamaño actual de la lista.

    private LayoutInflater mInflater;
    private List<Menu> data = Collections.emptyList();

    public MenuAdapter(Context context, List<Menu> data) {
        mInflater = LayoutInflater.from(context);
        this.data = data;
    }

    @Override
    public MenuViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = mInflater.inflate(R.layout.viewholder_menu, parent, false);
        MenuViewHolder holder = new MenuViewHolder(view);
        return holder;
    }

    @Override
    public int getItemCount() {
        return data.size();
    }

Ahora en la subclase MenuViewHolder vamos a definir el ImageView y TextView

    class MenuViewHolder extends RecyclerView.ViewHolder {
        ImageView icon;
        TextView title;
        public MenuViewHolder(View itemView) {
            super(itemView);
            title = (TextView) itemView.findViewById(R.id.listText);
            icon = (ImageView) itemView.findViewById(R.id.listIcon);
        }
    }

Ahora en el método onBindViewHolder es donde se realiza la acción de asignar los valores a las variables del MenuHolder (imágenes, textos, etc).

    public void onBindViewHolder(MenuViewHolder holder, int position) {
        holder.title.setText(data.get(position).getTitle());
        holder.icon.setImageResource(data.get(position).getIcon());
    }

Lo que hace nuestro método es recibir un holder, y una posición int, entonces con esa información de nuestra Lista de objetos Menu extraemos el titulo y el id de recurso de imagen que contiene el objeto Menu en la posición indicada de la lista, por ultimo hacemos set de esa información al TextView e ImageView del holder.

Venga ya falta poco, casi terminamos!!!

Me di cuenta que aún no hemos definido el tema de la app, lo he estado pensando y me gustaría enfocarla a un pequeño catálogo de anime que consuma la api opensource de hummingbird, desarrollando un catálogo les poder enseñar a utilizar muchos más componentes que el ecosistema de Android nos ofrece, así como a consumir Apis e interactuar con las mismas, algo muy común en la industria de desarrollo de aplicaciones hoy en día.

Teniendo claro lo anterior las opciones de nuestro menú serán:

  • Buscar (buscador de anime)
  • Lo que estoy viendo (anime que el usuario ve actualmente)
  • Para más tarde (anime que el usuario tiene en la categoría de plan-to-watch)
  • Completado (series que el usuario ha terminado de ver)
  • Mi cuenta (información del usuario y anime favorito)

De ahí hay 3 opciones que solo pueden ser utilizados una vez el usuario haya sido autenticado en nuestra aplicación, pero eso lo dejaremos para más tarde, por ahora nos centraremos en desarrollar el menú.

Primero vamos a nuestro archivo strings.xml que se encuentra en MaterialdesignApp > app > src > main > res > values > strings.xml y ahi vamos a crear una lista de items que contendrá los elementos del menú

    <string-array name="menu_list">
        <item>Buscar</item>
        <item>Lo que estoy viendo</item>
        <item>Para mas tarde</item>
        <item>Mi cuenta</item>
    </string-array>

Buscamos en Internet algún set de iconos gratuitos y los incluimos a los recursos de nuestro proyecto en la carpeta res > drawable pues los necesitamos para el menu

    <array name="menu_icons">
        <item>@drawable/ic_search</item>
        <item>@drawable/ic_eye</item>
        <item>@drawable/ic_ticket</item>
        <item>@drawable/ic_account</item>
    </array>

Cargando los datos al RecyclerView

En nuestro archivo NavigationDrawerFragment.java vamos a crear una nueva función llamada getData(), esta función será la encargada de leer la información estática que definimos en nuestro archivo strings.xml

    public List<Menu> getData() {
        List<Menu> menu = new ArrayList<Menu>();
        TypedArray icons = getResources().obtainTypedArray(R.array.menu_icons);
        String[] labels = getResources().getStringArray(R.array.menu_list);

        for(int i = 0; i < labels.length; i++) {
            Menu item = new Menu();
            item.setTitle(labels[i]);
            item.setIcon(icons.getResourceId(i,-1));
            menu.add(item);
        }

        return menu;
    }

Lo que estamos haciendo en nuestra función es leer los títulos e imágenes (ids de recurso) y con ello estamos instanciando objetos Menu que a su vez agregamos a una lista que será devuelta por el método.

Finalmente en nuestra función onCreateView vamos a crear una nueva instancia de nuestro Adapter personalizado y se lo vamos a pasar al RecyclerView, también definiremos un objeto llamado LayoutManager para nuestro RecyclerView (asegúrate de definir el Adapter como una propiedad de tu clase)

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View layout = inflater.inflate(R.layout.fragment_navigation_drawer, container, false);
        mRecyclerView = (RecyclerView) layout.findViewById(R.id.drawerList);
        mAdapter = new MenuAdapter(getActivity(),getData());
        mRecyclerView.setAdapter(mAdapter);
        mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));

        return layout;
    }

Corremos la aplicación en nuestro emulador o teléfono físico, abrimos el NavigationDrawer y vemos nuestro menú 🙂

recyclerview

Eso es todo por ahora lectores, en el siguiente tutorial aprenderemos a aplicar color a los iconos utilizando filtros y a definir las acciones una vez que el usuario da Tap en un elemento del menú. Recuerden que el código de lo trabajado durante este tutorial lo pueden encontrar en el repositorio https://github.com/Alevsk/Material-design-en-Android
salu2

50% de descuento para Campus Party 2014!

cover2

Uno de los eventos más importantes de Tecnología y ambiente tecnológico del mundo se celebrará en nuestro país en Zapopan, hablamos de CPMX5 y hoy te mostraremos la oportunidad de como obtener tus entradas con el 50 de descuento.

  • Deben registrarse como campusero en www.campus-party.com.mx.
  • Si ya tienes usuario solo debes hacer login.
  • Una vez hecho login en el panel de usuario deben seleccionar la opción «Comprar entrada». (http://www.campus-party.com.mx/webapp/fichaUsuario/pago)
  • Elegir la opción «Comprar con descuento».
  • En el proceso deben usar el siguiente código de descuento: CD501ihw35hi (copia y pega).
  • Una vez elegido el tipo de entrada se procede al pago de la cantidad vía PayPal.

¡Y listo! solo faltaría esperar a que llegue el día de comienzo de #CPMX5 para disfrutar de una semana de contenidos para los fans de la tecnología y lo que esto implica.

Lista de ganadores de entradas para Campus Party 2013

Muchas gracias a todos los que participaron el sorteo de 3 entradas gratis para asistir a Campus Party México 2013, las personas listadas a continuación ganaron una entrada con puesto en sala para el evento :), muchas felicidades.

  • Braicot Espinoza
  • Rocio Barragan
  • Jose Vazquez Quezada

Si no resultaste ganador no te desanimes, todavía puedes conseguir tu entrada con un 20% de descuento :)!

¿Como? Muy fácil, tan solo pídela utilizando nuestra sección de contacto y con mucho gusto te enviare un código promocional para que puedas adquirir tu entrada!.

Ya falta poco, nos vemos en Campus Party México 2013

salu2

Algoritmo genético hecho en Java


Ha pasado bastante tiempo desde que no publico algún código mío, esta vez quiero compartir con ustedes un algoritmo genético hecho en Java que tuve que hacer para mi clase de Sistemas Inteligentes 😀 en el modulo de computación evolutiva, para los que no sepan que es un algoritmo genético, por aca tienen mas información.

El problema resuelto fue el problema del viajante o TSP, nuestro problema consiste básicamente en que tenemos n ciudades, que están conectadas entre si, todas con todas (n*n caminos) y existen varios objetivos, en mi caso tengo que minimizar la distancia recorrida.

Los pasos de todo algoritmo genético deben de ser

  • Generar población
  • Seleccionar a los individuos mas aptos (Torneo, selección por ruleta, etc)
  • Cruzarlos (recombinacion)
  • Mutación

Esto se realiza durante n generaciones y el objetivo es que cada generación los individuos sean mejores que los anteriores (aunque no siempre es así xD). Ahora les muestro un ejemplo de como es que funciona, supongamos que generamos nuestra población inicial la cual consiste en un camino que tiene que tomar el viajante, tiene como restricción que no puede repetir ciudades por las que ha pasado antes y el recorrido termina en la ciudad de la que partimos, ejemplo:

Batemans-Bay-Outreach  Ashfield  Bateau-Bay  Bankstown  Armidale  Blackett  Bega  | Bathurst  Bidwill  | Bradbury Airds  Albury  Batemans-Bay-Outreach  120.68747174103011

Podemos ubicar las ciudades en un plano cartesiano y verlas como si fueran puntos, desde esa perspectiva es posible sacar la distancia total del recorrido aplicando distancia euclidiana entre los puntos.

Después de eso podemos realizar una selección, entre los métodos mas comunes están el de selección por ruleta o el de selección por torneo, en este ultimo tan solo tenemos que ordenar la lista de caminos de menor a mayor y en mi caso elegir n * 3 individuos que representaran a los padres de la siguiente generación, ahora, en este punto es importante saber cuales tenemos que elegir ya que en probabilidad es poco posible que si cruzamos los 2 individuos mejor adaptados de la generación salga uno aun mas adaptado, por el contrario podría “des evolucionar” el hijo, es por eso que yo recomiendo, si vemos la población como si estuviera ordenada en una pila, tomar de los de arriba (los mejores adaptados) y algunos de en medio.

En este punto ya tenemos a los que serán los padres, ahora debemos de cruzarlos, existen varias técnicas de cruza como recombinación en 1 punto, recombinación en 2 puntos, corte y empalme, Recombinación uniforme y uniforme media y Recombinación de cromosomas ordenados, mas información aqui.

En mi caso yo utilice recombinación en 2 puntos y después aplique un algoritmo de mi creación para corregir el camino en caso de que hubiera ciudades repetidas en el.

minCutPoint: 6 maxCutPoint: 9

Padres:

Batemans-Bay-Outreach  Ashfield  Bateau-Bay  Bankstown  Armidale  Blackett  Bega  | Bathurst  Bidwill  | Bradbury Airds  Albury  Batemans-Bay-Outreach  120.68747174103011
Airds  Bankstown  Albury  Armidale  Ashfield  Batemans-Bay-Outreach  Bathurst      | Bega  Bateau-Bay  | Bidwill  Bradbury  Blackett  Airds  122.0081148734119

Hijos sin verificar:
Batemans-Bay-Outreach  Ashfield  Bateau-Bay  Bankstown  Armidale  Blackett  Bega  | Bega  Bateau-Bay  | Bradbury  Airds  Albury  Batemans-Bay-Outreach  0.0
Airds  Bankstown  Albury  Armidale  Ashfield  Batemans-Bay-Outreach  Bathurst      | Bathurst  Bidwill  | Bidwill  Bradbury  Blackett  Airds  0.0

F1Extract = | Bathurst  Bidwill  |
F2Extract = | Bega  Bateau-Bay  |

------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Cruza hijo 1:

Batemans-Bay-Outreach  Ashfield  Bateau-Bay  Bankstown  Armidale  Blackett  Bega      | Bega  Bateau-Bay  | Bradbury  Airds  Albury  Batemans-Bay-Outreach  0.0

Batemans-Bay-Outreach  Ashfield  Bateau-Bay  Bankstown  Armidale  Blackett  Bathurst  | Bega  Bateau-Bay  | Bradbury  Airds  Albury  Batemans-Bay-Outreach  0.0

Batemans-Bay-Outreach  Ashfield  Bidwill  Bankstown  Armidale  Blackett  Bathurst      | Bega  Bateau-Bay  | Bradbury  Airds  Albury  Batemans-Bay-Outreach  0.0

------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Cruza hijo 2:

Airds  Bankstown  Albury  Armidale  Ashfield  Batemans-Bay-Outreach  Bathurst  | Bathurst  Bidwill  | Bidwill  Bradbury  Blackett  Airds  0.0

Airds  Bankstown  Albury  Armidale  Ashfield  Batemans-Bay-Outreach       Bega  | Bathurst  Bidwill  | Bidwill  Bradbury  Blackett  Airds  0.0

Airds  Bankstown  Albury  Armidale  Ashfield  Batemans-Bay-Outreach       Bega  | Bathurst  Bidwill  | Bateau-Bay  Bradbury  Blackett  Airds  0.0

Aqui lo que hago es generar aleatoriamente 2 puntos de corte (minCutPoint y maxCutPoint), las ciudades entre esos 2 puntos serán los cromosomas que se insertaran en los hijos, después de eso checamos cada uno de los alelos para verificar que no esta repetido, en caso de que asi sea, remplazo la ciudad repetida por la primera ciudad no repetida del conjunto de cromosomas original del padre, lo que me asegura que siempre tendre caminos validos 🙂

Y por ultimo pero no menos importante la mutación, esta parte es bastante sencilla, genero 2 puntos aleatorios e intercambio los cromosomas de lugar, si el camino resultante es mas optimo que el original entonces el individuo evolucionara, de lo contrario se quedara igual.

Este procedimiento se realiza n generaciones, y al final esperamos tener el camino mas optimo que el viajero podría tomar.

Les dejo mi codigo fuente, espero le sirva a alguien

salu2

PD cualquier duda postearla en comentarios, gracias

Conexiones simples a mysql con JDBC en Java

Hace algún tiempo ya un amigo me pregunto que si era posible conectarse a una base de datos mysql utilizando Java, y le respondí claro que si, una opción es utilizar JDBC y el driver de mysql, hice un ejemplo bastante sencillo con el que seguro queda claro cual es la idea principal.

Lo primero que tienen que hacer es descargar el driver de conexión a mysql: mysql-connector-java-5.1.5-bin.jar y lo instalan, si utilizan eclipse es muy sencillo, tienen que copiarlo a la carpeta de su proyecto y después hacer clic con el botón secundario en su proyecto y seleccionar Build Path > Libraries > Add Jars y agregan su archivo :).

Después de eso pueden probar este pequeño código de ejemplo.

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class jdbcExample {

  Connection newDB;

  void getStates()
  {
        try {

            Statement STMT1 = newDB.createStatement();
            String SQLQuery = "SELECT name FROM states";
            ResultSet RX = STMT1.executeQuery(SQLQuery);

            while (RX.next()) {
                System.out.println(RX.getString("name"));
            }
        }
        catch(SQLException e) {

        }
  }

  void insertState(String name) {
    name = name.trim();
        if (name.length() &gt; 0) {
            try {
                Statement STMT = newDB.createStatement();

                String SQLQuery = "INSERT INTO states (name) VALUES ('" + name + "');";
                STMT.executeUpdate(SQLQuery);
                System.out.println("Se agrego un nuevo estado: " + name);
            }
            catch (SQLException e) {
                System.out.println("ERROR AL INSERTAR NUEVO ESTADO " + e.toString());
            }
        }
    }

  void removeState(String name)
  {
        try {

            Statement STMT1 = newDB.createStatement();
            String SQLQuery = "DELETE FROM states WHERE name = '" + name + "'";
            STMT1.executeUpdate(SQLQuery);

            System.out.println("Se elimino el estado: " + name);
        }
        catch(SQLException e) {
          System.out.println("ERROR AL BORRAR ESTADO " + e.toString());
        }
  }

  void performConnection() {

        String new_hostName = "127.0.0.1";
        String new_userName = "root";
        String new_password = "";
        String new_dataBase = "zonauPruebas";

        try {

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

            String newConnectionURL = "jdbc:mysql://" + new_hostName + "/" + new_dataBase + "?" + "user=" + new_userName + "&amp;password=" + new_password;
            newDB = DriverManager.getConnection(newConnectionURL);

      } catch (SQLException e) {
        System.out.println("SQL Exception: " + e.toString());
      } catch (ClassNotFoundException cE) {
        System.out.println("Class Not Found Exception: " + cE.toString());
      }

      //obteniendo datos
      getStates();
      insertState("Java Town");
      removeState("Java Town");
  }

    public static void main(String[] args) {
      jdbcExample nuevaConexion = new jdbcExample();
        nuevaConexion.performConnection();
    }
}

Ok para los que ya están familiarizados con java les resultara muy sencillo de entender, para los que aquí va la explicación, (omitiré la parte de los imports de librerías por obvias razones xD).
public class jdbcExample {

  Connection newDB;

Al inicio de creo una nueva variable de clase de tipo Connection, desde aquí comenzamos a hacer uso de la maravilloso de los objetos :p.
void performConnection() {

        String new_hostName = "127.0.0.1";
        String new_userName = "root";
        String new_password = "";
        String new_dataBase = "zonauPruebas";

        try {

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

            String newConnectionURL = "jdbc:mysql://" + new_hostName + "/" + new_dataBase + "?" + "user=" + new_userName + "&amp;password=" + new_password;
            newDB = DriverManager.getConnection(newConnectionURL);

      } catch (SQLException e) {
        System.out.println("SQL Exception: " + e.toString());
      } catch (ClassNotFoundException cE) {
        System.out.println("Class Not Found Exception: " + cE.toString());
      }

      //obteniendo datos
      getStates();
      insertState("Java Town");
      removeState("Java Town");
  }

Después, esta es la parte mas importante del código, aquí es donde establecemos la conexión a la base de datos, es especial esta

String newConnectionURL = "jdbc:mysql://" + new_hostName + "/" + new_dataBase + "?" + "user=" + new_userName + "&amp;password=" + new_password;

Donde utilizamos el protocolo JDBC para conectarnos.

Después mas abajo verán la parte donde se mandan llamar métodos de la <strong>clase</strong>

    getStates();
      insertState("Java Town");
      removeState("Java Town");

Ahora explico lo que hace cada uno de ellos, el primero hace un SELECT, el segundo un INSERT y el tercero un DELETE.
void getStates()
{
        try {

            Statement STMT1 = newDB.createStatement();
            String SQLQuery = "SELECT name FROM states";
            ResultSet RX = STMT1.executeQuery(SQLQuery);

            while (RX.next()) {
                System.out.println(RX.getString("name"));
            }
        }
        catch(SQLException e) {

        }
}

Como el código lo indica, creamos un nuevo dato de tipo Statement, armamos nuestra Query y al final realizamos la consulta (el SELECT) utilizando executeQuery y guardamos el resultado en un ResultSet que al final recorreremos utilizando un While, imprimimos el contenido con getString, esto implícitamente funciona moviendo un apuntador a través del ResulSet pero eso es otra historia xD.
void insertState(String name) {
    name = name.trim();
        if (name.length() &gt; 0) {
            try {
                Statement STMT = newDB.createStatement();

                String SQLQuery = "INSERT INTO states (name) VALUES ('" + name + "');";
                STMT.executeUpdate(SQLQuery);
                System.out.println("Se agrego un nuevo estado: " + name);
            }
            catch (SQLException e) {
                System.out.println("ERROR AL INSERTAR NUEVO ESTADO " + e.toString());
            }
        }
}

En este método al igual que en el anterior utilizamos un Statement, pero recibimos como parámetro un string, le aplicamos el método trim() que remueve espacios al inicio y al final de la cadena, después armamos nuestra consulta agregando el string de la variable name y la ejecutamos con executeUpdate

Entonces hasta ahorita ya deberían de saber como recuperar datos y como agregarlos de una base de datos :p, vamos por la tercera que seria eliminarlos.

void removeState(String name)
  {
        try {

            Statement STMT1 = newDB.createStatement();
            String SQLQuery = "DELETE FROM states WHERE name = '" + name + "'";
            STMT1.executeUpdate(SQLQuery);

            System.out.println("Se elimino el estado: " + name);
        }
        catch(SQLException e) {
          System.out.println("ERROR AL BORRAR ESTADO " + e.toString());
        }
}

Es igual al método anterior solo que ahora la consulta en lugar de contener un INSERT será un DELETE :).
    public static void main(String[] args) {
      jdbcExample nuevaConexion = new jdbcExample();
        nuevaConexion.performConnection();
    }

Al final creamos nuestro tan importante método main (se rumora que una vez un programador hizo un programa con 3 mains O.o???), y creamos una nueva instancia de nuestra clase y después ejecutamos el método performConnection() que realiza la conexión.

Bueno hasta aqui este mega tutorial relámpago de conexiones a bases de datos mysql con JDBC en Java, me voy a dormir, espero les sirva y cualquier duda comenten por favor.

Aquí les dejo el código sql de la tabla que utilice en el ejemplo para si ustedes quieren utilizarla.

Les recuerdo que aun esta en pie el concurso Ganate una cuenta premium de megaupload GRATIS

salu2