basic implementation ++

basic implementation ++
This commit is contained in:
Amit Dixit 2016-03-29 16:36:00 +05:30
parent 35d6a54831
commit 28a5a43a47
9 changed files with 780 additions and 0 deletions

26
data-mapper/index.md Normal file
View File

@ -0,0 +1,26 @@
---
layout: pattern
title: Data Mapper
folder: data-mapper
permalink: /patterns/dm/
categories: Persistence Tier
tags:
- Java
- Difficulty-Beginner
---
## Intent
Object provides an abstract interface to some type of database or
other persistence mechanism.
![alt text](./etc/dm.png "Data Mapper")
## Applicability
Use the Data Mapper in any of the following situations
* when you want to consolidate how the data layer is accessed
* when you want to avoid writing multiple data retrieval/persistence layers
## Credits
* [Data Mapper](http://richard.jp.leguen.ca/tutoring/soen343-f2010/tutorials/implementing-data-mapper/)

93
data-mapper/pom.xml Normal file
View File

@ -0,0 +1,93 @@
<?xml version="1.0"?>
<!--
The MIT License
Copyright (c) 2014 Ilkka Seppälä
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
-->
<project
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.iluwatar</groupId>
<artifactId>java-design-patterns</artifactId>
<version>1.11.0-SNAPSHOT</version>
</parent>
<artifactId>data-mapper</artifactId>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</dependency>
</dependencies>
<build>
<!--
log4j.xml file will be copied both in ${project.build.outputDirectory}
and ${project.build.directory}. Thanks to Sean Patrick Floyd
(http://stackoverflow.com/questions/5637532/maven-how-to-place-resource-file-together-with-jar)
-->
<resources>
<resource> <!-- regular processing for every resource file -->
<directory>src/main/resources</directory>
</resource>
<resource> <!-- processing with a different output directory for log4j.xml -->
<directory>src/main/resources</directory>
<includes>
<include>log4j.xml</include>
</includes>
<targetPath>..</targetPath> <!-- relative to target/classes i.e. ${project.build.directory} -->
</resource>
</resources>
<plugins>
<!--
This will exclude log4j.xml file from generated JAR
-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.6</version>
<configuration>
<excludes>
<exclude>log4j.xml</exclude>
</excludes>
<archive>
<manifest>
<addClasspath>true</addClasspath>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
</project>

View File

@ -0,0 +1,105 @@
/**
* The MIT License Copyright (c) 2014 Ilkka Seppälä
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
* associated documentation files (the "Software"), to deal in the Software without restriction,
* including without limitation the rights to use, copy, modify, merge, publish, distribute,
* sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or
* substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
* NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
package com.iluwatar.datamapper;
import java.util.Optional;
import java.util.UUID;
import org.apache.log4j.Logger;
/**
*
* The Data Mapper (DM) is a layer of software that separates the in-memory objects from the
* database. Its responsibility is to transfer data between the two and also to isolate them from
* each other. With Data Mapper the in-memory objects needn't know even that there's a database
* present; they need no SQL interface code, and certainly no knowledge of the database schema. (The
* database schema is always ignorant of the objects that use it.) Since it's a form of Mapper ,
* Data Mapper itself is even unknown to the domain layer.
* <p>
* The below example demonstrates basic CRUD operations: select, add, update, and delete.
*
*/
public final class App {
private static Logger log = Logger.getLogger(App.class);
private static final String DB_TYPE_ORACLE = "Oracle";
private static final String DB_TYPE_MYSQL = "MySQL";
/**
* Program entry point.
*
* @param args command line args.
*/
public static final void main(final String... args) {
if (log.isInfoEnabled() & args.length > 0) {
log.debug("App.main(), db type: " + args[0]);
}
StudentDataMapper mapper = null;
/* Check the desired db type from runtime arguments */
if (args.length == 0) {
/* Create default data mapper for mysql */
mapper = new StudentMySQLDataMapper();
} else if (args.length > 0 && DB_TYPE_ORACLE.equalsIgnoreCase(args[0])) {
/* Create new data mapper for mysql */
mapper = new StudentMySQLDataMapper();
} else if (args.length > 0 && DB_TYPE_MYSQL.equalsIgnoreCase(args[0])) {
/* Create new data mapper for oracle */
mapper = new StudentMySQLDataMapper();
} else {
/* Don't couple any Data Mapper to java.sql.SQLException */
throw new DataMapperException("Following data source(" + args[0] + ") is not supported");
}
/* Create new student */
Student student = new Student(UUID.randomUUID(), 1, "Adam", 'A');
/* Add student in respectibe db */
mapper.insert(student);
/* Find this student */
final Optional<Student> studentToBeFound = mapper.find(student.getGuId());
if (log.isDebugEnabled()) {
log.debug("App.main(), db find returned : " + studentToBeFound);
}
/* Update existing student object */
student = new Student(student.getGuId(), 1, "AdamUpdated", 'A');
/* Update student in respectibe db */
mapper.update(student);
/* Delete student in db */
mapper.delete(student);
}
private App() {}
}

View File

@ -0,0 +1,79 @@
/**
* The MIT License Copyright (c) 2016 Amit Dixit
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
* associated documentation files (the "Software"), to deal in the Software without restriction,
* including without limitation the rights to use, copy, modify, merge, publish, distribute,
* sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or
* substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
* NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
package com.iluwatar.datamapper;
/**
*
* @author amit.dixit
*
*/
public final class DataMapperException extends RuntimeException {
private static final long serialVersionUID = 1L;
/**
* Constructs a new runtime exception with {@code null} as its detail message. The cause is not
* initialized, and may subsequently be initialized by a call to {@link #initCause}.
*/
public DataMapperException() {
super();
}
/**
* Constructs a new runtime exception with the specified detail message. The cause is not
* initialized, and may subsequently be initialized by a call to {@link #initCause}.
*
* @param message the detail message. The detail message is saved for later retrieval by the
* {@link #getMessage()} method.
*/
public DataMapperException(final String message) {
super(message);
}
/**
* Constructs a new runtime exception with the specified detail message and cause.
* <p>
* Note that the detail message associated with {@code cause} is <i>not</i> automatically
* incorporated in this runtime exception's detail message.
*
* @param message the detail message (which is saved for later retrieval by the
* {@link #getMessage()} method).
* @param cause the cause (which is saved for later retrieval by the {@link #getCause()} method).
* (A <tt>null</tt> value is permitted, and indicates that the cause is nonexistent or
* unknown.)
*/
public DataMapperException(final String message, final Throwable cause) {
super(message, cause);
}
/**
* Constructs a new runtime exception with the specified cause and a detail message of
* <tt>(cause==null ? null : cause.toString())</tt> (which typically contains the class and detail
* message of <tt>cause</tt>). This constructor is useful for runtime exceptions that are little
* more than wrappers for other throwables.
*
* @param cause the cause (which is saved for later retrieval by the {@link #getCause()} method).
* (A <tt>null</tt> value is permitted, and indicates that the cause is nonexistent or
* unknown.)
*/
public DataMapperException(final Throwable cause) {
super(cause);
}
}

View File

@ -0,0 +1,83 @@
/**
* The MIT License Copyright (c) 2016 Amit Dixit
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
* associated documentation files (the "Software"), to deal in the Software without restriction,
* including without limitation the rights to use, copy, modify, merge, publish, distribute,
* sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or
* substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
* NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
package com.iluwatar.datamapper;
import java.io.Serializable;
import java.util.UUID;
public final class Student implements Serializable {
private static final long serialVersionUID = 1L;
private UUID guid;
private int studentID;
private String name;
private char grade;
public Student() {
this.guid = UUID.randomUUID();
}
public Student(final UUID guid, final int studentID, final String name, final char grade) {
super();
this.guid = guid;
this.studentID = studentID;
this.name = name;
this.grade = grade;
}
public Student(final UUID guid) {
this.guid = guid;
}
public final int getStudentId() {
return studentID;
}
public final void setStudentId(final int studentID) {
this.studentID = studentID;
}
public final String getName() {
return name;
}
public final void setName(final String name) {
this.name = name;
}
public final char getGrade() {
return grade;
}
public final void setGrade(final char grade) {
this.grade = grade;
}
public final UUID getGuId() {
return guid;
}
@Override
public final String toString() {
return "Student [guid=" + guid + ", studentID=" + studentID + ", name=" + name + ", grade=" + grade + "]";
}
}

View File

@ -0,0 +1,33 @@
/**
* The MIT License Copyright (c) 2016 Amit Dixit
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
* associated documentation files (the "Software"), to deal in the Software without restriction,
* including without limitation the rights to use, copy, modify, merge, publish, distribute,
* sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or
* substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
* NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
package com.iluwatar.datamapper;
import java.util.Optional;
import java.util.UUID;
public interface StudentDataMapper {
public Optional<Student> find(final UUID uniqueID) throws DataMapperException;
public void insert(final Student student) throws DataMapperException;
public void update(final Student student) throws DataMapperException;
public void delete(final Student student) throws DataMapperException;
}

View File

@ -0,0 +1,160 @@
/**
* The MIT License Copyright (c) 2016 Amit Dixit
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
* associated documentation files (the "Software"), to deal in the Software without restriction,
* including without limitation the rights to use, copy, modify, merge, publish, distribute,
* sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or
* substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
* NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
package com.iluwatar.datamapper;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Optional;
import java.util.UUID;
public final class StudentMySQLDataMapper implements StudentDataMapper {
@Override
public final Optional<Student> find(final UUID uniqueID) throws DataMapperException {
try {
/* OracleDriver class cant be initilized directly */
Class.forName("oracle.jdbc.driver.OracleDriver");
/* Create new connection */
final Connection connection = DriverManager.getConnection("jdbc:mysql://localhost/MySQL", "username", "password");
/* Create new Oracle compliant sql statement */
final String statement = "SELECT `guid`, `grade`, `studentID`, `name` FROM `students` where `guid`=?";
final PreparedStatement dbStatement = connection.prepareStatement(statement);
/* Set unique id in sql statement */
dbStatement.setString(1, uniqueID.toString());
/* Execute the sql query */
final ResultSet rs = dbStatement.executeQuery();
while (rs.next()) {
/* Create new student */
final Student student = new Student(UUID.fromString(rs.getString("guid")));
/* Set all values from database in java object */
student.setName(rs.getString("name"));
student.setGrade(rs.getString("grade").charAt(0));
student.setStudentId(rs.getInt("studentID"));
return Optional.of(student);
}
} catch (final SQLException | ClassNotFoundException e) {
/* Don't couple any Data Mapper to java.sql.SQLException */
throw new DataMapperException("Error occured reading Students from MySQL data source.", e);
}
/* Return empty value */
return Optional.empty();
}
@Override
public final void update(final Student student) throws DataMapperException {
try {
/* OracleDriver class cant be initilized directly */
Class.forName("oracle.jdbc.driver.OracleDriver");
/* Create new connection */
final Connection connection = DriverManager.getConnection("jdbc:mysql://localhost/MySQL", "username", "password");
/* Create new Oracle compliant sql statement */
final String statement = "UPDATE `students` SET `grade`=?, `studentID`=?, `name`=? where `guid`=?";
final PreparedStatement dbStatement = connection.prepareStatement(statement);
/* Set java object values in sql statement */
dbStatement.setString(1, Character.toString(student.getGrade()));
dbStatement.setInt(2, student.getStudentId());
dbStatement.setString(3, student.getName());
dbStatement.setString(4, student.getGuId().toString());
/* Execute the sql query */
dbStatement.executeUpdate();
} catch (final SQLException | ClassNotFoundException e) {
/* Don't couple any Data Mapper to java.sql.SQLException */
throw new DataMapperException("Error occured reading Students from MySQL data source.", e);
}
}
@Override
public final void insert(final Student student) throws DataMapperException {
try {
/* OracleDriver class cant be initilized directly */
Class.forName("oracle.jdbc.driver.OracleDriver");
/* Create new connection */
final Connection connection = DriverManager.getConnection("jdbc:mysql://localhost/MySQL", "username", "password");
/* Create new Oracle compliant sql statement */
final String statement = "INSERT INTO `students` (`grade`, `studentID`, `name`, `guid`) VALUES (?, ?, ?, ?)";
final PreparedStatement dbStatement = connection.prepareStatement(statement);
/* Set java object values in sql statement */
dbStatement.setString(1, Character.toString(student.getGrade()));
dbStatement.setInt(2, student.getStudentId());
dbStatement.setString(3, student.getName());
dbStatement.setString(4, student.getGuId().toString());
/* Execute the sql query */
dbStatement.executeUpdate();
} catch (final SQLException | ClassNotFoundException e) {
/* Don't couple any Data Mapper to java.sql.SQLException */
throw new DataMapperException("Error occured reading Students from MySQL data source.", e);
}
}
@Override
public final void delete(final Student student) throws DataMapperException {
try {
/* OracleDriver class cant be initilized directly */
Class.forName("oracle.jdbc.driver.OracleDriver");
/* Create new connection */
final Connection connection = DriverManager.getConnection("jdbc:mysql://localhost/MySQL", "username", "password");
/* Create new Oracle compliant sql statement */
final String statement = "DELETE FROM `students` where `guid`=?";
final PreparedStatement dbStatement = connection.prepareStatement(statement);
/* Set java object values in sql statement */
dbStatement.setString(1, student.getGuId().toString());
/* Execute the sql query */
dbStatement.executeUpdate();
} catch (final SQLException | ClassNotFoundException e) {
/* Don't couple any Data Mapper to java.sql.SQLException */
throw new DataMapperException("Error occured reading Students from MySQL data source.", e);
}
}
}

