Felhasználói eszközök

Eszközök a webhelyen


oktatas:programozas:java:java_adatbazis:mysql:peldak

< MySQL

Java MySQL - JDBC illesztő

  • Szerző: Sallai András
  • Copyright © 2011, Sallai András
  • Szerkesztve: 2011, 2014, 2015, 2018, 2022
  • Licenc: CC BY-SA 4.0

JDBC használata a Java nyelvben

A JDBC használata során célszerű írni néhány metódust:

  • kapcsolatteremtés
  • kapcsolat lezárása
  • lekérdezés

Az alábbiakban erre látunk példát, majd azok felhasználására a main() metódusban. Nagyobb programok esetén természetesen külön osztályt szokás létrehozni.

Program01.java
import java.sql.*;
 
class Mysql {
	String host = "localhost";
	String port = "3306";
	String db = "sargazrt";
	String user = "sargazrt";
	String pass = "titok";
	public Connection connect() {
		Connection conn = null;
		try {
			conn = tryConnect();
		}catch(SQLException ex) {
			System.err.println("Hiba az adatbázishoz kapcsolódás során!");
		}
		return conn;
	}
	public Connection tryConnect() throws SQLException {
		Connection conn = null;
		String url = "jdbc:mysql://" + host + ":" + port + "/"+ db;
		conn = DriverManager.getConnection(url, user, pass);
		return conn;
	}
	public void close(Connection conn) {
		try {
			tryClose(conn);
		}catch(SQLException ex) {
			System.err.println("Hiba az adatbázis bezárása során!");
		}
	}
	public void tryClose(Connection conn) throws SQLException {
		conn.close();
	}
	public ResultSet query(Connection conn, String sql) {
		ResultSet rs = null;
		try {
			rs = tryQuery(conn, sql);
		}catch(SQLException ex) {
			System.err.println("Hiba a lekérdezés során");
		}
		return rs;
	}
	public ResultSet tryQuery(Connection conn, String sql) throws SQLException {
		ResultSet rs = null;		
		Statement stmt = conn.createStatement();		
		return stmt.executeQuery(sql);
	}
}
 
 
class Program01 {
	public static void main(String[] args) {
		System.out.println("MySQL kapcsolódás...");
		Mysql mysql = new Mysql();
		Connection conn = mysql.connect();
		String sql = "select * from Dolgozok";
		ResultSet rs = mysql.query(conn, sql);		
 
		try {
			while(rs.next()) {
				System.out.printf("%s %s\n", 
					rs.getString("nev"),
					rs.getString("telepules")
				);				
			}
		}catch(SQLException ex) { 
			System.err.println("Hiba az adatok kinyerése során!");
		}
		mysql.close(conn);
	}
}

A Makefile segít megérteni, milyen parancssori parancsokkal fordíthatjuk, futtathatjuk a JDBC-t használó programunk.

Makefile
SOURCES=Program01.java
 
all:
	javac $(SOURCES)
runl:
	xterm -e "java -cp .:/usr/share/java/mysql.jar Program01 & read"
 
runw:
	cmd /c "java -cp .:c:\javalibs\mysql-connector-java-verzioszam.jar Program01 && pause"

A következő példák futtató batch-fájl és futtató-script írását szemlélteti:

startProgram01.cmd
java -classpath ".;mysql-connector-java-5.1.24-bin.jar" Program01
startProgram01.sh
java -classpath ".:mysql-connector-java-5.1.24-bin.jar" Program01

Vegyük észre, a -classpath paraméterében (;) pontosvesszőt használtam. Linux esetén ezt le kell cserélni (:) kettőspontra. A verziószámot ki kell cserélni az aktuálisra. Megadhatunk abszolút útvonalat is, mint azt a Makefile-ban tettük.

Beállításfájl használata

Az adatbázis jellemzőinek leírására, használhatunk beállításfájlokat is. Ez biztosítja a program hordozhatóságát adatbázisok között. Ha nem használunk beállításfájlokat, az adatbázis jellemzők be vannak építve a programba, fixen.

A beállítófájl egy .properties kiterjesztésű állomány lehet, amelyekben a tulajdonság, értékpárok az ini fájlokban használt mintát követi. A következőkben egy ilyen állományt látunk:

Program01.properties
host=localhost
port=3306
database=sargazrt
user=sargazrt
pass=titok

A program, amelyben felhasználjuk a beállításállományt:

Program01.java
import java.sql.*;
import java.util.ResourceBundle;
 
