1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!-- Content Stylesheet for Site -->
<!-- start the processing -->
<!-- ====================================================================== -->
<!-- Main Page Section -->
<!-- ====================================================================== -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/>
<meta name="author" value="Turbine Documentation Team">
<meta name="email" value="a@a.com">
<title>Turbine - DB Adapters</title>
</head>
<body bgcolor="#ffffff" text="#000000" link="#525D76">
<table border="0" width="100%" cellspacing="0">
<!-- TOP IMAGE -->
<tr>
<td align="left">
<a href="http://jakarta.apache.org"><img src="http://jakarta.apache.org/images/jakarta-logo.gif" border="0"/></a>
</td>
<td align="right">
<a href="http://jakarta.apache.org/turbine/"><img src="./images/logo.gif" alt="Turbine" border="0"/></a>
</td>
</tr>
</table>
<table border="0" width="100%" cellspacing="4">
<tr><td colspan="2">
<hr noshade="" size="1"/>
</td></tr>
<tr>
<!-- LEFT SIDE NAVIGATION -->
<td valign="top" nowrap="true">
<p><strong>Essentials</strong></p>
<ul>
<li> <a href="./index.html">Overview</a>
</li>
<li> <a href="./features.html">Features</a>
</li>
<li> <a href="./fsd.html">Specification</a>
</li>
<li> <a href="./project-map.html">Project map</a>
</li>
<li> <a href="./install.html">Installation</a>
</li>
<li> <a href="./getting-started.html">Getting Started</a>
</li>
<li> <a href="./changes.html">Changes</a>
</li>
<li> <a href="./other-docs.html">Other Documentation</a>
</li>
</ul>
<p><strong>Models</strong></p>
<ul>
<li> <a href="./pullmodel.html">Pull MVC Model</a>
</li>
<li> <a href="./model2+1.html">Model 2+1</a>
</li>
<li> <a href="./j2ee-integration.html">J2EE Integration</a>
</li>
</ul>
<p><strong>Get Involved</strong></p>
<ul>
<li> <a href="./turbine-documentation-project.html">Turbine Documentation</a>
</li>
<li> <a href="./code-standards.html">Coding Spec</a>
</li>
<li> <a href="./contributors.html">Contributors</a>
</li>
<li> <a href="./branches.html">CVS Branches</a>
</li>
<li> <a href="http://jakarta.apache.org/site/cvsindex.html">CVS Repos</a>
</li>
<li> <a href="./faq.html">FAQ</a>
</li>
<li> <a href="./license.html">License</a>
</li>
<li> <a href="http://jakarta.apache.org/site/mail.html">Mailing Lists</a>
</li>
<li> <a href="./powered.html">Powered by Turbine</a>
</li>
<li> <a href="./todo.html">Todo</a>
</li>
<li> <a href="./active-developers.html">Active Developers</a>
</li>
<li> <a href="./proposals.html">Proposals</a>
</li>
</ul>
<p><strong>Documentation</strong></p>
<ul>
<li> <a href="./action-event.html">Action Events</a>
</li>
<li> <a href="./services.html">Services</a>
</li>
<li> <a href="./security.html">Turbine and Security</a>
</li>
<li> <a href="./python.html">Turbine and Python</a>
</li>
<li> <a href="./jsp-configuration.html">Turbine and JSP</a>
</li>
<li> <a href="./velocity-site.html">Velocity Site</a>
</li>
<li> <a href="./context-howto.html">Velocity Context</a>
</li>
<li> <a href="./webmacro-site.html">Webmacro Site</a>
</li>
</ul>
<p><strong>Database</strong></p>
<ul>
<li> <a href="./peers.html">Peers</a>
</li>
<li> <a href="./advpeers.html">Advanced Peers</a>
</li>
<li> <a href="./advcriteria.html">Advanced Criteria</a>
</li>
<li> <a href="./torque.html">Torque</a>
</li>
<li> <a href="./turbine-schema.html">Core Schema</a>
</li>
<li> <a href="./db-adapters.html">DB Adapters</a>
</li>
<li> <a href="./postgres-howto.html">Postgres Howto</a>
</li>
<li> <a href="./oracle-howto.html">Oracle 8i Howto</a>
</li>
<li> <a href="./sybase-howto.html">Sybase Howto</a>
</li>
</ul>
</td>
<td align="left" valign="top">
<table border="0" cellspacing="0" cellpadding="2" width="100%">
<tr><td bgcolor="#525D76">
<font color="#ffffff" face="arial,helvetica,sanserif">
<a name="Database Adapters"><strong>Database Adapters</strong></a>
</font>
</td></tr>
<tr><td>
<blockquote>
<p>
A database adapter class is a class that extends
<code>org.apache.turbine.util.db.pool.DB</code>
and encapsulates access to a specific RDBMS implementation. Database
adapter classes already found in Turbine include DBOracle, DBMM, DBSybase,
etc. These classes allow Turbine to gain access to a wide range of databases
in a uniform manner. This allows you to easily swap between databases
without any modification to Turbine or the application built on top of
Turbine.
</p>
<p>
Why is this necessary if Java already offers uniform database access
in the form of JDBC? Unfortunately, underlying databases still
use different SQL implementations and conventions. For example, the use
of single and double quotes varies. The use of database adapter classes in
Turbine endeavors to overcome this problem without the need to change the
Turbine framework or Turbine applications for each different database
encountered.
</p>
<p>
To add a new database adapter class to Turbine you must follow these
steps:
</p>
<p>
<ul>
<li>
Create a new class DB<dbname> that extends
<code>org.apache.turbine.util.db.adapter.DB</code> (where
dbname is the name of the
database or database driver you wish to add to Turbine). DB is an
abstract class, so you need to implement a number of methods.</li>
<li>
Implement getStringDelimiter(). This method has to return the character
that the specific database implementation uses to indicate string
literals in SQL. This will usually be a single qoute (').</li>
<li>
Implement String getIdSqlForAutoIncrement(). Databases like MySQL
that make use of auto increment fields will implement this method.
For MySQL it returns "SELECT LAST_INSERT_ID()". Databases that do
not support this must return null.</li>
<li>
Implement String getSequenceSql(Object obj). Databases like Oracle
that support the concept of unique id generators (called sequences) will
implement this method. Databases that do not support this must return
null.</li>
<li>
Implement void lockTable(Connection con, String table). This method
should place a lock on a database table. Databases that only support
table level locking obviously do not require this method. Databases
that support row level locking must implement this method to avoid
synchronization problems.</li>
<li>
Implement void unlockTable(Connection con, String table). This method
should release the table lock acquired by the above-mentioned
method.</li>
<li>
Implement String ignoreCase(String in). This method should implement
a mechanism for case insensitive comparisons. Usually this converts
the string to Uppercase. Example UPPER (<in>). If such a
mechanism does not exist in your database simple return the in parameter
without any modification. DO NOT return in.toUpper().</li>
<li>
Some databases (for example Interbase) do not support the function
returned by their implementation of ignoreCase() in the ORDER BY
clause of SELECT statements. If your database falls into this
category you should override the default implementation of
String ignoreCaseInOrderBy(String in). It is NOT required to override
this method for other databases--the default implementation calls
ignoreCase() and respectCase().</li>
</ul>
</p>
<p>
If you are adding support for a new RDBMS, then you will probably also
need to create a set of Velocity templates--used by Torque to generate
a SQL schema for your RDBMS--in the directory
conf/torque/templates/sql/base/<dbname>. The recommend method for
doing this is to copy an existing set of templates and adapt them to
your RDBMS as needed.
</p>
</blockquote>
</td></tr>
</table>
</td>
</tr>
<!-- FOOTER -->
<tr><td colspan="2">
<hr noshade="" size="1"/>
</td></tr>
<tr><td colspan="2">
<div align="center"><font color="#525D76" size="-1"><em>
Copyright © 1999-2001, Apache Software Foundation
</em></font></div>
</td></tr>
</table>
</body>
</html>
<!-- end the processing -->
|