Komplett liste over JDBC-datatyper

I tillegg til datatypene du kjenner, lar JDBC deg jobbe med mange native datatyper for DBMS. Nedenfor vil jeg liste opp typene og funksjonene for å få dem:

Type Metode
array getArray()
AsciiStream getAsciiStream()
BigDesimal getBigDecimal()
BinaryStream getBinaryStream()
blob getBlob()
boolsk getBoolean()
blob getBlob()
boolsk getBoolean()
bytes getByte()
bytes getBytes()
CharacterStream getCharacterStream()
Clob getClob()
Dato getDate()
Dobbelt getDouble()
flyte getFloat()
int getInt()
Lang getLong()
NCharacterStream getNCaracterStream()
Gjenstand getObject()
Ref getRef()
RowId getRowId()
Kort getShort()
SQLXML getSQLXML()
String getString()
Tid getTime()
Tidsstempel getTimestamp()
UnicodeStream getUnicodeStream()
URL getURL()

Vi har allerede vurdert primitive typer. La oss nå prøve å jobbe med objekter.

BLOB-datatype

Hvis du vil lagre et objekt i databasen, er den enkleste måten å gjøre dette på å bruke SQL BLOB-typen. JDBC har sitt motstykke kalt Blob.

BLOB står for Binary L arge Object . Den brukes til å lagre en rekke byte. Blob-typen i JDBC er et grensesnitt, og du kan sette (og motta) data i det på to måter:

  • Bruker InputStream
  • Bruke en rekke byte

Eksempel: kolonne nummer 3 inneholder BLOB-typen:

Statement statement = connection.createStatement();
    ResultSet results = statement.executeQuery("SELECT * FROM user");
    results.first();

    Blob blob = results.getBlob(3);
    InputStream is = blob.getBinaryStream();

For å lage ditt eget Blob-objekt, må du bruke createBlob()- funksjonen . Eksempel:

String insertQuery = “INSERT INTO images(name, image) VALUES (?, ?);
PreparedStatement statement = connection.prepareStatement(insertQuery);

// Create a Blob object and get an OtputStream from it to write data to it
Blob blob = connection.createBlob();

// Populate the Blob with data...
OutputStream os = blob.setBinaryStream(1);

// Passing Blob as query parameter
statement.setBlob(2, blob);
statement.execute();

Det er to måter å fylle en Blob med data. Den første er via OutputSteam :

Path avatar = Paths.get("E:\\images\\cat.jpg");
OutputStream os = blob.setBinaryStream(1);
Files.copy(avatar, os);

Og den andre - gjennom å fylle med bytes:

Path avatar = Paths.get("E:\\images\\cat.jpg");
byte[] content = Files.readAllBytes(avatar);
blob.setBytes(1, content);

Lagre et Java-objekt i en database

Vi har lært hvordan du lagrer binære objekter i databasen: byte-matriser, byte-strømmer og så videre. Hva med Java-objekter? Hvordan lagrer vi et Java-objekt i en database?

La oss si at vi har en Employee Java-klasse som beskriver en ansatt i et selskap:

public class Employee {
    public Integer id;
    public String name;
    public String occupation;
    public Integer salary;
    public Date joinDate;
}

Hvordan kan vi lagre et objekt av denne klassen til databasen ved å bruke JDBC?

Faktisk vet du allerede alt du trenger å vite. Først må du lage en tabell i databasen som tilsvarer denne klassen. For eksempel denne:

CREATE TABLE employee {
    id INT PRIMARY KEY NOT NULL,
    name VARCHAR(100),
    occupation VARCHAR(100),
    salary INT,
    join_date DATE
}

Og la oss nå skrive koden som vil legge til et objekt fra vår Employee- klasse til basen:

public static boolean addEmployee(Connection connection, Employee employee) throws Exception {
    	// Create and prepare a query to insert data into the table
    	String insertQuery = "INSERT INTO employee(name, occupation, salary, join_date ) VALUES (?, ?, ?, ?)";
    	PreparedStatement statement = connection.prepareStatement(insertQuery);

    	// Populate the query with data from the Employee object
    	statement.setString(1, employee.name);
    	statement.setString(2, employee.occupation);
    	statement.setInt(3, employee.salary);
    	statement.setDate(4, employee.joinDate);

    	// Execute our query and it returns true if a new row has been added
    	int count = statement.executeUpdate();
    	return count > 0;
    }

Enkelt og oversiktlig. Metoden vil fungere utmerket.

Lese et Java-objekt fra en database

Vi lærte hvordan man skriver et objekt til databasen, la oss nå skrive koden for å lese objektet fra databasen. La oss starte med koden som leser et objekt fra databasen ved sin ID:

public static Employee getEployeeById(Connection connection, int id) throws Exception {
    	// Create and prepare a query to get an employee from the table
    	PreparedStatement statement = connection.prepareStatement("SELECT * FROM employee WHERE id = ?");
    	statement.setInt(1, id);

    	// Execute our query and it returns null if there are no rows in the query result
    	ResultSet results = statement.executeQuery();
    	if (!results.first())
        	return null;

    	// Populate the Employee object with the data from the ResultSet
    	Employee employee = new Employee();
    	employee.id = results.getInt(1);
    	employee.name = results.getString(2);
    	employee.occupation = results.getString(3);
    	employee.salary = results.getInt(4);
    	employee.joinDate = results.getDate(5);
    	return employee;
}

Og hvis vi ikke trenger ett objekt, men flere? En slik forespørsel er også lett å skrive. La oss få alle ansatte i selskapet vårt:

public static List<Employee> getAllEployees(Connection connection) throws Exception {
	// Create and execute a query to get employees from the table
	Statement statement = connection.createStatement();
	ResultSet results = statement.executeQuery("SELECT * FROM employee");

	ArrayList<Employee> list = new ArrayList<Employee>();
	while (results.next()) {
        // Populate the Employee object with the data from the current row of the ResultSet
	        Employee employee = new Employee();
	        employee.id = results.getInt(1);
	        employee.name = results.getString(2);
	        employee.occupation = results.getString(3);
	        employee.salary = results.getInt(4);
	        employee.joinDate = results.getDate(5);

	        list.add(employee);
	}
	return list;
}

Forresten, hvis det er mange slike metoder, må du i hver av dem skrive den samme koden for å konvertere ResultSet- strengen til et objektansatt. Så denne koden kan flyttes til en egen metode.

Dette kan være spesielt nyttig hvis Employee -klassen inneholder komplekse felt som Enum, InputStream eller referanser til andre objekter som vi også ønsker å lagre i databasen.