MN 2022 Lenguaje de Programación I (1891)
MN 2022 Lenguaje de Programación I (1891)
MN 2022 Lenguaje de Programación I (1891)
Lenguaje de
programación I
LENGUAJE DE PROGRAMACIÓN I 2
Índice
Presentación 5
Red de contenidos 7
Unidad de Aprendizaje 1
INTERFAZ GRÁFICA DE USUARIO
Unidad de Aprendizaje 2
GESTIÓN DE EXCEPCIONES EN JAVA.
Unidad de Aprendizaje 3
THREAD
Unidad de Aprendizaje 4
GESTIÓN DE CADENAS, FLUJOS DE ENTRADA Y SALIDA, FORMATEO Y
PARSEO EN JAVA
Unidad de Aprendizaje 5
APLICACIONES DE ESCRITORIO EN JAVA CON CONEXIÓN A BASE DE
DATOS
ANEXO
GENÉRICOS Y COLECCIONES
Presentación
Lenguaje de Programación I pertenece a la línea de Programación y Desarrollo de
Aplicaciones y se dicta en la carrera de Computación e Informática de la institución. El
curso brinda un conjunto de conceptos, técnicas y herramientas que permiten al alumno
alcanzar un nivel avanzado de conocimiento en el lenguaje Java Standard Edition (JSE),
implementando una aplicación Stand Alone con acceso a datos, utilizando Java como
lenguaje de programación.
Red de contenidos
Lenguaje de Programación I
Calendar Gestión de
Ciclo de vida Clase String JDBC
Excepciones
Date
Expresiones StringBuffer, CRUD,
Sincronización
Regulares StringBuilder Consultas
SimpleDateFormat
Transacciones
UNIDAD
1
INTERFAZ GRÁFICA DE
USUARIO
TEMARIO
1.1 Tema 1 : Creación de formularios com JInternaFrame
1.1.1 : Manejo de Layouts
1.1.2 : Temas
1.1.3 : JMenu, JMenuBar, JMenuItem
1.1.4 : JDesktopPane, JInternalFrame
1.1.5 : JTable
1.1.6 : JCalendar
1.1.7 : Widgets adicionales
ACTIVIDADES PROPUESTAS
• BorderLayout
• GridLayout
BorderLayout
GridLayout
1.1.2. Temas
JTattoo (http://www.jtattoo.net/Download.html )
Consta de varios Look para aplicaciones Swing.
Permite a los desarrolladores mejorar su aplicación con una interfaz de usuario
sencilla
Para ello:
* descargamos la librería e instalamos:
JmenuBar
Este componente es muy útil ya que representa la barra de menú que vemos siempre
en todo programa y es muy útil para acceder a la información de forma más fácil y
organizada.
Jmenu
JmenuItem
Ejemplo01
package ejemplo01;
import java.awt.Color;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JMenu;
import
javax.swing.JMenuBar;
import javax.swing.JMe
@SuppressWarnings("serial")
public class Ejemplo extends JFrame implements ActionListener {
public Ejemplo() {
setLayout(null);
mb = new
JMenuBar();
setJMenuBar(mb);
menu1 = new
JMenu("Opciones");
mb.add(menu1);
mi1 = new JMenuItem("Rojo");
mi1.addActionListener(this);
menu1.add(mi1);
mi2 = new JMenuItem("Verde");
Con estas dos clases se pueden crear ventanas internas, es muy 14onve ver este tipo
de ventanas en programas de diseño en los cuales puedes abrir varias esto, 14onver
puedes minimizar, maximizar y cerrar estas ventanas internas sin cerrar la ventana
Padre.
Ejemplo02
package vista;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import javax.swing.ImageIcon;
import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
@SuppressWarnings("serial")
public class FormularioPrincipal extends JFrame implements WindowListener {
this.setExtendedState(JFrame.MAXIMIZED_BOTH);
desktop.setSize(600, 400);
desktop.setBackground(new Color(116, 88, 135));
add(menu, BorderLayout.NORTH);
add(desktop, BorderLayout.CENTER);
addWindowListener(this);
package vista;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.JLabel;
import
javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;
@SuppressWarnings("serial")
public FrmConsultaCliente() {
this.setVisible(false);
this.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE)
; this.setTitle("Consulta de clientes");
this.setBounds(0, 0, 649, 423);
this.setClosable(true);
this.setIconifiable(true);
jLabel1.setText("Nombre");
jLabel1.setBounds(40, 37, 125,
26);
package vista;
import javax.swing.ImageIcon;
import javax.swing.JDesktopPane;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
@SuppressWarnings("unused")
private JDesktopPane desktop= new JDesktopPane();
listaItemMenus.add(mItem01);
listaItemMenus.add(mItem02);
listaItemMenus.add(mItem03);
listaItemMenus.add(mItem04);
listaItemMenus.add(mItem05);
listaItemMenus.add(mItem06);
listaItemMenus.add(mItem07);
listaItemMenus.add(mItem08);
listaMenus.add(mMenu01);
listaMenus.add(mMenu02);
listaMenus.add(mMenu03);
listaMenus.add(mMenu04);
listaMenus.add(mMenu05);
mItem01.setIcon(new
ImageIcon(MenuPrincipal.class.getResource("/iconos/Accept.gif")));
mItem01.setVisible(true);
mItem02.setIcon(new
ImageIcon(MenuPrincipal.class.getResource("/iconos/Alarm.gif")));
mItem02.setVisible(true);
mItem03.setIcon(new
ImageIcon(MenuPrincipal.class.getResource("/iconos/Bell.gif")));
mItem03.setVisible(true);
mItem04.setIcon(new
ImageIcon(MenuPrincipal.class.getResource("/iconos/Box.gif")));
mItem04.setVisible(true);
mItem05.setVisible(true);
mItem06.setVisible(true);
mItem07.setVisible(true);
mItem08.setVisible(true);
mMenu01.setVisible(true);
mMenu02.setVisible(true);
mMenu03.setVisible(true);
mMenu04.setVisible(true);
mMenu05.setVisible(true);
mItem01.addActionListener(this);
mItem02.addActionListener(this);
mItem03.addActionListener(this);
mItem05.addActionListener(this);
mItem07.addActionListener(this);
mItem08.addActionListener(this);
mMenu02.add(mItem05);
mMenu02.add(mItem06);
mMenu03.add(mItem07);
mMenu05.add(mItem08);
add(mMenu02);
add(mMenu03);
add(mMenu04);
add(mMenu05);
desktop.add(modulo05);
if(e.getSource()==mItem05
){
modulo05.setVisible
(true);
}
1.1.5. JTable
Ejercicio 01
package components;
import javax.swing.JFrame;
import javax.swing.JPanel;
import
javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import java.awt.Dimension;
import java.awt.GridLayout;
public TableDemo() {
super(new GridLayout(1,0));
"John", "Doe",
"Rowing", new Integer(3), new Boolean(true)},
{"Sue", "Black",
"Knitting", new Integer(2), new Boolean(false)},
{"Jane", "White",
"Speed reading", new Integer(20), new Boolean(true)},
{"Joe", "Brown",
"Pool", new Integer(10), new Boolean(false)}
};
/*
* Don't need to implement this method unless your table's
* editable.
*/
public boolean isCellEditable(int row, int col) {
//Note that the data/cell address is constant,
//no matter where the cell appears onscreen.
if (col < 2) {
return false;
} else {
return true;
}
}
/*
* Don't need to implement this method unless your table's
* data can change.
*/
public void setValueAt(Object value, int row, int col) {
if (DEBUG) {
System.out.println("Setting value at " + row + "," + col
+ " to " + value
+ " (an instance of "
+ value.getClass() + ")");
}
data[row][col] = value;
fireTableCellUpdated(row, col);
if (DEBUG) {
System.out.println("New value
of data:");
printDebugData();
}
}
Ejercicio 02
Modo de selección:
package components;
import javax.swing.*;
import javax.swing.table.AbstractTableModel;
import javax.swing.event.ListSelectionEvent;
import
javax.swing.event.ListSelectionListener;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.GridLayout;
import java.awt.Dimension;
public TableSelectionDemo() {
super();
setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
table.setFillsViewportHeight(true);
table.getSelectionModel().addListSelectionListener(new
RowListener());
table.getColumnModel().getSelectionModel().
addListSelectionListener(new ColumnListener());
add(new JScrollPane(table));
outputSelection();
}
}
/*
* Don't need to implement this method unless your table's
* editable.
*/
public boolean isCellEditable(int row, int col) {
//Note that the data/cell address is constant,
//no matter where the cell appears onscreen.
if (col < 2) {
return false;
} else {
return true;
}
}
/*
* Don't need to implement this method unless your table's
* data can change.
*/
public void setValueAt(Object value, int row, int col)
{ data[row][col] = value;
fireTableCellUpdated(row, col);
}
Ejercicio 03
Ordenamiento:
package components;
import javax.swing.JFrame;
import javax.swing.JPanel;
import
javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import java.awt.Dimension;
import java.awt.GridLayout;
public TableSortDemo() {
super(new GridLayout(1,0));
{"Jane", "White",
"Speed reading", new Integer(20), new Boolean(true)},
{"Joe", "Brown",
"Pool", new Integer(10), new Boolean(false)}
};
/*
* Don't need to implement this method unless your table's
* editable.
*/
public boolean isCellEditable(int row, int col) {
//Note that the data/cell address is constant,
//no matter where the cell appears onscreen.
if (col < 2) {
return false;
} else {
return true;
}
}
/*
* Don't need to implement this method unless your table's
* data can change.
*/
public void setValueAt(Object value, int row, int col) {
if (DEBUG) {
System.out.println("Setting value at " + row + "," + col
+ " to " + value
+ " (an instance of "
+ value.getClass() + ")");
}
data[row][col] = value;
if (DEBUG) {
System.out.println("New value of
data:"); printDebugData();
}
}
1.1.6. JXTable
package jxtable;
/*
* TableDemo.java requires no other files.
*/
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ListSelectionModel;
import javax.swing.table.AbstractTableModel;
import org.jdesktop.swingx.JXTable;
import org.jdesktop.swingx.decorator.HighlighterFactory;
/**
* TableDemo is just like SimpleTableDemo, except that it
* uses a custom TableModel.
*/
public class JXTableDemo extends JPanel {
private boolean DEBUG = false;
public JXTableDemo() {
super(new GridLayout(1,0));
table.getTableHeader().setReorderingAllowed(false) ;
table.getTableHeader().setBackground(Color.BLUE);
table.getTableHeader().setForeground(Color.WHITE);
table.setHighlighters(HighlighterFactory.createSimpleStriping(Highlight
erFactory.CLASSIC_LINE_PRINTER));
table.setRolloverEnabled(true);
table.setSelectionBackground(Color.BLACK);
table.setSelectionForeground(Color.WHITE);
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
/*
* JTable uses this method to determine the default renderer/
* editor for each cell. If we didn't implement this
method,
* then the last column would contain text ("true"/"false"),
* rather than a check box.
*/
public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
}
/*
* Don't need to implement this method unless your table's
* editable.
*/
public boolean isCellEditable(int row, int col) {
//Note that the data/cell address is constant,
//no matter where the cell appears onscreen.
if (col < 2) {
return false;
} else {
return true;
}
}
/*
* Don't need to implement this method unless your table's
* data can change.
*/
public void setValueAt(Object value, int row, int col) {
if (DEBUG) {
data[row][col] = value;
fireTableCellUpdated(row, col);
if (DEBUG) {
System.out.println("New value of data:");
printDebugData();
}
}
pane. JXTableDemo
newContentPane = new
JXTableDemo();
newContentPane.setOpaque(true); //content
panes must be opaque
frame.setContentPane(newContentPane);
//Display the
window.
frame.pack();
frame.setVisi
ble(true);
}
JDialog
El código para diálogos simples puede ser mínimo. Por ejemplo, aquí es un diálogo
informativo:
Por diálogos modales más simples, puede crear y mostrar el cuadro de diálogo usando
uno de JOptionPane 's show Xxx Dialog métodos. Si el diálogo debe ser un marco
interno, a continuación, añadir Internal después de show - por ejemplo,
showMessageDialog cambia a showInternalMessageDialog. Si usted necesita para
controlar el comportamiento de las ventanas de diálogo de cierre o si usted no desea
que el diálogo sea modal, entonces usted debe crear instancias directamente
JOptionPane y agregarlo a un JDialog instancia. Entonces invocar setVisible(true) en el
JDialog para que parezca.
showMessageDialog
Muestra un cuadro de diálogo modal con un botón, que está etiquetado "OK" (o el
equivalente localizado). Puede especificar fácilmente el mensaje, el icono y el título que
el diálogo muestra. Aquí están algunos ejemplos del uso showMessageDialog:
1.1.7. Calendar
package calendar;
import java.awt.Dimension;
import java.awt.Toolkit;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import
javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;
import com.toedter.calendar.JDateChooser;
@SuppressWarnings("serial")
public class FrmConsultaCliente extends JFrame {
private JLabel jLabel1;
private JTextField txtNombre;
private JButton btnFiltrar;
private JDateChooser jdcFin;
private JDateChooserjdcInicio;
private JTable jTable1;
private JScrollPane jScrollPane1;
private JLabel jLabel2;
private DefaultTableModel jTable1Model;
public FrmConsultaCliente() {
this.setVisible(false);
this.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
this.setTitle("Consulta de clientes");
this.setBounds(0, 0, 649, 423);
// este centrado del formulario interno
Dimension pantalla =
Toolkit.getDefaultToolkit().getScreen
Size(); Dimension
ventana = getSize();
setLocation((pantalla.width - ventana.width) / 2,
(pantalla.height - ventana.height) / 2);
this.setPreferredSize(new java.awt.Dimension(649, 423));
getContentPane().setLayout(null);
jTable1Model =
Nacimiento" });
Resumen
1 Componentes de la GUI
2 Jerarquía de clases
Pueden revisar los siguientes enlaces para ampliar los conceptos vistos en
esta unidad:
http://docs.oracle.com/javase/tutorial/uiswing/components/menu.html
Componentes
http://docs.oracle.com/javase/tutorial/uiswing/components/internalfra
me.html Formularios internos
table.setHighlighters(HighlighterFactory.createSimpleStriping(Highl
ighter Factory.CLASSIC_LINE_PRINTER));
table.setRolloverEnabled(true)
Pueden revisar los siguientes enlaces para ampliar los conceptos vistos en
esta unidad:
http://docs.oracle.com/javase/tutorial/uiswing/components/table.html#show
Tablas
http://www.javalobby.org/java/forums/m91834162.html
JXTable
5 Cambio de LookAndFeel
Pueden revisar los siguientes enlaces para ampliar los conceptos vistos en
esta unidad:
http://www.jtattoo.net/
Framework jtatoo
http://docs.oracle.com/javase/tutorial/uiswing/components/dialog.html
Dialogos en java
1
FORMATOS EN JAVA
TEMARIO
1.2 Tema 2 : Date
1.2.1 : Date, Calendar
1.2.2 : DateFormat, NumberFormat
1.2.3 : Locale
ACTIVIDADES PROPUESTAS
La API java nos proporciona un amplio grupo de clases para trabajar con fechas,
números y monedas.
java.util.Date se utiliza como una clase intermedia entre las clases Calendar y
DateFormat. Una instancia de la clase Date representa una fecha y hora, expresada en
milisegundos.
java.text.DateFormat nos permite definer varios formatos y estilos de fecha tales como
"01/01/70" o "Enero 1, 1970".
String s = nf.format(someNumber);
1.2.2.Date
Una instancia de la clase Date representa una fecha / hora específica. Internamente, la
fecha y hora es almacenada como un tipo primitivo long. Específicamente, el valor
representa el número de milisegundos entre la fecha que se quiere representar y el 1 de
enero de 1970.
Calendar
Para crear una instancia de la clase Calendar, debemos usar uno de los
métodos estáticos sobrecargados getInstance():
Calendar c = Calendar.
getInstance(); c.setTime(d1); // #1
if(c.SUNDAY == c. getFirstDayofWeek() // #2
System.out.println("Sunday is the first day of the week");
System.out.println("trillionth milli day of week is "
+ c.get(c.DAY_OF_WEEK)); // #3
Date d2 = c.getTime(); // #5
System.out.println("new date " + d2.toString() );
}
}
El método add. Este método permite agregar o sustraer unidades de tiempo en base a
cualquier campo que especifiquemos para la clase Calendar. Por ejemplo:
Otro método importante en la clase Calendar es roll(). Este método trabaja como add(),
con la excepción de que cuando una parte de la fecha es incrementada o decrementada,
la parte más grande de dicha fecha no será incrementada o decrementada. Por ejemplo:
import java.text.*;
import java.util.*;
class Dates3 {
public static void main(String[] args) {
Date d1 = new Date(1000000000000L);
dfa[4] = DateFormat.getDateInstance(DateFormat.LONG);
dfa[5] = DateFormat.getDateInstance(DateFormat.FULL);
for(DateFormat df : dfa)
System.out.println(df.format(d1));
}
}
9/8/01 7:46 PM
Sep 8, 2001
9/8/01
Sep 8, 2001
September 8, 2001
Saturday, September 8, 2001
DateFormat df = DateFormat.getDateInstance(
DateFormat.SHORT)
; String s = df.format(d1);
System.out.println(s);
try {
Date d2 = df.parse(s);
System.out.println("parsed = " + d2.toString());
} catch (ParseException pe) {
System.out.println("parse exc"); }
Importante:
Debemos notar que al usar el estilo SHORT, hemos perdido precisión al convertir
el objeto Date a un String. Se evidencia esta pérdida de precisión cuando
retornamos la cadena a un objeto Date nuevamente, se visualiza como hora:
media noche en lugar de 17:46:00.
1.2.4. Locale
Locale(String language)
Locale(String language, String country)
Calendar c = Calendar.getlnstance();
c.set(2010, 11, 14); // 14 de Diciembre de 2010
// (month is 0-based
Date d2 = c.getTime();
US 12/14/10 3:32 PM
US full Sunday, December 14, 2010
Italy domenica 14 dicembre 2010
Importante:
Calendar c =
Calendar.getInstance(); c.set(2010,
11, 14);
Date d2 = c.getTime();
Visualizaremos losiguiente:
def Brazil
loc Brasil
def Danish
loc dansk
D>I danese
Ejercicio 01
package fechas;
import
java.text.DateFormat;
import java.util.Date;
import java.util.Locale;
d = new Date();
//Fecha en milisegundos
long f = System.currentTimeMillis();
System.out.println(f);
//Formatos
DateFormat df1 = DateFormat.getDateInstance();
System.out.println(df1.format(d));
DateFormat df5 =
DateFormat.getDateInstance(DateFormat.LONG,Locale.FRENCH);
System.out.println(df5.format(d));
DateFormat df10 =
DateFormat.getTimeInstance(DateFormat.LONG,Locale.FRENCH);
System.out.println(df10.format(d));
Ejercicio 02
package formatos;
System.out.println(cad1.matches("[0-5][0-9]"));
System.out.println(cad1.matches("[0-9][0-9]"));
System.out.println(cad2.matches("[0-9][0-9]"));
System.out.println(cad3.matches("[0-9][0-9]"));
System.out.println(cad1.matches("\\d\\d"));
System.out.println(cad2.matches("\\d\\d"));
System.out.println(cad3.matches("\\d\\d"));
System.out.println(cad1.matches("\\d{2}"));
System.out.println(cad2.matches("\\d{2}"));
System.out.println(cad3.matches("\\d{2}"));
String dni1="12345678";
String dni2="12 45678";
System.out.println(dni1.matches("\\d{8}"));
System.out.println(dni2.matches("\\d{8}"));
String placa1
="AB1554"; String
placa2 ="ab1454";
String placa3 ="AB-
144"; String placa4
="AB 144";
System.out.println(placa1.matches("[A-Z]{2}[0-9]{4}"));
System.out.println(placa2.matches("[A-Z]{2}[0-9]{4}"));
System.out.println(placa3.matches("[A-Z]{2}[0-9]{4}"));
System.out.println(placa4.matches("[A-Z]{2}[0-9]{4}"));
}
false
true
false
false
true
false
false
true
false
false
true
false
true
false
false
false
Ejercicio 03
package fechas;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
12 - 2 - 3
15:25:44 PM
Lima, 12 de marzo de 2015
3 03 mar marzo
2015 15 2015
2015 Thursday
- March
Ha trasncurrido del año 71 días
25 minutos, 44 segundos con 747
milisegundos jueves - marzo - 2015
Thursday - March - 2015
Resumen
1. Constantes para fechas SimpleDateformat
Pueden revisar los siguientes enlaces para ampliar los conceptos vistos en
esta unidad:
http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html
UNIDAD
UNIDAD 2
GESTIÓN DE EXCEPCIONES
EN JAVA
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al término de la unidad, el alumno crea aplicaciones y gestiona los diferentes
tipos de excepciones en Java haciendo uso de manejadores de excepciones,
declarando y sobrescribiendo métodos que capturan y lanzan excepciones.
TEMARIO
ACTIVIDADES PROPUESTAS
Este mecanismo facilitará la detección de errores sin tener que escribir código especial
para verificar los valores retornados. El código que gestiona las excepciones se
encuentra claramente separado del código que las genera, esto permite utilizar el mismo
código de gestión de excepciones con un amplio rango de posibles excepciones.
Cuando un evento excepcional ocurre en Java, se dice que una excepción ha sido
lanzada. El código responsable por hacer algo con respecto a la excepción generada es
llamado el código gestor de excepciones y atrapa la excepción lanzada.
La palabra clave TRY es usada para definir un bloque de código dentro del cual puede
ocurrir una excepción. Una o más cláusulas CATCH están asociadas ana excepción
específica o grupo de excepciones. A continuación, se muestra un ejemplo:
try {
// Aquí colocamos código que podría lanzar alguna excepción.
} catch(MiPrimeraExcepcion) {
// Aquí colocamos código que gestiona la excepción
} catch(MiSegundaExcepcion) {
// Aquí colocamos código que gestiona la excepción
En el ejemplo, las líneas que definamos dentro de la cláusula TRY constituyen la zona
protegida. Las líneas dentro de la primera cláusula CATCH constituyen el gestor de
excepciones para excepciones de tipo MiPrimeraExcepcion.
try {
obtenerArchivoDeLaRed
leerArchivoYCargarTabla
}catch(NoPuedeObtenerArchivoDeLaRed) {
mostrarMensajeDeErrorDeRed
Un bloque FINALLY encierra código que es siempre ejecutado después del bloque TRY,
sea que se produzca o no una excepción. Finally se ejecuta, incluso, si existe una
sentencia return dentro del bloque TRY:
“El bloque finally se ejecuta después de que la sentencia return es encontrada y antes
de que la sentencia return sea ejecutada”.
El bloque FINALLY es el lugar correcto para, por ejemplo, cerrar archivos, liberar sockets
de conexión y ejecutar cualquier otra operación de limpieza que el código necesite. Si
se generó una excepción, el bloque FINALLY se ejecutará después de que se haya
completado el bloque CATCH respectivo.
La cláusula FINALLY no es obligatoria. Por otro lado, dado que el compilador no requiere
una cláusula CATCH, podemos tener código con un bloque TRY seguido
inmediatamente por un bloque FINALLY. Este tipo de código es útil cuando la excepción
será retornada al método que hizo la llamada. Usar un bloque FINALLY permite ejecutar
código de inicialización así no exista la cláusula CATCH.
try {
// hacer algo
} finally {
//clean up
}
try {
// hacer algo
} catch (SomeException ex) {
// do exception handling
} finally {
// clean up
}
try {
// hacer algo
}
// Se necesita un CATCH o un FINALLY aquí
System.out.println("fuera del bloque try");
try {
// hacer algo
}
// No se puede tener código entre una TRY y un CATCH
System.out.println("fuera del bloque try"); catch(Exception
ex) { }
Pila de llamadas
éste invoca al método a(), el cual invoca al método b() y éste al método c(), la pila
de llamadas tendría la siguiente apariencia:
c
b
a
main
metodo2( ) Se completará el
metodo1( ) método 2 Se completará
el método 1
main ( )
Se completará el método main y la JVM hará un exit
Orden en el cual los métodos completan su ejecución
Una excepción es primero lanzada por el método en la parte más alta de la pila. Si no
es atrapada por dicho método, la excepción caerá al siguiente nivel de la pila, al
siguiente método. Se seguirá este proceso hasta que la excepción sea atrapada o hasta
que llegar a la parte más baja de la pila. Esto se conoce como propagación de
excepciones.
Una excepción que nunca fue atrapada ocasionará que se detenga la ejecución de
nuestro programa. Una descripción de la excepción será visualizada y el detalle de la
pila de llamadas será visualizado. Esto nos ayudará a hacer un “debug” sobre nuestra
Cada excepción es una instancia de una clase que tiene a la clase Exception dentro de
su jerarquía de herencia. Es decir, las excepciones son siempre subclases de la clase
java.lang.Exception.
try {
// colocamos algún código aquí
}
catch (ArraylndexOutOfBoundsException e) {
e.printStackTrace();
}
Jerarquía de excepciones
Todas las clases de excepciones son subtipos de la clase Exception. Esta clase se
deriva de la clase Throwable (la cual deriva de la clase Object).
Podemos observar que existen dos subclases que se derivan de la clase Throwable:
Exception y Error. Las clases que se derivan de Error, representan situaciones inusuales
que no son causadas por errores del programa e indican situaciones que normalmente
no se darían durante la ejecución del programa, como por ejemplo, “JVM running out of
memory”.
En general, una excepción representa algo que sucedió no como resultado de un error
de programación, sino, más bien, porque algún recurso no se encuentra disponible o
alguna otra condición requerida para la correcta ejecución no está presente. Por
ejemplo, si se supone que la aplicación debe comunicarse con otra aplicación o
computadora que no está contestando, esta sería una excepción no causada por un
bug. En la figura previa también se aprecia un subtipo de excepción llamado
RuntimeException. Estas excepciones son un caso especial porque ellas, a veces,
indican errores del programa. Ellas también representan condiciones excepcionales
raras y/o difíciles de gestionar.
Es importante entender qué causan las excepciones y de dónde vienen éstas. Existen
dos categorías básicas:
Son excepciones en las que no es posible que el compilador pueda detectarlas antes
del tiempo de ejecución. A continuación, se muestra un ejemplo:
class NPE {
static String s;
public static void main(String [] args)
{ System.out.println(s.length());
}
}
Muchas clases pertenecientes a la API java tienen métodos que toman objetos String
como argumentos y convierten estos Strings en valores numéricos primitivos.
recursivamente.
Lanzada cuando la JVM JVM
no puede ubicar una
NoClassDefFoundError clase que necesita, por
un error de línea de
comando, problemas de
classpath, o un archivo
class perdido.
Ejercicio 01
package demo01;
System.out.println(1);
try {
System.out.println(2
); int x = 5 / 0;
System.out.println(3
);
} catch (Exception e) {
//Finalizar el sistema
//System.exit(0); No ingresa al
finally System.out.println(4);
} finally {
System.out.println(5);
}
System.out.println(6);
1
2
4
5
6
Ejercicio 02
package demo02;
int x = 6 / 0;
} catch (Exception e) {
try {
int x = 6 / 0;
} catch (ArithmeticException e)
{ e.printStackTrace();
} catch (Exception e) {
//4
// Notry{
puede existir por si solo un bloque try
// int x = 6 /
//} 0;
java.lang.ArithmeticException: / by
zero at
demo02.PosibilidadesDelTryCatch.main(PosibilidadesDelTryCatch.java:9)
java.lang.ArithmeticException: / by zero
at
demo02.PosibilidadesDelTryCatch.main(PosibilidadesDelTryCatch.java:18)
Exception in thread "main" java.lang.ArithmeticException: / by zero
Division entre cero
at
demo02.PosibilidadesDelTryCatch.main(PosibilidadesDelTryCatch.java:28)
Ejercicio 03
package demo03;
import javax.swing.JButton;
//Error de formato
try {
Integer o = Integer.parseInt("jaja");
} catch (NumberFormatException
e) {
System.out.println(e);
}
//Error de casteo
try {
//Polimorfi
smo
Object obj = new
JButton(); Integer a =
(Integer)obj;
} catch (ClassCastException
e) {
System.out.println(e);
}
}
java.lang.ArithmeticException: / by zero
}
java.lang.ArrayIndexOutOfBoundsException: 100
java.lang.StringIndexOutOfBoundsException: String index out of range: 50
java.lang.NullPointerException
java.lang.NumberFormatException: For input string: "jaja"
java.lang.ClassCastException: javax.swing.JButton cannot be cast
to java.lang.Integer
Ejercicios de aplicación:
class Plane {
static String s = "-";
public static void main(String[] args) {
new Plane().s1() ;
System.out.println(s);
}
void sl() {
try { s2();
catch (Exception e) { s += "c"; }
}
void s2() throws Exception {
s3(); s += "2";
s3(); s += "2b";
}
void s3() throws Exception {
throw new Exception();
}
a) -
b) -c
c) -c2
d) -2c
e) -c22b
f) -2c2b
g) -2c2bc
h) Compilation fails
a. ClassCastException
b. IllegalStateException
c. NumberFormatException
d. IllegalArgumentException
e. ExceptionInInitializerError
f. ArrayIndexOutOfBoundsException
class Swill {
public static void main(String[] args) {
String s = "-";
switch(TimeZone.CST) {
case EST: s += "e";
case CST: s += "c";
case MST: s += "m";
default: s += "X";
case PST: s += "p";
}
System.out.println(s);
}
}
enum TimeZone {EST, CST, MST, PST }
a) -c b) -X
c) -cm d) -cmp
g) An exception is thrown
at runtime.
class Circus {
public static void main(String[] args) {
int x = 9;
int y = 6;
for(int z = 0; z < 6; z++, y--) {
if(x > 2) x--;
label:
if(x > 5) {
System.out.print(x + " "};
--X;
continue label;
}
X--;
}
}
}
a. 8
b. 8 7
c. 876
d. Compilation fails
class Mineral { }
class Gem extends Mineral { }
class Miner {
static int x = 7; static
String s = null;
public static void getWeight(Mineral m) { int
y = 0 / x;
System.out.print(s + " ");
}
public static void main(String[] args) { Mineral[]
ma = {new Mineral(), new Gem()};
for(Object o : ma)
getWeight((Mineral) o);
}
}
a) null
b) null null
c) A ClassCastException is thrown.
d) A NullPointerException is thrown.
e) A NoClassDefFoundError is thrown.
f) An ArithmeticException is thrown.
g) An IllegalArgumentException is thrown.
h) An ArrayIndexOutOfBoundsException is thrown
UNIDAD
EXPRESIONES REGULARES
TEMARIO
2.2 Tema 4 : Expresiones Regulares
2.2.1 : Regular Expression en Java.
ACTIVIDADES PROPUESTAS
Las expresiones regulares son algo que se usa desde hace años en otros lenguajes de
programación como Perl, Sed o Awk. En la versión 1.4 del JDK de Sun se incluye el
paquete java.util.regex, que proporciona una serie de clases para poder hacer uso de la
potencia de este tipo de expresiones en Java. Antes de nada, necesitamos saber qué
es una expresión regular y para que nos puede servir:
Pues bien, una expresión regular es un patrón que describe a una cadena de caracteres.
Todos hemos utilizado alguna vez la expresión *.doc para buscar todos los documentos
en algún lugar de nuestro disco duro, pues bien, *.doc es un ejemplo de una expresión
regular que representa a todos los archivos con extensión doc, el asterisco significa
cualquier secuencia de caracteres (vale, los que ya conozcan esto dirán que no es
correcto, y dirán bien, es mas preciso hablar de *.doc pero el ejemplo es muy gráfico).
Las expresiones regulares se rigen por una serie de normas y hay una construcción
para cualquier patrón de caracteres. Una expresión regular sólo puede contener (aparte
de letras y números) los siguientes caracteres:
< $, ^, ., *, +, ?, [, ], . >
Una expresión regular, nos servirá para buscar patrones en una cadena de texto, por
ejemplo, encontrar cuantas veces se repite una palabra en un texto, para comprobar
que una cadena tiene una detereminada estructura, por ejemplo que el nombre de
archivo que nos proponen tiene una determinada extensión, o comprobar que un email
esta bien escrito... Para cada uno de estos casos existe una expresión regular que los
representa:
Por medio de la expresión regular "camion" podemos encontrar cuantas veces se repite
camión en un texto. Es la construcción más sencilla.
Esta expresión "^www.*.es" comprueba que una cadena sea una dirección web que
comience por www y sea de un servidor español.
Y esta, para ver la potencia de las expresiones regulares, comprueba la buena
formación de los correos electrónicos: "[^A-Za-z0-9.@_-~#]+".
Aplicaciones
El paquete java.util.regex esta formado por dos clases, la clase Matcher y la clase
Pattern y por una excepción, PatternSyntaxException.
La clase Pattern (segun la documentacion del jdk1.4) es la representacion compilada de
una expresion regular, o lo que es lo mismo, representa a la expresion regular, que en
el paquete java.util.regex necesita estar compilada. En castellano significa patrón.
La clase Matcher es un tipo de objeto que se crea a partir de un patrón mediante la
invocación del método Pattern.matcher. Este objeto es el que nos permite realizar
operaciones sobre la secuencia de caracteres que queremos validar o la en la secuencia
Vamos con la clase Pattern, para crear un patrón necesitamos compilar una expresión
regular, esto lo conseguimos con el método compile:
Pattern patron = Pattern.compile("camion");
El método pattern devuelve la expresión regular que hemos compilado, el método
matcher crea un objeto Matcher a partir del patrón, el método split divide una cadena
dada en partes que cumplan el patrón compilado y por último el método matches compila
una expresión regular y comprueba una cadena de caracteres contra ella.
Ahora la clase Matcher. Esta clase se utiliza para comprobar cadenas contra el patrón
indicado. Un objeto Matcher se genera a partir de un objeto Pattern por medio del
método matcher:
Una vez que tenemos el objeto creado, podemos realizar tres tipos de operaciones
sobre una cadena de caracteres. Una es a través del método matches que intenta
encajar toda la secuencia en el patrón (para el patrón "camion" la cadena "camion"
encajaría, la cadena "mi camion es verde" no encajaría). Otra es a través del método
lookingAt, intenta encajar el patrón en la cadena (para el patrón "camion" tanto la cadena
"camion" como la cadena "mi camion es verde" encajaria). Otra es la proporcionada por
el método find que va buscando subcadenas dentro de la cadena de caracteres que
cumplan el patrón compilado (una vez encontrada una ocurrencia, se puede
inspeccionar por medio de los métodos start que marca el primer carácter de la
ocurrencia en la secuencia y el método end que marca el ultimo carácter de la
ocurrencia). Todos estos métodos devuelven un booleano que indica si la operación ha
tenido éxito.
Todo lo anterior esta orientado a la b6uacutesqueda de patrones en cadenas de
caracteres, pero puede que queramos llegar mas allá, que lo que queramos sea
reemplazar una cadena de caracteres que se corresponda con un patrón por otra
cadena. Por ejemplo, un método que consigue esto es replaceAll que reemplaza toda
ocurrencia del patrón en la cadena por la cadena que se le suministra.
Ejemplos
El siguiente es un ejemplo del uso del método replaceAll sobre una cadena. El ejemplo
sustituye todas las apariciones que concuerden con el patron "a*b" por la cadena "-".
// se importa el paquete
java.util.regex import
java.util.regex.*;
El siguiente ejemplo trata de validar una cadena que supuestamente contiene un email,
lo hace con cuatro comprobaciones, con un patrón cada una, la primera que no contenga
como primer caracter una @ o un punto, la segunda que no comience por www. , que
contenga una y solo una @ y la cuarta que no contenga caracteres ilegales:
import java.util.regex.*;
while(resultado) {
caracteresIlegales = true;
m.appendReplacement(sb, "");
resultado = m.find();
}
input = sb.toString();
if (caracteresIlegales) {
System.out.println("La cadena contiene caracteres ilegales");
}
}
}
Conclusión
Las expresiones regulares vienen a tapar un hueco en el JDK de Sun que venia siendo
solicitado desde hace mucho tiempo. Con la inclusión de las expresiones regulares Java
se convierte, en este tema, en un lenguaje de programación tan flexible como otros mas
tradicionales en el tema de las expresiones regulares, Perl, Awk, etc... Hasta ahora la
unica opción para conseguir un efecto parecido era el uso de StringTokenizer en
conjunción con llamadas repetidas al método charAt que producía un código demasiado
enrevesado. Las expresiones regulares tienen un amplio abanico de posibilidades,
principalmente para hacer búsquedas, para sustituir ocurrencias y para comprobar la
buena formación de cadenas, como se ha visto en el ejemplo del email.
Resumen
6. Si desea saber más acerca de estos temas, puede consultar las siguientes
páginas.
Pueden revisar los siguientes enlaces para ampliar los conceptos vistos en
esta unidad:
http://today.java.net/pub/a/today/2003/12/04/exceptions.html
Aquí hallará importantes reglas básicas para la gestión de excepciones en
java.
http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Exception.html
En esta página, hallará documentación detallada de la clase base de todas
las excepciones controladas: Exception
Pueden revisar los siguientes enlaces para ampliar los conceptos vistos en esta
unidad:
Expresiones regulares
http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html
UNIDAD
3
THREAD
TEMARIO
3.1 Tema 5 : Thread
3.1.1 : Clase Thread. Ciclo de Vida de un Thread
3.1.2 : Interface Runnable
3.1.3 : Sincronización
3.1.4 : Aplicaciones con Hilo seguro
ACTIVIDADES PROPUESTAS
THREAD
Java da soporte al concepto de Thread desde el mismo lenguaje, con algunas clases e
interfaces definidas en el package java.lang y con métodos específicos para la
manipulación de Threads en la clase Object.
Desde el punto de vista de las aplicaciones los threads son útiles porque permiten que
el flujo del programa sea divido en dos o más partes, cada una ocupándose de alguna
tarea. Por ejemplo, un Thread puede encargarse de la comunicación con el usuario,
mientras otros actuan en segundo plano, realizando la transmisión de un fichero,
accediendo a recursos del sistema (cargar sonidos, leer ficheros), etc. De hecho, todos
los programas con interface gráfico (AWT o Swing) son multithread porque los eventos
y las rutinas de dibujado de las ventanas corren en un thread distinto al principal.
El siguiente diagrama ilustra los distintos estados que puede tener un Thread Java en
cualquier momento de su vida. También ilustra las llamadas a métodos que provocan
las transiciones de un estado a otro. Este no es un diagrama de estado finito pero da un
idea general del las facetas más interesantes y comunes en la vida de un thread. El
resto de está página explica el ciclo de vida de un thread, basándose en sus estados.
Un "Nuevo Thread"
La siguiente sentencia crea un nuevo thread pero no lo arranca, por lo tanto deja el
thread en el estado: "New Thread" = "Nuevo Thread".
Cuando un thread está en este estado, es sólo un objeto Thread vacío. No se han
asignado recursos del sistema todavía para el thread. Así, cuando un thread está en
este estado, lo único que se puede hacer es arrancarlo o pararlo. Llamar a otros métodos
distintos de start() o stop() no tiene sentido y causa una excepción del tipo
IllegalThreadStateException.
Ejecutable
Ahora consideremos estas dos líneas de código.
Cuando el método start() crea los recursos del sistema necesarios para ejecutar el
thread, programa el thread para ejecutarse, y llama al método run() del thread. En este
punto el thread está en el estado "Ejecutable". Este estado se llama "Ejecutable" mejor
que "Ejecutando" ya que el thread todavía no ha empezado a ejecutarse cuando está
en este estado. Muchos procesadores tienen un sólo procesador, haciendo posible que
todos los threads sean "Ejecutables" al mismo tiempo. Por eso, el sistema de ejecución
de Java debe implementar un esquema de programación para compartir el procesador
entre todos los threads "Ejecutables".
(Puedes ver la página Prioridad de un Thread para obtener más información sobre la
programación.) Sin embargo, para la mayoría de los propositos puedes pensar en
"Ejecutable" como un sencillo "Ejecutando". Cuando un thread se está ejecutanto -- está
"Ejecutable" y es el thread actual -- las instrucciones de su método run()se ejecutan de
forma secuencial.
Ejecutable
Un thread entra en el estado "No Ejecutable" cuando ocurre uno de estos cuatro
eventos.
Alguien llama a su método sleep().
Alguien llama a su método suspend().
El thread utiliza su método wait() para esperar una condición variable.
El thread está bloqueado durante la I/O.
Por ejemplo, la línea en negrita del siguiente fragmento de codigo pone a dormir
miThread durante 10 segundos (10.000 milisegundos).
try {
miThread.sleep(10000);
} catch (InterruptedException e){
}
Durante los 10 segundos que miThread está dormido, incluso si el proceso se vuelve
disponible miThread no se ejecuta. Después de 10 segundos, miThread se convierte en
"Ejecutable" de nuevo y, si el procesar está disponible se ejecuta.
Para cada entrada en el estado "No Ejecutable" mostrado en figura, existe una ruta de
escape distinta y específica que devuelve el thread al estado "Ejecutable". Una ruta de
escape sólo trabaja para su entrada correspondiente. Por ejemplo, si un thread ha sido
puesto a dormir dutante un cierto número de milisegundos deben pasar esos
milisegundos antes de volverse "Ejecutable" de nuevo.
Muerto
Un thread puede morir de dos formas: por causas naturares o siendo asesinado
(parado). Una muerte natural se produce cuando su método run() sale normalmente.
Por ejemplo, el bucle while en este método es un bucle finito -- itera 100 veces y luego
sale.
Un thread con este método run() moriría natualmente después de que el bucle y el
método run() se hubieran completado.
También puede matar un thread en cualquier momento llamando a su método stop(). El
siguiente código crea y arranca miThread luego lo pone a dormir durante 10 segundos.
Cuando el thread actual se despierta, la línea en negrita mata miThread.
Thread miThread =
new MiClaseThread();
miThread.start();
try {
Thread.currentThread().sleep(10000);
} catch (InterruptedException e){
}
miThread.stop();
El método stop() lanza un objeto ThreadDeath hacia al thread a eliminar. Así, cuando
se mata al thread de esta forma, muere de forma asíncrona. El thread moririá cuando
reciba realmente la excepción ThreadDeath.
El método stop() provoca una terminación súbita del método run() del thread. Si el
método run() estuviera realizando cálculos sensibles, stop() podría dejar el programa en
un estado inconsistente. Normalmente, no se debería llamar al método stop() pero si se
debería proporcionar una terminación educada como la selección de una bandera que
indique que el método run() debería salir.
Ejercicio01
package thread.estructura.porHerencia;
/*
* - Para que sea hilo debe heredar de Thread
* - El cuerpo es método RUN
*/
public class Hilo extends Thread{
@Override
public void run() {
while(true){
try {
sleep(1000);
} catch (InterruptedException
e) { e.printStackTrace();
}
System.out.println("Hilo");
}
}
}
package thread.estructura.porHerencia;
Ejercicio02
package thread.estructura.porImplementacion;
Runnable{ @Override
public void run() {
while(true){
try {
Thread.sleep(1000);
} catch (InterruptedException e)
{ e.printStackTrace();
}
System.out.println("Hilo");
}
package thread.estructura.porImplementacion;
THREAD - SINCRONIZACIÓN
3.1.3. Sincronización
Para evitarlo debemos sincronizar los hilos. Cuando un hilo escribe en el fichero, debe
marcar de alguna manera que el fichero está ocupado. El otro hilo, al intentar escribir,
lo verá ocupado y deberá esperar a que esté libre. En java esto se hace fácilmente. El
código sería así
synchronized (fichero)
{
fichero.println("En un lugar de la Mancha...");
}
y el otro hilo
synchronized (fichero)
{
fichero.println("... ser o no ser ...");
}
Métodos sincronizados
Otro mecanismo que ofrece java para sincronizar hilos es usar métodos sincronizados.
Este mecanismo evita además que el que hace el código tenga que acordarse de poner
synchronized.
Imagina que encapsulamos fichero dentro de una clase y que ponemos un método
synchronized para escribir, tal que así:
public ControladorFichero()
{
// Aqui abrimos el fichero y lo dejamos listo
// para escribir.
}
Una vez hecho esto, nuestros hilos Cervantes y Shakespeare sólo tienen que hacer
esto:
Estupendo y maravilloso pero ... ¿qué pasa si mientras se escriben estos datos otro hilo
borra uno de los elementos?. Imagina que lista.size() nos ha devuelto 3 y justo antes de
intentar escribir el elemento 2 (el último) viene otro hilo y borra cualquiera de los
elementos de la lista. Cuando intentemos el lista.get(2) nos saltará una excepción
porque la lista ya no tiene tantos elementos.
package sincronizacion02;
package sincronizacion02;
Padre h1 = new
Padre(d); h1.start();
Esposa h2 = new
Esposa(d); h2.start();
Suegra h3 = new
Suegra(d); h3.start();
Hijo h4 = new
Hijo(d); h4.start();
}
package sincronizacion02;
@Override
public void run() {
while (true) {
data.retroceso("Esposa", 800);
try {
sleep(100);
} catch (InterruptedException e)
{ e.printStackTrace();
}
package sincronizacion02;
@Override
public void run() {
while (true) {
data.retroceso("Hijo", 1000);
try {
sleep(500);
} catch (InterruptedException e)
{ e.printStackTrace();
}
}
package sincronizacion02;
@Override
public void run() {
while (true) {
data.avance("Padre", 500);
try {
sleep(500);
} catch (InterruptedException e)
{ e.printStackTrace();
}
}
package sincronizacion02;
@Override
public void run() {
while (true) {
data.retroceso("Suegra", 400);
try {
sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Seguidamente, se van a repasar algunas de las diferencias entre los métodos y bloques
sincronizados en Java basados en la experiencia y las reglas sintácticas de la palabra
reservada synchronized en Java. Aunque ambos pueden ser usados para proveer un
alto grado de sincronización en Java, el uso del bloque sincronizado sobre el método es
considerado en Java una mejor práctica de programación.
Resumen
1. Parea ejecutar un hilo se invoca al método start.
Pueden revisar los siguientes enlaces para ampliar los conceptos vistos en
esta unidad:
http://docs.oracle.com/javase/tutorial/essential/concurrency/
Java Concurrency
http://labojava.blogspot.com/2012/10/estados-de-un-thread.html
4. Los bloques sincronizados y los métodos sincronizados son dos formar de utilizar la
sincronización en Java e implementar la exclusión mutua en secciones críticas de
código. Java se utiliza de forma habitual en programas multi-hilo, los cuales
presentan varios tipos de peligros como la seguridad del hilo, deadlocks y
condiciones de carrera, que pueden aparecer en el código por un mal entendimiento
del mecanismo de sincronización provisto por Java.
Pueden revisar los siguientes enlaces para ampliar los conceptos vistos en
esta unidad:
http://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html
Sincronización
http://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html
Bloques de sincronización
UNIDAD
4
GESTIÓN DE CADENAS
TEMARIO
4.1 Tema 6 : La clase String
4.1.1 : La clase String – Definición y gestión de memoria
4.1.2 : Principales métodos de la clase String
4.1.3 : Las clases StringBuffer y StringBuilder
ACTIVIDADES PROPUESTAS
Ejercicio 01
package cadenas;
System.out.println(cadena.startsWith("Lu"));
System.out.println(cadena.endsWith("na"));
//Ejercicio 1
System.out.println(cad1.substring(cad1.length()-1));
System.out.println(cad1.charAt(cad1.length()-1));
true false
true true
true
lucia_na
LUCIA_NA
LucIx_nx
LucIa_nita
LucI-_na
Ia_na
c r r
luis pedro
fernamdez
luz
ana
maria
cadena ‘J’ ‘a’ ‘v’ ‘a’ ‘ ’ ‘e’ ‘s’ ‘ ’ ‘m’ ‘e’ ‘j’ ‘o’ ‘r’
i 0 1 2 3 4 5 6 7 8 9 10 11 12
METODO DESCRIPCION
length() Devuelve la longitud de la cadena.
int longitud =
cadena.length();
longitud 13
charAt(int) Devuelve una copia del carácter que encuentre
en la posición indicada por el parámetro.
char caracter =
cadena.charAt(8);
caracter 'm'
equals(String) Comprueba si dos cadenas son iguales. En este
caso comprueba que el objeto dado como
argumento sea de tipo String y contenga la
misma cadena de caracteres que el objeto
actual.
String s = "Java";
boolean x = cadena.equals(s);
x false
int x =
cadena.compareTo(s1)
, y =
cadena.compareTo(s2)
, z =
cadena.compareTo(s3)
;
String s = "JavaX";
boolean x =
cadena.startsWith(s)
; x false
endsWith(String) Comprueba si el final de la cadena actual
coincide con la cadena pasada como parámetro.
String s = "mejor";
boolean x =
cadena.endsWith(s)
; x true
indexOf(int) Devuelve la posición que por primera vez aparece
el carácter (expresado como entero) pasado como
parámetro. En caso no exista devuelve -1.
int i =
cadena.indexOf('e')
; i 5
indexOf(int,int) Devuelve la posición que por primera vez aparece
el carácter (expresado como entero) a partir de la
posición especificada como segundo parámetro.
int i =
cadena.indexOf('e',6)
; i 9
int i =
cadena.indexOf("va")
; i 2
indexOf(String,int) Devuelve la posición que por primera vez aparece
la cadena pasada como parámetro, pudiendo
especificar en un segundo parámetro a partir de
dónde buscar.
int i =
cadena.indexOf("ej",5)
; i 9
lastIndexOf(int) Devuelve la última vez que aparece el carácter
lastIndexOf(int,int) (expresado como entero) o cadena pasada como
lastIndexOf(String) parámetro, pudiendo especificar en un segundo
parámetro, a partir de dónde buscar (búsqueda
lastIndexOf(String,int) hacia atrás).
String s = "e";
int i = cadena.lastIndexOf(s);
i 9
substring(int,int)
char[] arreglo =
cadena.toCharArray();
String.valueOf(boolean)
String.valueOf(int) double r = 3.1416;
String.valueOf(long) String s = String.valueOf(r);
String.valueOf(float) s "3.1416"
String.valueOf(double)
String.valueOf(Object)
String.valueOf(char[])
String.valueOf(char[],int,int) Transforma una subcadena de un arreglo de
caracteres, especificando una posición y la
longitud.
char
c[]={'C','i','b','e','r','J','a','v','a'}
;
String s = String.valueOf(c,3,5);
s "erJav"
Ejercicio 02
Dada la cadena:
Encuentre:
package cadenas;
//Encuentre:
//1 Número total de personas
//2 Número total de personas que terminan en vocal a
//3 Número total de personas que empiezan en vocal a
//4 Número total de personas que terminan en cualquier vocal
//5 Número total de personas que empiezan en cualquier vocal
String cad2 =
"luis,pedro,fernamdez,luz,ana,maria"; String[] s =
cad2.split(",");
int cont1=0, cont2=0, cont3=0, cont4=0;
for (String aux : s) {
if(aux.endsWith("a")) cont1++;
if(aux.startsWith("a"))
cont2++;
if(aux.endsWith("a")||aux.endsWith("e")||
aux.endsWith("i")||aux.endsWith("o")|
| aux.endsWith("u"))
cont3++;
if(aux.startsWith("a")||aux.startsWith("e")||
aux.startsWith("i")||aux.startsWith("o")|
| aux.startsWith("u"))
cont4++;
}
System.out.println("#Personas: " + s.length);
System.out.println("#Personas terminan en a: " + cont1);
System.out.println("#Personas empiezan en a: " + cont2);
System.out.println("#Personas termina en vocal: " +
cont3); System.out.println("#Personas empiezan en vocal: "
+ cont4);
}
}
#Personas: 6
#Personas terminan en a: 2
#Personas empiezan en a: 1
#Personas termina en vocal:
3 #Personas empiezan en
vocal: 1
Eercicio 03
Dada la cadena:
String usuarios =
=
"María-F,juan-M,Pedro-M,Sonia-F,"
+ "Alberto-M,Rosa-F,Elias-M,Ana-F,"
+ "Jorge-M,Luis-M,Juana-F,Elvira-F";
package cadenas;
String usuarios =
"María-F,juan-M,Pedro-M,Sonia-F,"
+ "Alberto-M,Rosa-F,Elias-M,Ana-F,"
+ "Jorge-M,Luis-M,Juana-F,Elvira-F";
String[] s = usuarios.split(",");
int sexM =0, sexF=0;
for (String aux : s) {
if(aux.endsWith("F
")) sexF ++;
else
sexM ++;
System.out.print
ln(
aux.replaceAll("-F", "").replaceAll("-M",
""));
}
María
juan
Pedro
Sonia
Alber
to
Rosa
Elias
Ana
Jorge
Luis
Juana
Elvir
a
#número de personas : 12
#número de sexo Masculino :
6 #número de sexo Femenino
: 6
4.1.3. Las clases StringBuffer y StringBuilder
String x
= "abc";
x.concat
("def");
System.out.println("x = " + x); // la salida es "x = abc"
Dado que no hubo ninguna asignación usando el operador new, el Nuevo objeto
String creado con el método concat() fue abandonada instantáneamente. Ahora
veamos el siguiente ejemplo:
String x = "abc";
x = x.concat("def");
System.out.println("x = " + x); // la salida es "x = abcdef"
En el ejemplo previo, hemos creado un nuevo objeto String; sin embargo, el antiguo
objeto x con el valor abc, ha sido perdido en el pool; por lo tanto, estamos desperdiciando
memoria. Si estuviéramos usando un objeto de tipo StringBuffer en vez de un String, el
código se vería de la siguiente manera:
StringBuffer sb = new
StringBuffer("abc");
sb.append("def");
System.out.println("sb = " + sb); // la salida es "sb = abcdef"
Todos los métodos del objeto StringBuffer operan sobre el valor asignado al objeto del
método que invocamos. Por ejemplo, una llamada a sb.append("def"); implica que
estamos agregando "def" al mismo objeto de tipo StringBuffer sb. A continuación, se
muestra un ejemplo:
Debemos notar que en los dos ejemplos previos, solo hemos realizado una llamada al
operador new y no hemos creado tampoco ningún objeto String adicional. Cada ejemplo
solo necesitó ejecutar un único objeto StringXXX.
public synchronized StringBuffer append(String s). Este método actualiza el valor del
objeto que lo invocó. El método puede tomar argumentos de diferentes tipos tales como
boolean, char, double, float, int, long, entre otros, siendo el más usado el argumento de
tipo String.
StringBuffer sb = new
StringBuffer("set ");
sb.append("point");
System.out.println(sb); // la
salida es "set point" StringBuffer sb2 = new
StringBuffer("pi = "); sb2.append(3.14159f);
System.out.println(sb2); // la salida es "pi = 3.14159"
public StringBuilder delete(int start, int end) retorna un objeto StringBuilder y actualiza el
valor del objeto StringBuilder que invocó al método. En ambos casos una subcadena
es removida del objeto original. El índice de inicio de la subcadena a eliminar es definido
por el primer argumento (el cual está basado en cero), y el índice final de la subcadena
a ser removida es definido por el segundo argumento (el cual está basado en 1). A
continuación, se muestra un ejemplo:
StringBuilder sb = new StringBuilder("0123456789");
Tip:
Dado que los objetos StringBuffer son modificables, el código mostrado a continuación
se comportará de manera diferente que un código similar aplicado sobre objetos
String:
StringBuffer sb = new
StringBuffer("abc");
sb.append("def");
System.out.println( sb );
StringBuilder sb = new
StringBuilder("01234567");
sb.insert(4, "---");
System.out.println( sb ); // la salida es "0123---4567"
public synchronized StringBuffer reverse() This method returns a StringBuffer object and
updates the value of the StringBuffer object that invoked the method call. En ambos
casos, los caracteres en el objeto StringBuffer son invertidos.
Importante:
result = method1().method2().method3();
Si hay un tercer método, el resultado de la llamada al segundo método será usado para
invocar al tercer método, cuyo resultado será la expresión final resultante de toda la
operación:
String x = "abc";
String y = x.concat("def").toUpperCase().replace('C','x');
//metodos encadenados
System.out.println("y = " + y); // el resultado es "y = ABxDEF"
El literal def fue concatenado con abc, creando un String temporal e intermedio (el cual
pronto sera descartado), con el valor abcdef. El método toUpperCase() creó un nuevo
String temporal (que también pronto sera perdido) con el valor ABCDBF. El método
replace() creó un String final con el valor ABxDEF el cual es referenciado por la variable
y.
package cadenas;
public class
Comparacion {
{
long ti = System.currentTimeMillis();
String cad = "";
for (int i = 0; i < 10000; i++) {
cad = cad + "Elba";
}
long tf = System.currentTimeMillis();
System.out.println("String con + : " + (tf - ti));
}
{
long ti =
System.currentTimeMillis(); String
cad = "";
for (int i = 0; i < 1000000; i++)
{ cad.concat("Elba");
}
long tf = System.currentTimeMillis();
System.out.println("String con concat : " + (tf -
ti));
}
{
//StrinBuffer: Es de tipo hilo seguros
//Un solo hilo puede aceder a la cadena
//Es por eso que es lento
long ti = System.currentTimeMillis();
StringBuffer cad = new
StringBuffer(); for (int i = 0; i <
1000000; i++) {
cad.append("Elba");
}
long tf = System.currentTimeMillis();
System.out.println("StringBuffer : " + (tf -
ti));
}
{
Metodos de StringBuilder
package cadenas;
//Elimina caracteres
cad.delete(5, 8);
System.out.println(cad);
//reversa
cad.reverse();
System.out.println(cad);
//remplaza la caracteres
cad.setCharAt(2, '*');
cad.setCharAt(4, '*');
System.out.println(cad);
}
Resumen
1 Metodos de la clase String
Pueden revisar los siguientes enlaces para ampliar los conceptos vistos en
esta unidad:
https://javierrguez.wordpress.com/2010/01/12/resumenes-scjp-capitulo-6-
strings- io-formateo-y-parseo/
String, StringBuilder, StringBuffer
UNIDAD
UNIDAD
5
APLICACIONES DE ESCRITORIO
EN JAVA CON CONEXIÓN A
BASE DE
DATOS
TEMARIO
5.1 Tema 7 : JDBC- Básico
5.1.1 : Connection, Class.forName
5.1.2 : Generar Conexiones Registros a base de datos
ACTIVIDADES PROPUESTAS
Java Database Connectivity, más conocida por sus siglas JDBC,1 2 es una API que
permite la ejecución de operaciones sobre bases de datos desde el lenguaje de
programación Java, independientemente del sistema operativo donde se ejecute o de la
base de datos a la cual se accede, utilizando el dialecto SQL del modelo de base de
datos que se utilice.
El API JDBC se presenta como una colección de interfaces Java y métodos de gestión
de manejadores de conexión hacia cada modelo específico de base de datos. Un
manejador de conexiones hacia un modelo de base de datos en particular es un conjunto
de clases que implementan las interfaces Java y que utilizan los métodos de registro
para declarar los tipos de localizadores a base de datos (URL) que pueden manejar.
Para utilizar una base de datos particular, el usuario ejecuta su programa junto con la
biblioteca de conexión apropiada al modelo de su base de datos, y accede a ella
estableciendo una conexión; para ello provee el localizador a la base de datos y los
parámetros de conexión específicos. A partir de allí puede realizar cualquier tipo de tarea
con la base de datos a la que tenga permiso: consulta, actualización, creación,
modificación y borrado de tablas, ejecución de procedimientos almacenados en la base
de datos, etc.
Pasos de la Conexión
Ejercicio 01
Insertar Categoría
-- -----------------------------------------------------
-- Table `ejemplo`.`categoria`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `ejemplo`.`categoria` (
`idcategoria` INT NOT NULL AUTO_INCREMENT,
`nombre`
VARCHAR(45)
NULL,
PRIMARY KEY
(`idcategor
ia`))
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `ejemplo`.`producto`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `ejemplo`.`producto` (
`idproducto` INT NOT NULL AUTO_INCREMENT,
`nombre` VARCHAR(45) NULL,
`precio` DOUBLE NULL,
`stock` INT NULL,
`categoria_idcategor
ia` INT NOT NULL,
PRIMARY KEY
(`idproducto`),
INDEX `fk_producto_categoria_idx`
(`categoria_idcategoria` ASC), CONSTRAINT
`fk_producto_categoria`
FOREIGN KEY (`categoria_idcategoria`)
-- -----------------------------------------------------
-- Table `ejemplo`.`boleta`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `ejemplo`.`boleta` (
`idboleta` INT NOT NULL AUTO_INCREMENT,
`fechaRegistr
o` DATETIME
NULL, PRIMARY
KEY
(`idboleta`))
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `ejemplo`.`producto_has_boleta`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `ejemplo`.`producto_has_boleta` (
`producto_idproducto` INT NOT NULL,
`boleta_idboleta` INT NOT NULL,
PRIMARY KEY (`producto_idproducto`, `boleta_idboleta`),
INDEX `fk_producto_has_boleta_boleta1_idx`
(`boleta_idboleta` ASC), INDEX
`fk_producto_has_boleta_producto1_idx`
(`producto_idproducto` ASC), CONSTRAINT
`fk_producto_has_boleta_producto1`
FOREIGN KEY (`producto_idproducto`)
REFERENCES `ejemplo`.`producto` (`idproducto`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT
`fk_producto_has_boleta_b
oleta1` FOREIGN KEY
(`boleta_idboleta`)
REFERENCES
`ejemplo`.`boleta` (`idboleta`)
ON DELETE NO ACTION
ONUPDATE NO ACTION) ENGINE = InnoDB;
SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
package utils;
import
java.sql.Connection;
import
java.sql.DriverManager;
import
java.sql.SQLException;
/*
* Permite crer una conexion a la BD
* Se debe tener:
* 1) Driver JDBC
* 2) Ip del Servidor
* 3) puerto
* 4) Nombre de la BD
* 5) Usuario
* 6) Password
*/
public class
MiConexion {
static{
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException
e) { e.printStackTrace();
}
}
/*
* IP :localhost
* PUERTO: 3306
* BD: mydb
* USUARIO: root
* PASSWORD: mysql
*
*/
public Connection
getConexion(){
Connection conn =
null;
*
try {
conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/eje
mplo", "root",
"mysql");
} catch
(SQLException
e) {
e.printStackTr
ace();
}
return conn;
}
package ejecuciones;
import java.sql.Connection;
import java.sql.PreparedStatement;
import utils.MiConexion;
try {
//1 se crea la conexion
conn = new MiConexion().getConexion();
Resumen
1 Información para conectarse a base de datos
IP :localhost
PUERTO: 3306
BD: mydb
USUARIO: root
PASSWORD: mysql
java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
at java.net.URLClassLoader.findClass(Unknown
Source) at
java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown
Source) at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.Class.forName0(Native
Method) at
java.lang.Class.forName(Unknown Source)
at utils.MiConexion.<clinit>(MiConexion.java:23)
at
ejecuciones.InsertaCategoria.main(InsertaCategoria.java:18)
java.sql.SQLException: No suitable driver found for
jdbc:mysql://localhost:3306/ejemplo
at java.sql.DriverManager.getConnection(Unknown
Source) at
java.sql.DriverManager.getConnection(Unknown Source)
at utils.MiConexion.getConexion(MiConexion.java:41)
at
ejecuciones.InsertaCategoria.main(InsertaCategoria.java:18)
java.lang.NullPointerException
Pueden
at revisar los siguientes enlaces para ampliar los conceptos vistos en
ejecuciones.InsertaCategoria.main(InsertaCategoria.java:22)
esta unidad:
http://stackoverflow.com/questions/18058714/java-class-forname-jdbc-
connection-loading-driver
JDBC
http://dev.mysql.com/downloads/connector/odbc/
UNIDAD
5
APLICACIONES DE ESCRITORIO
EN JAVA CON CONEXIÓN A
BASE DE
DATOS
TEMARIO
5.2 Tema 8 : JDBC - Mantenimientos
5.2.1 : Clases Connection, PreparedStatement y ResultSet
5.2.2 : Insertar,eliminar, listar, actualizar
ACTIVIDADES PROPUESTAS
JDBC- MANTENIMIENTOS
5.2.1. Clases Connection, PreparedStatement y ResultSet
Connection
Donde:
PreparedStatement
Cuando trabajamos con una base de datos es posible que haya sentencias SQL que
tengamos que ejecutar varias veces durante la sesión, aunque sea con distintos
parámetros. Por ejemplo, durante una sesión con base de datos podemos querer
insertar varios registros en una tabla. Cada vez los datos que insertamos serán distintos,
pero la sentencia SQL será la misma: Un INSERT sobre determinada tabla que será
simpre igual, salvo los valores concretos que queramos insertar.
ResultSet
Puede utilizar un objeto ResultSet para acceder a una tabla de datos generada
ejecutando una consulta. Las filas de la tabla se recuperan en secuencia. Dentro de una
fila, es posible acceder a los valores de las columnas en cualquier orden.
Los datos almacenados en ResultSet se recuperan mediante los diversos métodos get,
en función del tipo de datos que se vaya a recuperar.El método next() permite
desplazarse a la fila siguiente.
ResultSet permite obtener y actualizar columnas por nombre, aunque el uso del índice
de columna mejora el rendimiento.
CREATE SCHEMA IF NOT EXISTS `champion` DEFAULT CHARACTER SET utf8 COLLATE
utf8_general_ci ;
USE `champion` ;
-- -----------------------------------------------------
-- Table `champion`.`equipo`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `champion`.`equipo` (
`idequipo` INT NOT NULL AUTO_INCREMENT,
-- -----------------------------------------------------
-- Table `champion`.`jugador`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `champion`.`jugador` (
`idjugador` INT NOT NULL AUTO_INCREMENT,
`nombre` VARCHAR(45) NULL,
`apellido` VARCHAR(45) NULL,
`fechaNacimiento` DATE NULL,
PRIMARY KEY (`idjugador`))
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `champion`.`Campeonato`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `champion`.`Campeonato` (
`idCampeonato` INT NOT NULL AUTO_INCREMENT,
`nombre` VARCHAR(45) NULL,
`año` INT NULL,
PRIMARY KEY (`idCampeonato`))
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `champion`.`equipo_has_jugador`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `champion`.`equipo_has_jugador` (
`idequipo` INT NOT NULL,
`idjugador` INT NOT NULL,
`idCampeonato` INT NOT NULL,
PRIMARY KEY (`idequipo`, `idjugador`, `idCampeonato`),
INDEX `fk_equipo_has_jugador_jugador1_idx` (`idjugador` ASC),
INDEX `fk_equipo_has_jugador_equipo_idx` (`idequipo` ASC),
INDEX `fk_equipo_has_jugador_Campeonato1_idx` (`idCampeonato` ASC),
CONSTRAINT `fk_equipo_has_jugador_equipo`
FOREIGN KEY (`idequipo`)
REFERENCES `champion`.`equipo` (`idequipo`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_equipo_has_jugador_jugador1`
FOREIGN KEY (`idjugador`)
REFERENCES `champion`.`jugador` (`idjugador`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_equipo_has_jugador_Campeonato1`
FOREIGN KEY (`idCampeonato`)
REFERENCES `champion`.`Campeonato` (`idCampeonato`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `champion`.`grupos`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `champion`.`grupos` (
`idgrupos` INT NOT NULL AUTO_INCREMENT,
`descripcion` VARCHAR(45) NULL,
PRIMARY KEY (`idgrupos`))
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `champion`.`grupos_has_Campeonato`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `champion`.`grupos_has_Campeonato` (
`idgrupos` INT NOT NULL,
`idCampeonato` INT NOT NULL,
`idequipo` INT NOT NULL,
PRIMARY KEY (`idgrupos`, `idCampeonato`, `idequipo`),
INDEX `fk_grupos_has_Campeonato_Campeonato1_idx` (`idCampeonato` ASC),
INDEX `fk_grupos_has_Campeonato_grupos1_idx` (`idgrupos` ASC),
INDEX `fk_grupos_has_Campeonato_equipo1_idx` (`idequipo` ASC),
CONSTRAINT `fk_grupos_has_Campeonato_grupos1`
FOREIGN KEY (`idgrupos`)
REFERENCES `champion`.`grupos` (`idgrupos`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_grupos_has_Campeonato_Campeonato1`
FOREIGN KEY (`idCampeonato`)
REFERENCES `champion`.`Campeonato` (`idCampeonato`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_grupos_has_Campeonato_equipo1`
FOREIGN KEY (`idequipo`)
REFERENCES `champion`.`equipo` (`idequipo`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `champion`.`partido`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `champion`.`partido` (
`idpartido` INT NOT NULL AUTO_INCREMENT,
`fechaPartido` DATE NULL,
`goles1` INT NULL,
`goles2` INT NULL,
`idequipo1` INT NOT NULL,
`idequipo2` INT NOT NULL,
`idCampeonato` INT NOT NULL,
`idgrupos` INT NOT NULL,
PRIMARY KEY (`idpartido`),
INDEX `fk_partido_Campeonato1_idx` (`idCampeonato` ASC),
INDEX `fk_partido_equipo1_idx` (`idequipo1` ASC),
INDEX `fk_partido_equipo2_idx` (`idequipo2` ASC),
INDEX `fk_partido_grupos1_idx` (`idgrupos` ASC),
CONSTRAINT `fk_partido_Campeonato1`
FOREIGN KEY (`idCampeonato`)
REFERENCES `champion`.`Campeonato` (`idCampeonato`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_partido_equipo1`
FOREIGN KEY (`idequipo1`)
REFERENCES `champion`.`equipo` (`idequipo`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_partido_equipo2`
FOREIGN KEY (`idequipo2`)
REFERENCES `champion`.`equipo` (`idequipo`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_partido_grupos1`
FOREIGN KEY (`idgrupos`)
REFERENCES `champion`.`grupos` (`idgrupos`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
Ejercicio:
Insertar Campeonato
package entidad;
package model;
import java.sql.Connection;
import
java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import util.MiConexion;
import entidad.Campeonato;
try {
con = new MiConexion().getConexion();
eliminados = pstm.executeUpdate();
System.out.println("Eliminados : " + eliminados);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (pstm != null)pstm.close(); i
f (con != null)con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return eliminados;
}
try {
con = new MiConexion().getConexion();
actualizados = pstm.executeUpdate();
System.out.println("Eliminados : " + actualizados);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (pstm != null)pstm.close();
if (con != null)con.close();
} catch (SQLException e) { e.printStackTrace();
}
}
return actualizados;
}
c = new Campeonato();
c.setIdCampeonato(rs.getInt("idCampeonato"));
c.setDescripcion(rs.getString("nombre"));
c.setAnno(rs.getInt("año"));
data.add(c);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (pstm != null)pstm.close();
if (con != null)con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return data;
}
try {
con = new MiConexion().getConexion();
insertados = pstm.executeUpdate();
System.out.println("Insertados : " + insertados);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (pstm != null)pstm.close();
if (con != null)con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return insertados;
}
package gui;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.border.EmptyBorder;
import model.ModelCampeonato;
import entidad.Campeonato;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
FrmInsertaCampeonato frame = new
FrmInsertaCampeonato();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public FrmInsertaCampeonato() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 362);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
lblRegistraCampeonato.setHorizontalAlignment(SwingConstants.CENTER);
lblRegistraCampeonato.setOpaque(true);
lblRegistraCampeonato.setForeground(Color.YELLOW);
lblRegistraCampeonato.setBackground(Color.RED);
lblRegistraCampeonato.setBounds(10, 11, 414, 46);
contentPane.add(lblRegistraCampeonato);
JLabel lblNombr = new JLabel("Nombre");
lblNombr.setBounds(41, 112, 69, 27);
contentPane.add(lblNombr);
if(!des.matches("[a-z_A-Z0-9\\s]{4,50}")){
JOptionPane.showMessageDialog(this,
"Debe ser alfanuméricos entre 4 y 50
caracteres");
return;
}
if(!anno.matches("[0-9]{4}")){
JOptionPane.showMessageDialog(th
is,
"Debe ser numero de 4 dígitos");
return;
}
txtNombre.setText("");
txtAnno.setText("");
txtNombre.requestFocus();
}
}
Mantenimiento de Campeonato
package gui;
import java.awt.BorderLayout;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;
import java.awt.Font;
import java.awt.Color;
import javax.swing.SwingConstants;
import javax.swing.JTextField;
import javax.swing.JButton;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import entidad.Campeonato;
import model.ModelCampeonato;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseEvent;
import java.util.List;
/**
* Launch the application.
*/
public static void main(String[] args)
{ EventQueue.invokeLater(new
Runnable() {
public void run() {
try {
FrmCrudCampeonato frame = new
FrmCrudCampeonato();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public FrmCrudCampeonato() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 466);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
labellblMantenimientoCampeonato.setHorizontalAlignment(SwingConsta
nts.CENTER);
lblMantenimientoCampeonato.setForeground(Color.WHITE);
lblMantenimientoCampeonato.setFont(new Font("Tahoma",
Font.BOLD,19));
table.addMouseListener(this);
table.setModel(new
DefaultTableModel(
new Object[][] {
},
new String[] {
"Id", "Nombre", "A\u00F1o"
}
));
scrollPane.setViewportView(table);
Campeonato c = new
Campeonato();
c.setDescripcion(nom);
c.setAnno(Integer.parseInt(
anno));
model.insertaCampeonato(c);
listaCampeonato();
}
protected void do_btnEliminar_actionPerformed(ActionEvent arg0) {
model.eliminaCampeonato(idSelecci
onado); listaCampeonato();
}
protected void do_btnActualizar_actionPerformed(ActionEvent
arg0) { String nom = txtNombre.getText().trim();
String anno = txtAnno.getText().trim();
model.actualizaCampeonato(c);
listaCampeonato();
}
DefaultTableModel dtm =
(DefaultTableModel)table.getModel();
txtNombre.setText(nom);
txtAnno.setText(String.valueOf(anno));
}
Resumen
1 Para realizar una inserción, eliminación o actuialización se debe usar la sentencia
s = pstm.executeUpdate();
rs = pstm.executeQuery();
Pueden revisar los siguientes enlaces para ampliar los conceptos vistos en esta
unidad:
http://tutorials.jenkov.com/jdbc/resultset.html
ResultSet
http://www.tutorialspoint.com/jdbc/jdbc-statements.htm
Statements
5
APLICACIONES DE ESCRITORIO
EN JAVA CON CONEXIÓN A
BASE DE DATOS
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al término de la unidad, el alumno crea aplicaciones que utilizan una fuente de
datos Mysql y podrá realizar mantenimientos, consultas y transacciones
utilizando las clases Connection, PreparedStatement, etc; del JDBC. Además
podrá acceder a procedimientos almacenados.
TEMARIO
5.3 Tema 9 : JDBC - Consultas
5.3.1 : Clases Connection, PreparedStatement y ResultSet
5.3.2 : Listar
ACTIVIDADES PROPUESTAS
Connection
Donde:
url: Identificador de la Base de Datos
usr: Usuario con el que se abre la conexión (opcional)
pwr: Contraseña del Usuario (opcional)
PreparedStatement
Cuando trabajamos con una base de datos es posible que haya sentencias SQL que
tengamos que ejecutar varias veces durante la sesión, aunque sea con distintos
parámetros. Por ejemplo, durante una sesión con base de datos podemos querer
insertar varios registros en una tabla. Cada vez los datos que insertamos serán distintos,
pero la sentencia SQL será la misma: Un INSERT sobre determinada tabla que será
simpre igual, salvo los valores concretos que queramos insertar.
ResultSet
Puede utilizar un objeto ResultSet para acceder a una tabla de datos generada
ejecutando una consulta. Las filas de la tabla se recuperan en secuencia. Dentro de una
fila, es posible acceder a los valores de las columnas en cualquier orden.
Los datos almacenados en ResultSet se recuperan mediante los diversos métodos get,
en función del tipo de datos que se vaya a recuperar.El método next() permite
desplazarse a la fila siguiente.
ResultSet permite obtener y actualizar columnas por nombre, aunque el uso del índice
de columna mejora el rendimiento.
5.3.2 Listar
Invocar en el botón Reporte el meotod listado que en su interior llama al metodo lsitado
que se encuentrta en la case MySqlUsuarioDAO.java
Resumen
1 Para realizar la ejecución de un select
rs = pstm.executQuery();
while(rs.next()){
Pueden revisar los siguientes enlaces para ampliar los conceptos vistos en esta
unidad:
http://tutorials.jenkov.com/jdbc/resultset.html
ResultSet
http://www.tutorialspoint.com/jdbc/jdbc-statements.htm
Statements
UNIDAD
5
APLICACIONES DE ESCRITORIO
EN JAVA CON CONEXIÓN A
BASE DE
DATOS
TEMARIO
5.4 Tema 10 : JDBC – Procedimientos almacenados
5.4.1 : Clases Connection, CallStatetement y ResultSet
5.4.2 : Ejercicios
ACTIVIDADES PROPUESTAS
DELIMITER $$
END
c.setFechaNacimiento(rs.getDate("fechaNacimiento"));
data.add(c);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (pstm != null)pstm.close();
if (con != null)con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return data;
}
5.4.2. Ejercicios
DELIMITER $$
END
c.setFechaNacimiento(rs.getDate("fechaNacimiento"));
data.add(c);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (pstm != null)pstm.close();
if (con != null)con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return data;
}
Generar consultas
package entidad;
import
java.util.Date;
package model;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import util.MiConexion;
import entidad.Jugador;
c.setFechaNacimiento(rs.getDate("fechaNacimiento"));
data.add(c);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (pstm != null)pstm.close();
if (con != null)con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return data;
}
package gui;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.border.EmptyBorder;
import javax.swing.table.DefaultTableModel;
import model.ModelJugador;
import entidad.Jugador;
@SuppressWarnings("serial")
public class FrmConsultaJugador extends JFrame implements KeyListener {
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
FrmConsultaJugador frame = new
FrmConsultaJugador();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public FrmConsultaJugador() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
; setBounds(100, 100, 450, 384);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
lblConsultaJugadorPor.setHorizontalAlignment(SwingConstants.CENTER);
lblConsultaJugadorPor.setForeground(Color.WHITE);
lblConsultaJugadorPor.setFont(new Font("Tahoma", Font.BOLD,
18));
lblConsultaJugadorPor.setBounds(10, 11, 414, 34);
contentPane.add(lblConsultaJugadorPor);
dataTable.addRow(fila);
}
}
}
Resumen
1 Para realizar una ejecución en procedimientos almacenados
Pueden revisar los siguientes enlaces para ampliar los conceptos vistos en esta
unidad:
http://www.mkyong.com/jdbc/jdbc-callablestatement-stored-procedure-in-
parameter-example/
Ejemplos de ejecucion de procedimientos almacenados
http://www.tutorialspoint.com/jdbc/jdbc-stored-procedure.htm
Jdbc y procedimientos almacenados
UNIDAD
5
APLICACIONES DE ESCRITORIO
EN JAVA CON CONEXIÓN A
BASE DE DATOS
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al término de la unidad, el alumno crea aplicaciones que utilizan una fuente de
datos Mysql y podrá realizar mantenimientos, consultas y transacciones
utilizando las clases Connection, PreparedStatement, etc; del JDBC. Además,
podrá acceder a procedimientos almacenados.
TEMARIO
5.5 Tema 11 : JDBC - Transacciones
5.5.1 : Definición de Transacción
5.5.2 : Transacciones en JDBC
ACTIVIDADES PROPUESTAS
Desde un punto de vista técnico, un TPS monitoriza los programas transaccionales (un
tipo especial de programas). La base de un programa transaccional está en que gestiona
los datos de forma que estos deben ser siempre consistentes (por ejemplo, si se realiza
un pago con una tarjeta electrónica, la cantidad de dinero de la cuenta sobre la que
realiza el cargo debe disminuir en la misma cantidad que la cuenta que recibe el pago,
de no ser así, ninguna de las dos cuentas se modificará), si durante el transcurso de
una transacción ocurriese algún error, el TPS debe poder deshacer las operaciones
realizadas hasta ese instante. Si bien este tipo de integridad es que debe presentar
cualquier operación de procesamiento de transacciones por lotes, es particularmente
importante para el procesamiento de transacciones on-line: si, por ejemplo, un sistema
de reserva de billetes de una línea aérea es utilizado simultáneamente por varios
operadores, tras encontrar un asiento vacío, los datos sobre la reserva de dicho asiento
deben ser bloqueados hasta que la reserva se realice, de no ser así, otro operador
podría tener la impresión de que dicho asiento está libre cuando en realidad está siendo
reservado en ese mismo instante. Sin las debidas precauciones, en una transacción
podría ocurrir una reserva doble. Otra función de los monitores de transacciones es la
detección y resolución de interbloqueos (deadlock), y cortar transacciones para
recuperar el sistema en caso de fallos masivos.
Características
Respuesta rápida
En este tipo de sistemas resulta crítico que exista un rendimiento elevado con tiempos
de respuesta cortos. Una empresa no puede permitirse tener clientes esperando por
una respuesta del SPT; el tiempo total transcurrido desde que se inicia la transacción
hasta que se produce la salida correspondiente debe ser del orden de unos pocos
segundos o menos.
Fiabilidad
Muchas organizaciones basan su fiabilidad en los SPT; un fallo en un SPT afectará
negativamente a las operaciones o incluso parará totalmente el negocio. Para que un
SPT sea efectivo, su tasa de fallos debe ser muy baja. En caso de fallo de un SPT, debe
existir algún mecanismo que permita una recuperación rápida y precisa del sistema.
Esto convierte en esencial la existencia procedimientos de copia de seguridad y de
recuperación ante fallos correctamente diseñados.
Inflexibilidad
Procesamiento controlado
El procesamiento en un SPT debe apoyar las operaciones de la organización. Por
ejemplo, si una organización establece roles y responsabilidades para determinados
empleados, el SPT debe entonces mantener y reforzar este requisito.
Propiedades
Atomicidad
Los cambios de estado provocados por una transacción son atómicos: o bien ocurren
todos o bien no ocurre ninguno. Estos cambios incluyen tanto modificaciones de la base
de datos, como envío de mensajes o acciones sobre los transductores.
Consistencia
Una transacción es una transformación de estado correcta. Las acciones consideradas
en su conjunto no violan ninguna de las restricciones de integridad asociadas al estado.
Esto implica que la transacción debe ser un programa correcto.
Aislamiento
Incluso cuando varias transacciones se ejecuten de forma concurrente, para cada
transacción T debe parecer que el resto de transacciones se han ejecutado antes o
después de T, pero no antes y después.
Durabilidad
Una vez que una transacción ha finalizado con éxito (compromiso), cambia hacia un
estado estable a prueba de fallos.
Hay momentos en los que no desea una declaración entre en vigor a menos que otra
completa. Por ejemplo, cuando el propietario de The Coffee Break actualiza la cantidad
de café que se vende cada semana, el propietario también desee actualizar la cantidad
total vendida hasta la fecha. Sin embargo, la cantidad vendida por semana y la cantidad
total vendida debe actualizarse al mismo tiempo; de lo contrario, los datos serán
inconsistentes. La manera de estar seguro de que se produzcan ya sea ambas acciones
o ninguna acción ocurre es utilizar una transacción. Una transacción es un conjunto de
una o más sentencias que se ejecuta como una unidad, por lo que o bien todas las
sentencias se ejecutan, o ninguna de las declaraciones se ejecuta.
Desactivación del modo de confirmación automática
Cuando se crea una conexión, que está en modo auto-commit. Esto significa que cada
sentencia SQL individuo es tratado como una transacción y se compromete de forma
automática después de que se ejecuta. (Para ser más precisos, el valor predeterminado
es para una sentencia SQL que se comete cuando se haya completado, no cuando se
ejecuta. Se completa una declaración cuando todos sus conjuntos de resultados y
cuentas de actualización se han recuperado. En casi todos los casos, sin embargo, se
completa una declaración, y por lo tanto comprometido, justo después de que se
ejecute.)
con.setAutoCommit (false);
Cometer Transacciones
PreparedStatement updateSales =
null; PreparedStatement
updateTotal = null;
String updateString =
"update " + dbName +
".COFFEES " + "set SALES = ?
where COF_NAME = ?";
String updateStatement =
"update " + dbName + ".COFFEES
" + "set TOTAL = TOTAL + ? " +
"where COF_NAME = ?";
try {
con.setAutoCommit(f
alse);
updateSales = con.prepareStatement(updateString);
updateTotal = con.prepareStatement(updateStatement);
modo auto-commit sólo durante el modo de transacción. De esta manera, se evita que
contienen bloqueos de base de datos para múltiples declaraciones, lo que aumenta la
probabilidad de conflictos con otros usuarios.
Además de la agrupación de estados juntos para la ejecución como una unidad, las
transacciones pueden ayudar a preservar la integridad de los datos en una tabla. Por
ejemplo, imagine que un empleado tenía que entrar en nuevos precios del café en la
mesa COFFEES pero retrasó haciéndolo durante unos días. Mientras tanto, los precios
subieron, y en la actualidad el propietario es en el proceso de introducción de los precios
más altos. El empleado finalmente consigue alrededor de entrar en los precios ahora
obsoletos, al mismo tiempo que el dueño está tratando de actualizar la tabla. Después
de insertar los precios desfasados, el empleado se da cuenta de que ya no son válidos
y llama a la Connection método rollback para deshacer sus efectos. (El método rollback
aborta la transación y restaura los valores a lo que eran antes del intento de
actualización.) Al mismo tiempo, el propietario está ejecutando un SELECT declaración
y la impresión de los nuevos precios. En esta situación, es posible que el propietario se
imprimirá un precio que se había deshecho de su valor anterior, por lo que el precio
impreso incorrecta.
Para evitar conflictos durante una transacción, un DBMS utiliza bloqueos, mecanismos
para bloquear el acceso de otros a los datos que se esté accediendo a la transacción.
(Tenga en cuenta que el modo de auto-commit, donde cada sentencia es una
transacción, bloqueos se mantienen durante una sola declaración.) Después se
establece un bloqueo, que permanece en vigor hasta que la transacción se confirma o
se deshace. Por ejemplo, un DBMS podría bloquear una fila de una tabla hasta cambios
a que se han comprometido. El efecto de este bloqueo sería la de evitar que un usuario
conseguir una lectura sucia, es decir, la lectura de un valor antes de que se haga
permanente. (Acceso a un valor actualizado que no se ha cometido se considera una
lectura sucia porque es posible que el valor que se revierte a su valor anterior. Si se lee
un valor que luego se deshace, se ha leído un valor no válido. )
Por lo general, usted no tiene que hacer nada sobre el nivel de aislamiento de
transacción; sólo puede utilizar el valor predeterminado para su DBMS. El nivel de
aislamiento de transacción por defecto depende de su DBMS. Por ejemplo, para Java
DB, se TRANSACTION_READ_COMMITTED . JDBC permite a averiguar cuál es el
nivel de aislamiento de transacción de su DBMS está ajustado en (utilizando la
Connection método getTransactionIsolation ) y también le permite establecer a otro nivel
(usando la Connection método setTransactionIsolation ).
public void
modifyPricesByPercentage(
String coffeeName,
float
priceModifier,
float maximumPrice)
throws SQLException
{
con.setAutoCommit(false);
try {
Savepoint save1 =
con.setSavepoint(); getPrice =
con.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY
); updatePrice = con.createStatement();
if (!getPrice.execute(query))
{ System.out.println(
"Could not find entry "
+ "for coffee named " +
coffeeName);
} else {
rs =
getPrice.getResultSet();
rs.first();
float oldPrice = rs.getFloat("PRICE");
float newPrice = oldPrice + (oldPrice * priceModifier);
System.out.println(
"Old price of " + coffeeName
+ " is " + oldPrice);
System.out.println(
"New price of " + coffeeName
+ " is " + newPrice);
System.out.println(
"Performing
update...");
updatePrice.executeUpdate(
"UPDATE COFFEES SET PRICE = " +
newPrice +
" WHERE COF_NAME = '" +
coffeeName + "'");
System.out.println(
"\nCOFFEES table after
" + "update:");
CoffeesTable.viewTable(con)
; if (newPrice >
maximumPrice) {
con.rollback(save1);
System.out.println(
"\nCOFFEES table " +
"after rollback:");
CoffeesTable.viewTable(con);
}
con.commit();
}
} catch (SQLException e) {
JDBCTutorialUtilities.printSQLException(e);
} finally {
if (getPrice != null) { getPrice.close(); } if
(updatePrice != null) {
updatePrice.close();
}
con.setAutoCommit(true);
}
}
La siguiente declaración especifica que el cursor del ResultSet objeto generado desde
el getPrice consulta se cierra cuando el commit se llama al método. Tenga en cuenta
que si su DBMS no soporta ResultSet.CLOSE_CURSORS_AT_COMMIT , entonces se
ignora esta constante
getPrice=con.prepareStatement (consulta,
ResultSet.CLOSE_CURSORS_AT_COMMIT);
con.rollback (GUARDAR1);
package model;
import java.sql.Connection;
importjava.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import util.ConexionDB;
import entidad.BoletaBean;
import entidad.DetalleBoletaBean;
try {
conn = new ConexionDB().getConexion();
//Se anula el auto envío
conn.setAutoCommit(false);
pstm3 = conn.prepareStatement(sql3);
for (DetalleBoletaBean aux : lstDetalle) {
pstm3.setInt(1, aux.getIdProducto());
pstm3.setInt(2, idBoleta);
pstm3.setDouble(3, aux.getPrecio());
pstm3.setInt(4, aux.getCantidad());
pstm3.executeUpdate();
}
try {
conn.close();
pstm1.close();
pstm2.close();
pstm3.close();
} catch (SQLException e) {
}
}
return contador;
}
}
Resumen
1 Evita el envio automático
conn.setAutoCommit(false);
conn.commit();
conn.rollback();
Pueden revisar los siguientes enlaces para ampliar los conceptos vistos en esta
unidad:
http://www.tutorialspoint.com/jdbc/jdbc-transactions.htm
Transacciones
http://www.java2s.com/Code/Java/Database-SQL-
JDBC/CommitorrollbacktransactioninJDBC.htm
Ejemplos de transacciones
UNIDAD
5
APLICACIONES DE ESCRITORIO
EN JAVA CON CONEXIÓN A
BASE DE
DATOS
TEMARIO
5.6 Tema 12 : Reportes
5.6.1 : IReport
5.6.2 : Generación de reportes
ACTIVIDADES PROPUESTAS
Crear un reporte
5.6. Reportes
5.6.1. IReporte
iReport es el diseñador de informes Open Source para JasperReports, facilita de
forma visual, la construcción y edición de los reportes.
iReport genera un archivo de tipo “jrxml”, en el cual se encontrará el diseño y estilo del
reporte, el cual al compilarse genera el archivo de tipo "jasper".
Jasper Reports
Jasper Reports es un lenguaje para generación de
reportes en Java.
Se diseña el reporte en un archivo .xml y se compila
a un archivo . Jasper.
Este archivo se interpreta junto a la BD generando el reporte .PDF.
Configurar la BD a utilizar
Diseñar el reporte
Abrir iReports
Ejecuta el icono
Configurando la BD
Diseñando un reporte
• Elegimos la plantilla
(Ej. Blank A4), pulsamos
Open this Template
• Definimos la consulta
• Visualizamos el resultado
• Mejoramos el diseño y
• Generamos el .jasper
Resumen
Jasper Reports
iReports
Pueden revisar los siguientes enlaces para ampliar los conceptos vistos en esta unidad:
https://jonathanmelgoza.com/blog/como-crear-reportes-en-java/
Ejemplos para crear reportes en java
http://www.cpxall.com/2013/01/mi-primer-reporte-en-java-con-
eclipse-ireport-mysql.htm
Reporte en java
UNIDAD
6
GENÉRICO Y COLECCIONES
TEMARIO
6.1 Tema 13 : Colecciones
6.1.1 : Framework Collections. Principales clases e Interfaces.
6.1.2 : Clase ArrayList. Principales métodos.
6.1.3 : Ordenamiento de Collections y arreglo
6.1.4 : Set y tipos.
6.1.5 : Map y tipos.
ACTIVIDADES PROPUESTAS
6.1. COLECCIONES
Las colecciones en Java, se empiezan a utilizar a partir de la versión 1.2, se amplía luego
su funcionalidad en la versión 1.4 mejorándose aún más en la versión 5.
Existen diversas operaciones básicas que podremos realizar con las colecciones. A
continuación, se mencionan las principales:
El término colección, dentro del contexto de Java, posee tres significados, los cuales
detallamos a continuación:
Dentro de estos cuatro tipos básicos existen los siguientes sub tipos:
Una clase que implemente una interface de la familia Collection, puede ser desordenada
y no estar clasificada (unsorted y unordered), clasificada pero no ordenada, o ambas,
clasificada y ordenada.
Para un collection de objetos de tipo String, el orden natural es alfabético. Para una
colección de enteros, el orden natural es por valor numérico, 1 antes que 2 y así
sucesivamente. Para objetos creados por el usuario, no existe un orden natural, a menos
que o hasta que le proporcionemos uno a través de una interface (Comparable) que
define como las instancias de una clase pueden ser comparadas unas con otras. Si el
desarrollador decide que los objetos deben ser comparados usando el valor de alguna
variable de instancia, entonces una colección ordenada ordenará los objetos sobre la
base de las reglas en dicha clase definidas para hacer ordenamiento sobre la base de
una variable específica. Evidentemente, este objeto podría también heredar un orden
natural de una super clase.
Importante:
Las tres implementaciones de la interface List están ordenadas por la posición del
índice, una posición que determinamos ya sea cargando un objeto en un índice
específico o agregándolo sin especificar posición. En este caso, el objeto es agregado
al final. A continuación, se describen las implementaciones de esta interface:
ArrayList es una lista dinámica que nos proporciona una iteración rápida y un rápido
acceso aleatorio. Es una colección clasificada (por índice) pero no ordenada.
Implementa la interface RandomAccess, la cual permite que la lista soporte un rápido
acceso aleatorio. Es ideal y superior a LinkedList para iteraciones rápidas, mas no para
realizar muchas operaciones de insert o delete.
LinkedList Este objeto está clasificado por posición del índice como un ArrayList, con
la excepción de que sus elementos se encuentran doblemente enlazados uno con otro.
Este esquema permite que contemos con nuevos métodos para agregar y eliminar
desde el inicio o desde el final, lo que lo hace una opción interesante para implementar
pilas o colas. Puede iterar más lentamente que un ArrayList, pero es la major opción
para hacer inserts o deletes rápidamente. A partir de la versión 5, implementa la
interface java.util.Queue, por lo que soporta los métodos relacionados con colas: :
peek(), poll(), and offer().
Ordenando Collections
A continuación se muestra un ejemplo de aplicación:
import java.util.*;
class TestSortl {
public static void main(String[] args) {
ArrayList<String> stuff = new ArrayList<String>(); // #1
stuff.add("Denver");
stuff.add("Boulder");
stuff.add("Vail") ;
stuff.add("Aspen"); stuff.add("Telluride");
System.out.println("unsorted " + stuff);
Collections.sort(stuff); // #2
System.out.println("sorted " + stuff);
}
}
Salida desordenada: [Denver, Boulder, Vail, Aspen, Telluride] Salida ordenada: [Aspen,
Boulder, Denver, Telluride, Vail]
La interface Comparable
int x = thisObject.compareTo(anotherObject);
Negative
Si este objeto < otro Object
zero
Positive
El método sort() usa compareTo() para determinar cómo la lista o arreglo de objetos
debe ser ordenada. Dado que podemos implementar el método compareTo() para
nuestras propias clases, podremos usar cualquier criterio de ordenamiento para
nuestras clases:
Este código es válido, pero puede ser riesgoso dado que debemos de hacer un casteo
y debemos de asegurarnos de que este casteo no fallará antes de que lo utilicemos.
Importante:
import java.util.*;
class GenreSort implements Comparator<DVDInfo> {
public int compare(DVDInfo one, DVDInfo two) {
return one.getGenre().compareTo(two.getGenre());
}
}
import java.util.*;
import java.io.*; // populateList() needs this public class
TestDVD {
ArrayList<DVDInfo> dvdlist = new ArrayList<DVDInfo>();
public static void main(String[] args) {
new TestDVD().go();
}
public void go() { populateList();
System.out.println(dvdlist); // output as read from file
Collections.sort(dvdlist);
System.out.println(dvdlist); // output sorted by title
java.lang.Comparable java.util.Comparator
int objOne.compareTo(objTwo) int compare(objone, objTwo)
Retorna: El mismq que Comparable
Negativo si obj One < objTwo
Cero si objOne == objTwo
Positivo si objOne > objTwo
Debemos modificar la clase cuyas Debemos construir una
instancias queremos ordenar. clase independiente de la
clase que
queremos ordenar.
Solo podemos crear una secuencia Podemos crear
de ordenamiento. muchas
secuencias de
ordenamiento
Implementada frecuentemente por la Creada para
API java: String, Wrapper classes, ser
Date, Calendar… implementada por
instancias
de Terceros.
Recordemos que los métodos sort() de las clases Collections y Arrays son métodos
estáticos, y ambos trabajan directamente sobre los objetos que están ordenando, en vez
de retornar un objeto diferente ordenado.
Existen dos métodos que permiten convertir arreglos en listas y listas en arreglos. Las
clases List y Set tienen los métodos toArray(), y las clases Arrays, tienen un método
llamado asList().
System.out.println("\nsl[1] " +
sList.get(1));
Obtendremos la siguiente salida:
size 4
idx2 three
one five
three six
sl[1] five
List<Integer> iL = new
ArrayList<Integer>(); for(int x=0; x<3;
x++)
iL.add(x);
Object[] oa = iL.toArray(); //
create an Object array Integer[] ia2 = new
Integer[3];
ia2 = iL.toArray(ia2); // create an Integer array
HashSet. Es un conjunto sin clasificar y sin ordenar. Se utiliza el valor hashCode del
objeto que se inserta como mecanismo de acceo. Esta clase es ideal cuando
requerimos un Collection que no tenga objetos duplicados y no nos importe como
iteraremos a través de ellos.
LinkedHashSet. Versión mejorada de HashSet que mantiene una lista doble través de
todos sus elementos. Es conveniente utilizar esta clase en vez de HashSet cuando
importa el orden en la iteración: iteraremos a través de los elementos en el orden en que
fueron insertados.
Importante:
TreeSet. Un TreeSet es uno de los dos collections ordenados con que se cuentan dentro
del framework (el otro es TreeMap). Esta estructura garantiza que los elementos se
encontrarán en orden ascendente de acuerdo con el orden natural. Opcionalmente,
podremos construir un TreeSet utilizando un constructor que le indique una regla de
ordenamiento específica.
Un objeto Map permite solo identificadres únicos. Debemos asociar una key única con
un valor específico, donde ambos, la key y el valor, son objetos. Las implementaciones
de la interface Map nos permitirán hacer operaciones tales como buscar valores
basados en una key, preguntar por sólo los valores de un collection, o sólo por sus keys.
De la misma manera que los conjuntos, un Map utiliza el método equals() para
determinar si dos keys son las mismas o diferentes.
Resumen
1. Clases de las colecciones
http://stackoverflow.com/questions/3317381/what-is-the-difference-between-
collection-and-list-in-java
Colecciones en java
http://docs.oracle.com/javase/tutorial/collections/index.html
Collections
UNIDAD
Anexo
GENÉRICOS Y COLECCIONES
TEMARIO
6.2 Tema 14 : Genéricos
6.2.1 : Polimorfismo y tipos genéricos
6.2.2 Métodos genéricos
6.2.3 Declaraciones genéricas
ACTIVIDADES PROPUESTAS
6.2. GENÉRICOS
Las colecciones genéricas nos proporcionan los mismos beneficios de seguridad en los
tipos que los arreglos, aunque existen algunas diferencias fundamentales que están
relacionadas con el uso de polimorfismo en Java.
En otras palabras, es válido asignar un ArrayList a un objeto List porque List es clase
padre de ArrayList.
La respuesta es No funcionará. Existe una regla básica para el ejemplo anterior: El tipo
de una declaración de variable debe corresponder al tipo que que pasamos en el objeto
actual. Si declaramos List<Foo> foo, entonces lo que asignemos a la variable foo debe
ser un tipo genérico<Foo>. No un subtipo de <Foo>. Tampoco un supertipo de <Foo>.
Sólo <Foo>.
Uno de los mayors beneficios del polimorfismo es que podemos declarar el parámetro
de un método como de un tipo en particular y, en tiempo de ejecución, hacer que este
parámetro referencie a cualquiera de sus subtipos.
Si ahora requerimos atender a un conjunto variado de animals diversos, los cuales son
recibidos como un arreglo de objetos de la clase Animal[], podríamos tener un código
similar al siguiente:
import java.util.*;
abstract class Animal {
public abstract void checkup();
}
class Dog extends Animal {
public void checkup() { // implement Dog-specific
code System.out.println("Dog checkup");
}
}
El ejemplo anterior trabaja correctamente; sin embargo, debemos tener presente que
este enfoque no es válido si trabajamos con collections bajo el esquema de manera
segura (type safe collections).
Como podemos observar, el ejemplo anterior, evidencia las diferencias entre el uso de
arreglos de un tipo específico versus collections de un tipo específico.
Obtendremos:
AnimalDoctorGeneric.Java:51: checkAnimals(Java.util.
ArrayList<Animal>) in AnimalDoctorGeneric cannot be applied to
(java.util.List<Dog>)
doc.checkAnimals(dogs);
^
AnimalDoctorGeneric.Java: 52: checkAnimals(java.util.
ArrayList<Animal>) in AnimalDoctorGeneric cannot be applied to
(java.util.List<Cat>)
doc.checkAnimals(cats);
^
AnimalDoctorGeneric.Java:53: checkAnimals(java.util.
ArrayList<Animal>) in AnimalDoctorGeneric cannot be applied to
(java.util.List<Bird>)
doc.checkAnimals(birds);
^
3 errors
Ante esta situación ¿Cuál podría ser una salida válida utilizando objetos genéricos?
El código anterior es válido tanto para arreglos como para collections genéricos,
podemos agregar una instancia de un subtipo en un arreglo o colección declarados con
un supertipo.
importante:
por:
El decir <? extends Animal>, nos permite indicar al compilador que podremos asignar
un collection que sea un subtipo de List y de tipo <Animal> o cualquier otro tipo que
herede de Animal.
so on.
El uso de “E”, es solo una convención. Cualquier identificador válido en Java funcionará
adecuadamente. Se escogió E porque se puede interpretar como “Elemento”. La otra
convención básica es el uso de T (que signfica Type), utilizada para tipos que no son
collections.
Ejercicios de aplicación:
import java.util.*;
class Test {
public static void main(String[] args) {
// insert code here
x.add("one");
x.add("two");
x. add ("TWO");
System.out.printIn(x.poll());
}
}
e) Compilation fails.
import java.util..*;
class MapEQ {
public static void main(String[] args) {
Map<ToDos, String> m = new HashMap<ToDos, String>();
ToDos tl = new ToDos("Monday");
ToDos t2 = new ToDos("Monday");
ToDos t3 = new ToDos("Tuesday");
m.put(tl, "doLaundry");
m.put(t2, "payBills");
m.put(t3, "cleanAttic");
System.out.printIn(m.size());
}
}
class ToDos{
String day;
ToDos(String d) { day = d; }
public boolean equals(Object o) {
return ((ToDos)o).day == this.day;
}
// public int hashCode() ( return 9; }
}
Resumen
1 Dentro del contexto de las colecciones, las asignaciones que usan polimorfismo son
válidas para el tipo base, no para el tipo específico del Collection. Será válido decir:
Será inválido:
4 Cuando usamos una definición del tipo: List<? extends Dog>, la colección puede
ser accesada pero no modificada por la aplicación.
Si desea saber más acerca de estos temas, puede consultar las siguientes páginas.
http://javabasico.osmosislatina.com/curso/polimorfismo.htm
Aquí hallará un interesante artículo sobre el uso de polimorfismo y arreglos en
java.
http://java.sun.com/j2se/1.5.0/docs/guide/language/generics.html
En esta página, hallará información oficial y detallada sobre el uso de genéricos
en java.