class Mysql {
	String host;
	String port;
	String database;
	String user;
	String pass;
	Mysql() {
		ResourceBundle rb = ResourceBundle.getBundle("Program01");
		this.host = rb.getString("host");
		this.port = rb.getString("port");
		this.database = rb.getString("database");
		this.user = rb.getString("user");
		this.pass = rb.getString("pass");
	}
	public Connection connect() {
		Connection conn = null;
		try {
			conn = tryConnect();
		}catch(SQLException ex) {
			System.err.println("Hiba az adatbázishoz kapcsolódás során!");
		}
		return conn;
	}
	public Connection tryConnect() throws SQLException {
		Connection conn = null;
		String url = "jdbc:mysql://" + host + ":" + port + "/"+ database;
		conn = DriverManager.getConnection(url, user, pass);
		return conn;
	}
	public void close(Connection conn) {
		try {
			tryClose(conn);
		}catch(SQLException ex) {
			System.err.println("Hiba az adatbázis bezárása során!");
		}
	}
	public void tryClose(Connection conn) throws SQLException {
		conn.close();
	}
	public ResultSet query(Connection conn, String sql) {
		ResultSet rs = null;
		try {
			rs = tryQuery(conn, sql);
		}catch(SQLException ex) {
			System.err.println("Hiba a lekérdezés során");
		}
		return rs;
	}
	public ResultSet tryQuery(Connection conn, String sql) throws SQLException {
		ResultSet rs = null;		
		Statement stmt = conn.createStatement();		
		return stmt.executeQuery(sql);
	}
}
 
class Program01 {
	public static void main(String[] args) {
		System.out.println("MySQL kapcsolódás...");
		Mysql mysql = new Mysql();
		Connection conn = mysql.connect();
		String sql = "select * from Dolgozok";
		ResultSet rs = mysql.query(conn, sql);		
 
		try {
			while(rs.next()) {
				System.out.printf("%s %s\n", 
					rs.getString("nev"),
					rs.getString("telepules"));				
			}
		}catch(SQLException ex) { 
			System.err.println("Hiba az adatok kinyerése során!");
		}
		mysql.close(conn);
	}
}

Segédállományok a fordításhoz:

Makefile
SOURCES=Program01.java
 
all:
	javac $(SOURCES)
 
runl:
	xterm -e "java -cp .:/usr/share/java/mysql.jar Program01 & read"
 
runw:
	cmd /c "java -cp .:c:\javalibs\mysql-connector-java-verzioszam.jar Program01 && pause"

PreparedStatement SQL utasítása

PreparedStatement használata esetén, ha naplózni szeretnénk a használt SQL utasítást, akkor gondba kerülhetünk. A PreparedStatement lényege, pont az, hogy megváltoztatjuk az SQL lekérdező karaktersorozatot. Ez után visszanyerni PreparedStatement objektumból a használt SQL parancsot a toString() metódussal ilyen formán lehetséges:

public void beszur(Connection con, String sql) {
    try {
        tryBeszur(con, sql);
    }catch(SQLException ex) {
        System.err.println("Hiba az SQL lekérdezés során!");
    }
}
public void tryBeszur(Connection con, String sql) 
            throws SQLException {
    PreparedStatement ps = con.prepareStatement(sql);
    ps.setString(1, "Bereg József");
    ps.setString(2, "Szolnok");      
    System.out.println(ps.toString());
    ps.executeUpdate();
}

Ha meghívjuk a metódust, az eredmény ehhez hasonló lesz:

com.mysql.jdbc.JDBC4PreparedStatement@143d2a58: insert into szemelyek (nev, telepules) values ('Bereg József', 'Szolnok')

Meghajtó ellenőrzése

Célszerű programból ellenőrizni a JDBC meghajtó használhatóságát. Ezt egy erre a célra létrehozott checkMysqlDriver() metódus mutat példát:

    public void checkMysqlDriver() {
        try {
            tryCheckMysqlDriver();
        }catch(ClassNotFoundException ex) {
            System.err.println("Az osztály nem található!");
        }catch(InstantiationException ex) {
            System.err.println("Hiba a példányosítás során!");
        }catch(IllegalAccessException ex) {
            System.err.println("Hozáférésre nem jogosult!");
        }
    }
 
    public void tryCheckMysqlDriver() 
            throws ClassNotFoundException, InstantiationException,
            IllegalAccessException {
        Class.forName("org.gjt.mm.mysql.Driver").newInstance();
    }

GUI

Táblázatmodellé alakítás

A Java Swing GUI felületei egyik táblázatok adatait használni képes osztálya a TableModel. A példában a visszakapott eredményt egy TableModel objektumban helyezzük el:

public TableModel resultSetToTableModel(ResultSet rs) {
        TableModel model = null;
        try {
            model = tryResultSetToTableModel(rs);
        }catch(SQLException ex) {
            System.err.println("Hiba a metadadatok lekérése során!");
        }
        return model;
}
public TableModel tryResultSetToTableModel(ResultSet rs)
            throws SQLException {
        ResultSetMetaData metaData = rs.getMetaData();
        int numberOfColumns = metaData.getColumnCount();
        ArrayList<String> columnNames = new ArrayList<String>();        
        for(int i=0; i< numberOfColumns; i++) {
            columnNames.add(metaData.getColumnLabel(i+1));
        }       
 
        ArrayList<Object> rows = new ArrayList<Object>();
        while(rs.next()) {
            ArrayList<Object> row = new ArrayList<Object>();            
            for(int i=1; i<= numberOfColumns; i++) {
                row.add(rs.getObject(i));
            }            
            rows.add(row);
        }
        Object[] columnNamesArray = columnNames.toArray();        
 
        Object[][] tableContent = new Object[rows.size()][numberOfColumns];
        for(int i=0; i<rows.size(); i++) {
            tableContent[i] = ((ArrayList<Object>)rows.get(i)).toArray();
        }        
        return new DefaultTableModel(tableContent, columnNamesArray);        
}

Függelék

Mysql.java

Mysql.java
package adatbazis;
 
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
 
public class Mysql {
 
    String host;
    String port;
    String database;
    String user;
    String pass;
 
    Mysql() {
        initProperties();
    }
 
    public void initProperties() {
        try {
            tryInitProperties();
        } catch (FileNotFoundException ex) {
            System.err.println("A fájl nem található!");
        } catch (IOException ex) {
            System.err.println("Hiba az olvasás során!");
        }
    }
 
    public void tryInitProperties()
            throws FileNotFoundException, IOException {
        Properties pro = new Properties();
        InputStream fis = new FileInputStream("adatbazisswing.properties");
        pro.load(fis);
 
        this.host = pro.getProperty("host");
        this.port = pro.getProperty("port");
        this.database = pro.getProperty("database");
        this.user = pro.getProperty("user");
        this.pass = pro.getProperty("pass");
 
    }
 
    public void checkMysqlDriver() {
        try {
            tryCheckMysqlDriver();
        }catch(ClassNotFoundException ex) {
            System.err.println("Az osztály nem található!");
        }catch(InstantiationException ex) {
            System.err.println("Hiba a példányosítás során!");
        }catch(IllegalAccessException ex) {
            System.err.println("Hozáférésre nem jogosult!");
        }
    }
 
    public void tryCheckMysqlDriver() 
            throws ClassNotFoundException, InstantiationException,
            IllegalAccessException {
        Class.forName("org.gjt.mm.mysql.Driver").newInstance();
    }
    public Connection connect() {
        Connection conn = null;
        try {
            conn = tryConnect();
        } catch (SQLException ex) {
            System.err.println("Hiba az adatbázishoz kapcsolódás során!");
        }
        return conn;
    }
 
    public Connection tryConnect() throws SQLException {
        checkMysqlDriver();
        String url = "jdbc:mysql://" + host + ":" + port + "/" + database;
        System.out.println(url + " " + user + " " + pass);
        Connection conn = DriverManager.getConnection(url, user, pass);
        //DriverManager.setLogWriter(new PrintWriter(System.err));
        return conn;
    }
 
    public void close(Connection conn) {
        try {
            tryClose(conn);
        } catch (SQLException ex) {
            System.err.println("Hiba az adatbázis bezárása során!");
        }
    }
 
    public void tryClose(Connection conn) throws SQLException {
        conn.close();
    }
 
    public ResultSet query(Connection conn, String sql) {
        ResultSet rs = null;
        try {
            rs = tryQuery(conn, sql);
        } catch (SQLException ex) {
            System.err.println("Hiba a lekérdezés során");
        }
        return rs;
    }
 
    public ResultSet tryQuery(Connection conn, String sql) throws SQLException {        
        Statement stmt = conn.createStatement();
        return stmt.executeQuery(sql);
    }
 
    public void beszur(Connection con, String sql) {
        try {
            tryBeszur(con, sql);
        } catch (SQLException ex) {
            System.err.println("Hiba az SQL végrehajtása során!");
        }
    }
 
    public void tryBeszur(Connection con, String sql)
            throws SQLException {
        PreparedStatement ps = con.prepareStatement(sql);
        ps.setString(1, "Bereg József");
        ps.setString(2, "Szolnok");
 
        System.out.println(ps.toString());
        ps.executeUpdate();
 
    }
}

Irodalom, források

Könyv

  • George Reese, Randy Jay Yarger, Tim King:
    • A MySQL kezelése és használata
    • O'REILLY

MySQL

MariaDB

SQLite

MSSQL

oktatas/programozas/java/java_adatbazis/mysql/peldak.txt · Utolsó módosítás: 2023/08/03 19:37 szerkesztette: admin