Om gebruiksvriendelijk met databases aan de slag te kunnen gaan met Java werd JDBC ontwikkeld. JDBC onderhoudt de Java-kant van een connectie met een DBMS. Bij connectie met een ODBC-database kan je gebruik maken van de interne brugmogelijkheden jdbc:odbc.
Driver laden
Om een connectie te maken met een ODBC-gegevensbron zal je de JDBC-ODBC brugdriver moeten laden. Dit kan als volgt:
Je bent hier verplicht een exception te onderscheppen: wanneer de driverklasse niet kan worden geïnitialiseerd wordt een ClassNotFoundException opgeworpen.
Connectie maken
Om een connectie te maken heb je een Connection-object nodig. Dit object bevat de verbindingsgegevens:
ODBC-naam van de database of pad naar de database (voor bvb. Access)
gebruikersnaam
paswoord
Connection con = DriverManager.getConnection(url,
"loginnaam", "paswoord");
Een SQLException moet worden opvangen.
url is hierbij een stringvariabele die een zogenaamde connectiestring bevat.
Wanneer je een ODBC verbindingsnaam hebt aangemaakt is die heel eenvoudig:
String url = "jdbc:odbc:odbcnaam"
Gebruik je een MS Access database dan kan je met een juiste connectiestring vermijden dat een ODBC-gegevensbron moet worden aangemaakt. Je kan met opgave van de driver voor Access en het exacte pad naar het .mdb-bestand onmiddellijk aan de slag:
MS Access leent zich tot het maken van lokale kleinere applicaties. Heb je een netwerk / client-server databasesysteem nodig, dan kan je bvb. opteren voor MS SQL Server, of natuurlijk tal van andere voortreffelijke systemen.
Ik geef eerste een aantal voorbeelden van databasewerking: data lezen en data manipuleren waarbij met een Access-database wordt gewerkt, verderop wordt getoond hoe je met SQL Server 2000 kan verbinden. Andere databasesystemen kennen een analoge verbindingsmogelijkheid.
Data uitlezen
Statement en ResultSet
Om SQL-instructies op een database te kunnen uitvoeren maak je gebruik van een Statement. Een Statement maak je met de methode createStatement van een Connection-object.
Statement s = con.createStatement();
Een SQLException moet worden opvangen.
Met de methode createStatement kan je argumenten meegeven:
resultSetType: geeft weer hoe je de resultaatset kan doorlopen, en of veranderingen worden weergegeven.
ResultSet.TYPE_SCROLL_INSENSITIVE: vooruit en achteruit doorlopen van de ResultSet, weerspiegelt geen veranderingen.
ResultSet.TYPE_SCROLL_SENSITIVE: vooruit en achteruit doorlopen van de ResultSet, weerspiegelt veranderingen.
resultSetConcurrency: stelt in of de databasegegevens enkel kunnen gelezen of ook kunnen veranderd worden met JDBC-methoden.
ResultSet.CONCUR_READ_ONLY: enkel lezen van gegevens (standaard)
ResultSet.CONCUR_UPDATABLE: aanpassingen in de ResultSet zijn mogelijk
Een Statement wordt uitgevoerd op de database via een execute-methode. Dergelijke methoden zijn:
execute: algemene methode, kan verschillende resultaten opleveren
executeQuery: voert een SQL-statement, retourneert één resultaatset. (SELECT)
executeUpdate: voert een SQL-statement uit dat niets retourneert zoals INSERT, UPDATE, DELETE, DROP, CREATE,...
Wens je dus gegevens te lezen uit een database, dan ontvang je die in een ResultSet-object:
ResultSet rs = s.executeQuery("select * from klant");
De ResultSet raadplegen
Wanneer je een ResultSet hebt gevuld dan kan je de methode next gebruiken om naar een volgende record te stappen. Wanneer de ResultSet pas geladen is staat de cursor gepositioneerd voor de eerste record.
Er zijn een aantal getXXX-methodes voorhanden om gegevens uit een tabel te lezen. Meestal zal je voldoende hebben aan de methode getString. Wens je echter zonder verdere typecasting met numerieke waarden kunnen rekenen dan zal je getByte, getShort, getInt, getLong, getFloat, ... wel eens nogig hebben. Soms is het interessant de waarden gewoon als Object uit te lezen met getObject.
Deze methoden staan toe dat je de naam van het tabelveld meegeeft of een numerieke aanduiding van het veld in de tabel (te beginnen bij 1!).
while ( rs.next() ) {
System.out.println(rs.getString("naam"));
}
Voorbeeldtoepassing
De database shop.mdb:
Toepassing: klanten in een JCombobox
Toon /verberg
import java.net.*;
import java.sql.*;
public class F1 extends javax.swing.JFrame {
//verwijzing naar het pad van de database
final static String DBPAD = "E:/WWW/Cursusweb/Java/vb8/shop.mdb";
//wanneer de db in dezelfde map als de toepassing staat kan dit:
//final static URL DBurl = F1.class.getResource("shop.mdb");
//final static String DBPAD = DBurl.toString().substring(6);
final static String DB = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=" +DBPAD ;
//of met een ODBC-koppeling:
//final static String DB = "jdbc:odbc:shop";
public F1() {
initComponents();
haalKlantNamen();
}
public void haalKlantNamen(){
Connection con;
Statement s;
ResultSet rs = null;
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
} catch (ClassNotFoundException e) {
System.out.println("Error: " + e);
}
try {
con = DriverManager.getConnection( DB ,"","");
s = con.createStatement();
rs = s.executeQuery("select * from klant order by naam");
if (rs != null)
while ( rs.next() ) {
cb.addItem(rs.getString("Naam"));
}
s.close();
con.close();
} catch (SQLException e) {
System.out.println("Error: " + e);
}
}
private void initComponents() {
jPanel1 = new javax.swing.JPanel();
cb = new javax.swing.JComboBox();
setTitle("Werken met JDBC");
addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosing(java.awt.event.WindowEvent evt) {
exitForm(evt);
}
});
jPanel1.setPreferredSize(new java.awt.Dimension(200, 200));
jPanel1.add(cb);
getContentPane().add(jPanel1, java.awt.BorderLayout.CENTER);
pack();
}
private void exitForm(java.awt.event.WindowEvent evt) {
System.exit(0);
}
public static void main(String args[]) {
new F1().show();
}
// Variables declaration - do not modify
private javax.swing.JComboBox cb;
private javax.swing.JPanel jPanel1;
// End of variables declaration
}
Toepassing: tabel vullen met een aangepast TableModel
Maak een klasse TM die een overerft van AbstractTableModel.
Deze klasse ontvangt in de constructor de naam van de tabel die moet worden geladen.
De data en kolomkoppen voor de JTable die het model TM gebruikt worden op deze manier vanuit de klasse TM geladen
Voor het vastleggen van de connectiestring maak je een interfaceDBcon aan. Deze interface implementeer je dan in de klasse TM.
Weergave tabel categorie:
Weergave tabel klant:
Toon /verberg
public interface DBcon {
final String DBPAD = "E:/WWW/Cursusweb/Java/vb8/shop.mdb";
final String DB = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=" +DBPAD ;
}
import java.sql.*;
import javax.swing.table.*;
class TM extends AbstractTableModel implements DBcon {
public Object[][] data;
String[] kolomkoppen;
public TM(String tabel){
data = haalData(tabel);
}
public Object[][] haalData(String tabel){
Object mijnArray[][] = null;
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection con = DriverManager.getConnection( DB ,"","");
Statement s = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
s.execute("SELECT * FROM " +tabel);
ResultSet rs = s.getResultSet();
rs.last();
int arij = rs.getRow();
rs.beforeFirst();
ResultSetMetaData RSMD=rs.getMetaData();
int akol =RSMD.getColumnCount();
String[] kolnamen =new String[akol];
for(int i=0;i<akol;i++){
kolnamen[i]=RSMD.getColumnName(i+1);
}
kolomkoppen = kolnamen;
mijnArray = new Object[arij][akol];
int R=0;
while(rs.next()) {
for(int C=1; C<=akol;C++){
//arrays 0-gebaseerd, Resultsets vanaf kolom nr.1
mijnArray[R][C-1]=rs.getObject(C);
}
R++;
}
rs.close();
con.close();
} catch (Exception e) {
System.out.println("Error: " + e);
}
return mijnArray;
}
public int getColumnCount() {
return kolomkoppen.length;
}
public int getRowCount() {
return data.length;
}
public String getColumnName(int col) {
return kolomkoppen[col];
}
public Object getValueAt(int row, int col) {
return data[row][col];
}
/* * wordt gebruikt voor een default renderer voor een cell
* hierdoor worden bv de booleans weergegeven door aankruisvakjes */
public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
}
// data is editeerbaar
public boolean isCellEditable(int row, int col) {
return true;
}
// data kan worden aangepast
public void setValueAt(Object value, int row, int col) {
data[row][col] = value;
fireTableCellUpdated(row, col);
}
}
import javax.swing.*;
public class F2 extends javax.swing.JFrame {
public F2() {
initComponents();
}
private void initComponents() {
jPanel1 = new javax.swing.JPanel();
jScrollPane1 = new javax.swing.JScrollPane();
jTable1 = new JTable(tmcat);
setTitle("JDBC");
addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosing(java.awt.event.WindowEvent evt) {
exitForm(evt);
}
});
jPanel1.setBorder(new javax.swing.border.TitledBorder("Categorie\u00ebn"));
jScrollPane1.setPreferredSize(new java.awt.Dimension(200, 100));
jScrollPane1.setViewportView(jTable1);
jPanel1.add(jScrollPane1);
getContentPane().add(jPanel1, java.awt.BorderLayout.NORTH);
pack();
}
private void exitForm(java.awt.event.WindowEvent evt) {
System.exit(0);
}
public static void main(String args[]) {
new F2().show();
}
// Variables declaration - do not modify
private javax.swing.JPanel jPanel1;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JTable jTable1;
// End of variables declaration
private TM tmcat = new TM("categorie");
}
Toepassing: tabel laden met gebruik van een eigen TableModel gebaseerd op DefaultTableModel, modularisatie van de code.
In deze toepassing wordt de databasetoegang gescheiden van het tabelmodel.
We baseren ons voor het tabelmodel deze keer niet op AbstractTableModel maar op DefaultTableModel, hierdoor zijn veel methoden voor het tabelmodel reeds voor ons beschikbaar. We zorgen er wel voor dat de opmaak binnen de tabel afhangt van het type waarde in de kolom.
We zorgen ervoor dat de eerste kolom uit de databasetabel niet wordt getoond, we verwachten hierin de id-waarden.
Toon /verberg
public interface DBcon {
final String DBPAD = "E:/WWW/Cursusweb/Java/vb8/shop.mdb";
final String DB = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=" +DBPAD ;
}
import java.util.*;
import javax.swing.table.*;
class MijnTableModel extends DefaultTableModel {
public MijnTableModel(Object[][] data,String[] kolomkoppen) {
super (data, kolomkoppen) ;
}
public Class getColumnClass (int kol) {
return getValueAt (0, kol).getClass () ;
}
}
import java.sql.*;
public class Conn implements DBcon{
private String tabel;
private Object[][] data;
private String[] kolomkoppen;
private Connection con;
public Conn(String tabel) {
this.tabel = tabel;
this.laadDriver();
this.vulData();
}
public void laadDriver(){
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
} catch (ClassNotFoundException e) {
System.out.println("Error: " + e);
}
}
public void vulData(){
Object mijnArray[][]= null;
openCon();
try {
Statement s = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
s.execute("SELECT * FROM " +tabel);
ResultSet rs = s.getResultSet();
rs.last();
int arij = rs.getRow();
rs.beforeFirst();
ResultSetMetaData RSMD=rs.getMetaData();
int akol =RSMD.getColumnCount();
String[] kolnamen =new String[akol];
for(int i=0;i<akol;i++){
kolnamen[i]=RSMD.getColumnName(i+1);
}
kolomkoppen = kolnamen;
mijnArray = new Object[arij][akol];
int R=0;
while(rs.next()) {
for(int C=1; C<=akol;C++){
//arrays 0-gebaseerd, Resultsets vanaf kolom nr.1
mijnArray[R][C-1]=rs.getObject(C);
}
R++;
}
rs.close();
data = mijnArray;
} catch (Exception e) {
System.out.println("Error: " + e);
}
sluitCon();
}
public void openCon(){
try{
con = DriverManager.getConnection( DB ,"","");
} catch(SQLException e) {}
}
public void sluitCon(){
try{
con.close();
} catch(SQLException e) {}
}
public java.lang.String getTabel() {
return tabel;
}
public java.lang.String[] getKolomkoppen() {
return this.kolomkoppen;
}
public java.lang.Object[][] getData() {
return this.data;
}
}
import java.awt.*;
import javax.swing.*;
public class FTabel extends javax.swing.JFrame {
Conn conn1 = new Conn("categorie");
public FTabel() {
initComponents();
}
private void initComponents() {
jPanel1 = new javax.swing.JPanel();
jScrollPane1 = new javax.swing.JScrollPane();
tblCat = new JTable(tmcat);
addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosing(java.awt.event.WindowEvent evt) {
exitForm(evt);
}
});
jPanel1.setLayout(new javax.swing.BoxLayout(jPanel1, javax.swing.BoxLayout.Y_AXIS));
jPanel1.setBorder(new javax.swing.border.CompoundBorder(new javax.swing.border.TitledBorder("Tabelinhoud"), new javax.swing.border.EmptyBorder(new java.awt.Insets(10, 10, 10, 10))));
jPanel1.add(Box.createRigidArea(new Dimension(0,10)));
jScrollPane1.setAlignmentX(0.0F);
jScrollPane1.setPreferredSize(new java.awt.Dimension(200, 100));
/* eerste kolom verbergen
* geplaatst in post-init van tblCat */
tblCat.removeColumn(tblCat.getColumn(tblCat.getColumnName(0)));
jScrollPane1.setViewportView(tblCat);
jPanel1.add(jScrollPane1);
getContentPane().add(jPanel1, java.awt.BorderLayout.CENTER);
pack();
}
private void exitForm(java.awt.event.WindowEvent evt) {
System.exit(0);
}
public static void main(String args[]) {
new FTabel().show();
}
// Variables declaration - do not modify
private javax.swing.JPanel jPanel1;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JTable tblCat;
// End of variables declaration
private MijnTableModel tmcat = new MijnTableModel(conn1.getData(),conn1.getKolomkoppen());
}
Data manipuleren
Dit onderdeel leert je hoe je data kan bewerken, toevoegen en verwijderen in een database.
Wanneer je de theorie omtrent het lezen van gegevens hebt doorgenomen, dan zal je merken dat het manipuleren van databasegegevens op een analoge manier kan worden uitgevoerd.
Verbinden met een database
Het verbinden met een database werd hierboven reeds besproken. Je zorgt er eerst voor dat de juiste driver wordt geladen:
Daarna zorg je voor een Connection-object dat de juiste gegevens voor de database bevat.
String DBPAD = "E:/WWW/Cursusweb/Java/vb8/shop.mdb";
String DB = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=" +DBPAD ;
try{
Connection con = DriverManager.getConnection( DB ,"","");
} catch(SQLException e) {}
Gegevens manipuleren
Om gegevens in de database te manipuleren heb je een Statement object nodig. Het Statement heeft een methode executeUpdate waarmee je UPDATE, INSERT, DELETE en andere actie-queries kan uitvoeren.
Voorbeeld: bewerken van gegevens:
try{
s = con.createStatement();
s.executeUpdate("UPDATE categorie " +
" set categorie='test'" +
" where cat_id=1");
} catch (SQLException e){}
Hier werken we met de methode executeUpdate waarmee we een SQl-instructie meegeven. Je kan wanneer de juiste resultSetType en resultSetConcurrency is ingesteld ook gebruik maken van methoden van de ResultSet: updateRow, deleteRow, insertRow.
Voorbeeldtoepassing
In deze voorbeeldtoepassing leer je gegevens bewerken, toevoegen en verwijderen uit een database. Er wordt gewerkt met de methode executeUpdate van een Statement-object. We gebruiken dus telkens een aangpaste SQL-opdracht om de acties door te voeren.
Toon /verberg
public interface DBcon {
final String DBPAD = "E:/WWW/Cursusweb/Java/vb8/shop.mdb";
final String DB = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=" +DBPAD ;
}
java.sql.*;
public class ConnCat implements DBcon{
private Object[][] data;
private String[] kolomkoppen;
private Connection con;
public ConnCat() {
this.laadDriver();
this.vulData();
}
public void laadDriver(){
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
} catch (ClassNotFoundException e) {
System.out.println("Error: " + e);
}
}
public void vulData(){
Object mijnArray[][] = null;
openCon();
try {
Statement s = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
s.execute("SELECT cat_id, categorie FROM Categorie");
ResultSet rs = s.getResultSet();
rs.last();
int arij = rs.getRow();
rs.beforeFirst();
ResultSetMetaData RSMD=rs.getMetaData();
int akol =RSMD.getColumnCount();
String[] kolnamen =new String[akol];
for(int i=0;i<akol;i++){
kolnamen[i]=RSMD.getColumnName(i+1);
}
kolomkoppen = kolnamen;
mijnArray = new Object[arij][akol];
int R=0;
while(rs.next()) {
for(int C=1; C<=akol;C++){
mijnArray[R][C-1]=rs.getObject(C);
}
R++;
}
rs.close();
data = mijnArray;
} catch (Exception e) {
System.out.println("Error: " + e);
}
sluitCon();
}
public void bewerk(String id, String tekst){
Statement s;
openCon();
try{
s = con.createStatement();
s.executeUpdate("UPDATE categorie " +
" set categorie='" +tekst +"'" +
" where cat_id=" +id);
} catch (SQLException e){}
sluitCon();
}
public void nieuw(String id, String tekst){
Statement s;
openCon();
try{
s = con.createStatement();
s.executeUpdate("INSERT into categorie(cat_id,categorie" +
") values (" +id +"," +"'" +tekst +"')");
} catch (SQLException e){System.out.println(e.getMessage());}
sluitCon();
}
public void verwijder(String id){
Statement s;
openCon();
try{
s = con.createStatement();
s.executeUpdate("DELETE from categorie where cat_id = " +id);
} catch (SQLException e){System.out.println(e.getMessage());}
sluitCon();
}
public int nieuwId(){
Statement s;
ResultSet max;
int nieuwid = 1;
openCon();
try{
s = con.createStatement();
s.executeQuery("Select max(cat_id) from categorie");
max = s.getResultSet();
max.next();
nieuwid = max.getInt(1) + 1;
} catch (SQLException e){ System.out.println(e.getMessage());}
sluitCon();
return nieuwid;
}
public void openCon(){
try{
con = DriverManager.getConnection( DB ,"","");
} catch(SQLException e) {}
}
public void sluitCon(){
try{
con.close();
} catch(SQLException e) {}
}
public java.lang.String[] getKolomkoppen() {
return this.kolomkoppen;
}
public java.lang.Object[][] getData() {
return this.data;
}
}
import java.util.*;
import javax.swing.table.*;
class MijnTableModel extends DefaultTableModel {
public MijnTableModel(Object[][] data,String[] kolomkoppen) {
super (data, kolomkoppen) ;
}
public Class getColumnClass (int kol) {
return getValueAt (0, kol).getClass () ;
}
}
import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;
public class FTabel extends javax.swing.JFrame {
ConnCat conn1 = new ConnCat();
String verwijderid;
public FTabel() {
initComponents();
tmcat.addTableModelListener(new TableModelListener() {
public void tableChanged(TableModelEvent e){
if(e.getType()== e.DELETE) conn1.verwijder(verwijderid);
else {
int rij = e.getFirstRow();
System.out.println(rij);
String id = tmcat.getValueAt(rij, 0).toString();
String tekst = tmcat.getValueAt(rij, 1).toString();
if(e.getType()== e.UPDATE) conn1.bewerk(id,tekst);
if(e.getType()== e.INSERT) conn1.nieuw(id,tekst);
}
}
});
}
private void initComponents() {
jPanel1 = new javax.swing.JPanel();
jScrollPane1 = new javax.swing.JScrollPane();
tblCat = new JTable(tmcat);
jPanel2 = new javax.swing.JPanel();
cmbVerwijder = new javax.swing.JButton();
jPanel3 = new javax.swing.JPanel();
jLabel1 = new javax.swing.JLabel();
txtNieuw = new javax.swing.JTextField();
addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosing(java.awt.event.WindowEvent evt) {
exitForm(evt);
}
});
jPanel1.setLayout(new javax.swing.BoxLayout(jPanel1, javax.swing.BoxLayout.Y_AXIS));
jPanel1.setBorder(new javax.swing.border.CompoundBorder(new javax.swing.border.TitledBorder("Tabelinhoud"), new javax.swing.border.EmptyBorder(new java.awt.Insets(10, 10, 10, 10))));
jPanel1.add(Box.createRigidArea(new Dimension(0,10)));
jScrollPane1.setAlignmentX(0.0F);
jScrollPane1.setPreferredSize(new java.awt.Dimension(200, 100));
/* eerste kolom verbergen
* geplaatst in post-init van tblCat */
tblCat.removeColumn(tblCat.getColumn(tblCat.getColumnName(0)));
jScrollPane1.setViewportView(tblCat);
jPanel1.add(jScrollPane1);
getContentPane().add(jPanel1, java.awt.BorderLayout.NORTH);
jPanel2.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.LEFT));
jPanel2.setBorder(new javax.swing.border.TitledBorder("Verwijderen - Toevoegen"));
jPanel2.setAlignmentX(0.0F);
jPanel2.setDoubleBuffered(false);
cmbVerwijder.setText("Verwijder categorie");
cmbVerwijder.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
cmbVerwijderActionPerformed(evt);
}
});
jPanel2.add(cmbVerwijder);
jPanel3.setBorder(new javax.swing.border.TitledBorder("Toevoegen"));
jLabel1.setText("Nieuwe categorie:");
jPanel3.add(jLabel1);
txtNieuw.setPreferredSize(new java.awt.Dimension(100, 21));
txtNieuw.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
txtNieuwActionPerformed(evt);
}
});
jPanel3.add(txtNieuw);
jPanel2.add(jPanel3);
getContentPane().add(jPanel2, java.awt.BorderLayout.SOUTH);
pack();
}
private void cmbVerwijderActionPerformed(java.awt.event.ActionEvent evt) {
int rij = tblCat.getSelectedRow();
verwijderid = tmcat.getValueAt(rij, 0).toString();
tmcat.removeRow(rij);
}
private void txtNieuwActionPerformed(java.awt.event.ActionEvent evt) {
Object nieuwid = new Integer(conn1.nieuwId());
tmcat.addRow(new Object[] {nieuwid,txtNieuw.getText()});
}
private void exitForm(java.awt.event.WindowEvent evt) {
System.exit(0);
}
public static void main(String args[]) {
new FTabel().show();
}
// Variables declaration - do not modify
private javax.swing.JButton cmbVerwijder;
private javax.swing.JLabel jLabel1;
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel2;
private javax.swing.JPanel jPanel3;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JTable tblCat;
private javax.swing.JTextField txtNieuw;
// End of variables declaration
private MijnTableModel tmcat = new MijnTableModel(conn1.getData(),conn1.getKolomkoppen());
}
Verbinden met SQL-Server 2000
Driver installeren
Een Access-database is bruikbaar voor kleine lokale toepassingen, maar wanneer je wenst te gebruik te maken van een client-server database dan kan je beter naar een ander systeem overschakelen.
Access is een bestandsgebaseerd database-systeem, waardoor je op deze manier ook geen databasetoepassingen in java-Applets kan maken (je kan vanuit de Applet geen connectie opzetten met een mdb op een server).
Voor vele toepassingen is het dan ook een beter idee om gebruik te maken van een databasesysteem zoals SQL-Server, Oracle, MySQL, ...
Om verbinding te maken met SQL-Server download je eerst de JDBC driver voor SQL-server: surf naar www.microsoft.com/downloads en zoek op "sql java" of surf meteen naar de downloadsite voor SQL-Server 2000 JDBC driver Service pack 3. Voor Windows-besturingssystemen download je setup.exe en je voert het bestand uit.
Na het downloaden staan op de locatie "C:\Program Files\Microsoft SQL Server 2000 Driver for JDBC\lib" drie bestanden op je te wachten (eventueel zal je een andere stationsletter moeten gebruiken). Als je via de prompt de java bestanden compileert voeg je de drie .jar bestanden toe aan de systeemvariabele CLASSPATH. Met NetBeans IDE hoef je dit niet te doen: in het project rechtsklik je "FileSystems" en kies je mount > Archive files. Je voegt op deze manier de drie .jar - bestanden toe.
Driver laden
De driver voor SQL-server kan je nu als volgt laden: