Java tutorial
/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package com.datatorrent.lib.db.jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.Properties; import javax.validation.constraints.NotNull; import org.codehaus.jackson.annotate.JsonIgnore; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.common.base.CharMatcher; import com.google.common.base.Splitter; import com.google.common.collect.Iterables; import com.datatorrent.lib.db.Connectable; import com.datatorrent.netlet.util.DTThrowable; /** * A {@link Connectable} that uses jdbc to connect to stores. * * @since 0.9.4 */ public class JdbcStore implements Connectable { protected static final Logger logger = LoggerFactory.getLogger(JdbcStore.class); @NotNull private String databaseUrl; @NotNull private String databaseDriver; private Properties connectionProperties; protected transient Connection connection = null; /* * Connection URL used to connect to the specific database. */ @NotNull public String getDatabaseUrl() { return databaseUrl; } /* * Connection URL used to connect to the specific database. */ public void setDatabaseUrl(@NotNull String databaseUrl) { this.databaseUrl = databaseUrl; } /* * Driver used to connect to the specific database. */ @NotNull public String getDatabaseDriver() { return databaseDriver; } /* * Driver used to connect to the specific database. */ public void setDatabaseDriver(@NotNull String databaseDriver) { this.databaseDriver = databaseDriver; } public JdbcStore() { connectionProperties = new Properties(); } /** * Function to get the connection. * Ignoring "connection" for serialization as it was being used even after * being closed while fetching/displaying the operator properties (refer APEXMALHAR-2351) */ @JsonIgnore public Connection getConnection() { return connection; } /** * Sets the user name. * * @param userName user name * @deprecated use {@link #setConnectionProperties(String)} instead. */ public void setUserName(String userName) { connectionProperties.put("user", userName); } /** * Sets the password. * * @param password password * @deprecated use {@link #setConnectionProperties(String)} instead. */ public void setPassword(String password) { connectionProperties.put("password", password); } /** * Sets the connection properties on JDBC connection. Connection properties are provided as a string. * * @param connectionProps Comma separated list of properties. Property key and value are separated by colon. * eg. user:xyz,password:ijk */ public void setConnectionProperties(String connectionProps) { String[] properties = Iterables.toArray( Splitter.on(CharMatcher.anyOf(":,")).omitEmptyStrings().trimResults().split(connectionProps), String.class); for (int i = 0; i < properties.length; i += 2) { if (i + 1 < properties.length) { connectionProperties.put(properties[i], properties[i + 1]); } } } /** * Sets the connection properties on JDBC connection. * * @param connectionProperties connection properties. */ public void setConnectionProperties(Properties connectionProperties) { this.connectionProperties = connectionProperties; } /** * Get the connection properties of JDBC connection. */ public Properties getConnectionProperties() { return connectionProperties; } /** * Create connection with database using JDBC. */ @Override public void connect() { try { // This will load the JDBC driver, each DB has its own driver Class.forName(databaseDriver).newInstance(); connection = DriverManager.getConnection(databaseUrl, connectionProperties); logger.debug("JDBC connection Success"); } catch (Throwable t) { DTThrowable.rethrow(t); } } /** * Close JDBC connection. */ @Override public void disconnect() { if (connection != null) { try { connection.close(); } catch (SQLException ex) { throw new RuntimeException("closing database resource", ex); } } } @Override @JsonIgnore public boolean isConnected() { try { return connection != null ? !connection.isClosed() : false; } catch (SQLException e) { throw new RuntimeException("is isConnected", e); } } }