View File

@ -0,0 +1,160 @@
/**
* The MIT License Copyright (c) 2016 Amit Dixit
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
* associated documentation files (the "Software"), to deal in the Software without restriction,
* including without limitation the rights to use, copy, modify, merge, publish, distribute,
* sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or
* substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
* NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
package com.iluwatar.datamapper;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Optional;
import java.util.UUID;
public final class StudentOracleDataMapper implements StudentDataMapper {
@Override
public final Optional<Student> find(final UUID uniqueID) throws DataMapperException {
try {
/* OracleDriver class cant be initilized directly */
Class.forName("oracle.jdbc.driver.OracleDriver");
/* Create new connection */
final Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:Oracle", "username", "password");
/* Create new Oracle compliant sql statement */
final String statement = "SELECT `guid`, `grade`, `studentID`, `name` FROM `students` where `guid`=?";
final PreparedStatement dbStatement = connection.prepareStatement(statement);
/* Set unique id in sql statement */
dbStatement.setString(1, uniqueID.toString());
/* Execute the sql query */
final ResultSet rs = dbStatement.executeQuery();
while (rs.next()) {
/* Create new student */
final Student student = new Student(UUID.fromString(rs.getString("guid")));
/* Set all values from database in java object */
student.setName(rs.getString("name"));
student.setGrade(rs.getString("grade").charAt(0));
student.setStudentId(rs.getInt("studentID"));
return Optional.of(student);
}
} catch (final SQLException | ClassNotFoundException e) {
/* Don't couple any Data Mapper to java.sql.SQLException */
throw new DataMapperException("Error occured reading Students from Oracle data source.", e);
}
/* Return empty value */
return Optional.empty();
}
@Override
public final void update(final Student student) throws DataMapperException {
try {
/* OracleDriver class cant be initilized directly */
Class.forName("oracle.jdbc.driver.OracleDriver");
/* Create new connection */
final Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:Oracle", "username", "password");
/* Create new Oracle compliant sql statement */
final String statement = "UPDATE `students` SET `grade`=?, `studentID`=?, `name`=? where `guid`=?";
final PreparedStatement dbStatement = connection.prepareStatement(statement);
/* Set java object values in sql statement */
dbStatement.setString(1, Character.toString(student.getGrade()));
dbStatement.setInt(2, student.getStudentId());
dbStatement.setString(3, student.getName());
dbStatement.setString(4, student.getGuId().toString());
/* Execute the sql query */
dbStatement.executeUpdate();
} catch (final SQLException | ClassNotFoundException e) {
/* Don't couple any Data Mapper to java.sql.SQLException */
throw new DataMapperException("Error occured reading Students from Oracle data source.", e);
}
}
@Override
public final void insert(final Student student) throws DataMapperException {
try {
/* OracleDriver class cant be initilized directly */
Class.forName("oracle.jdbc.driver.OracleDriver");
/* Create new connection */
final Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:Oracle", "username", "password");
/* Create new Oracle compliant sql statement */
final String statement = "INSERT INTO `students` (`grade`, `studentID`, `name`, `guid`) VALUES (?, ?, ?, ?)";
final PreparedStatement dbStatement = connection.prepareStatement(statement);
/* Set java object values in sql statement */
dbStatement.setString(1, Character.toString(student.getGrade()));
dbStatement.setInt(2, student.getStudentId());
dbStatement.setString(3, student.getName());
dbStatement.setString(4, student.getGuId().toString());
/* Execute the sql query */
dbStatement.executeUpdate();
} catch (final SQLException | ClassNotFoundException e) {
/* Don't couple any Data Mapper to java.sql.SQLException */
throw new DataMapperException("Error occured reading Students from Oracle data source.", e);
}
}
@Override
public final void delete(final Student student) throws DataMapperException {
try {
/* OracleDriver class cant be initilized directly */
Class.forName("oracle.jdbc.driver.OracleDriver");
/* Create new connection */
final Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:Oracle", "username", "password");
/* Create new Oracle compliant sql statement */
final String statement = "DELETE FROM `students` where `guid`=?";
final PreparedStatement dbStatement = connection.prepareStatement(statement);
/* Set java object values in sql statement */
dbStatement.setString(1, student.getGuId().toString());
/* Execute the sql query */
dbStatement.executeUpdate();
} catch (final SQLException | ClassNotFoundException e) {
/* Don't couple any Data Mapper to java.sql.SQLException */
throw new DataMapperException("Error occured reading Students from Oracle data source.", e);
}
}
}

View File

@ -0,0 +1,41 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!--
The MIT License
Copyright (c) 2014 Ilkka Seppälä
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
-->
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration debug="true"
xmlns:log4j='http://jakarta.apache.org/log4j/'>
<appender name="console" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n" />
</layout>
</appender>
<root>
<level value="INFO" />
<appender-ref ref="console" />
</root>
</log4j:configuration>