diff options
Diffstat (limited to 'demos/quickstart/protected/pages/Database/SqlMap.page')
-rw-r--r-- | demos/quickstart/protected/pages/Database/SqlMap.page | 86 |
1 files changed, 43 insertions, 43 deletions
diff --git a/demos/quickstart/protected/pages/Database/SqlMap.page b/demos/quickstart/protected/pages/Database/SqlMap.page index 2e3aed16..40e8ba20 100644 --- a/demos/quickstart/protected/pages/Database/SqlMap.page +++ b/demos/quickstart/protected/pages/Database/SqlMap.page @@ -3,7 +3,7 @@ <h1 id="140062">Data Mapper</h1> <com:SinceVersion Version="3.1a" /> -<p id="700505" class="block-content">Data Mappers moves data between objects and a database while keeping them +<p id="700505" class="block-content">Data Mappers moves data between objects and a database while keeping them independent of each other and the mapper itself. If you started with <a href="?page=Database.ActiveRecord">Active Records</a>, you may eventually faced with more complex business @@ -13,11 +13,11 @@ that is, the object schema and the relational schema don't match up. </p> -<p id="700506" class="block-content">The Data Mapper 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 +<p id="700506" class="block-content">The Data Mapper 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.) + database schema. (The database schema is always ignorant of the objects that use it.) </p> <h2 id="140063">When to Use It</h2> @@ -28,46 +28,46 @@ what the database structure is, because all the correspondence is done by the mappers. </p> -<p id="700508" class="block-content">This helps you in the code because you can understand and work with the domain objects - without having to understand how they're stored in the database. You can modify the +<p id="700508" class="block-content">This helps you in the code because you can understand and work with the domain objects + without having to understand how they're stored in the database. You can modify the business models or the database without having to alter either. With complicated mappings, particularly those involving <b>existing databases</b>, this is very valuable. </p> -<p id="700509" class="block-content">The price, of course, is the extra layer that you don't get with - <a href="?page=Database.ActiveRecord">Active Record</a>, - so the test for using these patterns is the complexity of the business logic. - If you have fairly simple business logic, an <a href="?page=Database.ActiveRecord">Active Record</a> - will probably work. +<p id="700509" class="block-content">The price, of course, is the extra layer that you don't get with + <a href="?page=Database.ActiveRecord">Active Record</a>, + so the test for using these patterns is the complexity of the business logic. + If you have fairly simple business logic, an <a href="?page=Database.ActiveRecord">Active Record</a> + will probably work. For more complicated logic a Data Mapper may be more suitable. </p> <h2 id="140064">SqlMap Data Mapper</h2> -<p id="700510" class="block-content">The SqlMap DataMapper framework makes it easier to use a database with a PHP application. - SqlMap DataMapper couples objects with stored procedures or SQL statements using - a XML descriptor. Simplicity is the biggest advantage of the SqlMap DataMapper over - object relational mapping tools. To use SqlMap DataMapper you rely on your own objects, - XML, and SQL. There is little to learn that you don't already know. +<p id="700510" class="block-content">The SqlMap DataMapper framework makes it easier to use a database with a PHP application. + SqlMap DataMapper couples objects with stored procedures or SQL statements using + a XML descriptor. Simplicity is the biggest advantage of the SqlMap DataMapper over + object relational mapping tools. To use SqlMap DataMapper you rely on your own objects, + XML, and SQL. There is little to learn that you don't already know. With SqlMap DataMapper you have the full power of both SQL and stored procedures at your fingertip </p> <p id="700511" class="block-content"> <img src=<%~ diagram.png %> alt="SqlMap Data Mapper Overview" id="fig:sqlmap.png" class="figure"/> - - Here's a high level description of the work flow illustrated in the figure abov. + + Here's a high level description of the work flow illustrated in the figure above. Provide a parameter, either as an object or a primitive type. The parameter can be - used to set runtime values in your SQL statement or stored procedure. If a runtime value + used to set runtime values in your SQL statement or stored procedure. If a runtime value is not needed, the parameter can be omitted. </p> -<p id="700512" class="block-content">Execute the mapping by passing the parameter and the name you gave the statement or +<p id="700512" class="block-content">Execute the mapping by passing the parameter and the name you gave the statement or procedure in your XML descriptor. This step is where the magic happens. The framework - will prepare the SQL statement or stored procedure, set any runtime values using your + will prepare the SQL statement or stored procedure, set any runtime values using your parameter, execute the procedure or statement, and return the result. </p> <p id="700513" class="block-content">In the case of an update, the number of rows affected is returned. In the case of a - query, a single object, or a collection of objects is returned. Like the parameter, + query, a single object, or a collection of objects is returned. Like the parameter, the result object, or collection of objects, can be a plain-old object or a primitive PHP type. </p> @@ -82,8 +82,8 @@ $dsn = 'pgsql:host=localhost;dbname=test'; //Postgres SQL $conn = new TDbConnection($dsn, 'dbuser','dbpass'); $manager = new TSqlMapManager($conn); $manager->configureXml('my-sqlmap.xml'); -$sqlmap = $manager->getSqlMapGateway(); -</com:TTextHighlighter> +$sqlmap = $manager->getSqlMapGateway(); +</com:TTextHighlighter> </p> <p id="700515" class="block-content"> @@ -96,31 +96,31 @@ $sqlmap = $manager->getSqlMapGateway(); <p id="700516" class="block-content"> SqlMap database connection can also be configured using a <tt><module></tt> - tag in the <a href="?page=Configurations.AppConfig">application.xml</a> + tag in the <a href="?page=Configurations.AppConfig">application.xml</a> or <a href="?page=Configurations.PageConfig">config.xml</a> as follows. <com:TTextHighlighter Language="xml" CssClass="source block-content" id="code_700167"> <modules> - <module id="my-sqlmap" class="System.Data.SqlMap.TSqlMapConfig" + <module id="my-sqlmap" class="System.Data.SqlMap.TSqlMapConfig" EnableCache="true" ConfigFile="my-sqlmap.xml" > <database ConnectionString="pgsql:host=localhost;dbname=test" Username="dbuser" Password="dbpass" /> </module> -</modules> -</com:TTextHighlighter> +</modules> +</com:TTextHighlighter> </p> <p id="700517" class="block-content"> The <tt>ConfigFile</tt> attribute should point to a SqlMap configuration file - (to be detailed later) either using absolute path, relative path or the + (to be detailed later) either using absolute path, relative path or the Prado's namespace dot notation path (must omit the ".xml" extension). - + <div class="tip"><b class="note">Tip:</b> The <tt>EnableCache</tt> attribute when set to "true" will cache the parsed configuration. You must clear or disable the cache if you - make chanages your configuration file. + make changes to your configuration file. A <a href="?page=Advanced.Performance#6402">cache module</a> must also be defined for the cache to function. - </div> + </div> </p> <p id="700518" class="block-content">To obtain the SqlMap gateway interface from the <module> configuration, simply @@ -140,8 +140,8 @@ class MyPage extends TPage <h2 id="140066">A quick example</h2> <p id="700519" class="block-content">Let us - consider the following "users" table that contains two columns named "username" and "email", - where "username" is also the primary key. + consider the following "users" table that contains two columns named "username" and "email", + where "username" is also the primary key. <com:TTextHighlighter Language="sql" CssClass="source block-content" id="code_700169"> CREATE TABLE users ( @@ -178,7 +178,7 @@ class User attribute will be used as the identifier for the query. The <tt>resultClass</tt> attribute value is the name of the class the the objects to be returned. We can now query the objects as follows: - + <com:TTextHighlighter Language="php" CssClass="source block-content" id="code_700172"> //assume that $sqlmap is an TSqlMapGateway instance $userList = $sqlmap->queryForList("SelectUsers"); @@ -189,7 +189,7 @@ $user = $sqlmap->queryForObject("SelectUsers"); </p> <p id="700523" class="block-content">The above example shows demonstrates only a fraction of the capabilities - of the SqlMap Data Mapper. Further details can be found in the + of the SqlMap Data Mapper. Further details can be found in the <a href="http://www.pradosoft.com/demo/sqlamp/">SqlMap Manual</a>. </p> @@ -197,12 +197,12 @@ $user = $sqlmap->queryForObject("SelectUsers"); <p id="700524" class="block-content">The above example may seem trival and it also seems that there is alot work just to retrieve some data. However, notice that the <tt>User</tt> class is totally unware of been stored in the database, and the database is - unware of the <tt>User</tt> class. + unware of the <tt>User</tt> class. </p> <p id="700525" class="block-content"> One of advantages of SqlMap is the ability to map complex object relationship, collections from an existing - database. On the other hand, <a href="?page=Database.ActiveRecord">Active Record</a> + database. On the other hand, <a href="?page=Database.ActiveRecord">Active Record</a> provide a very simple way to interact with the underlying database but unable to do more complicated relationship or collections. A good compromise is to use SqlMap to retrieve @@ -214,11 +214,11 @@ $user = $sqlmap->queryForObject("SelectUsers"); <com:TTextHighlighter Language="php" CssClass="source block-content" id="code_700173"> class UserRecord extends TActiveRecord { - const TABLE='users'; //table name + const TABLE='users'; //table name public $username; //the column named "username" in the "users" table public $email; - + /** * @return TActiveRecord active record finder instance */ @@ -245,7 +245,7 @@ class UserRecord extends TActiveRecord <p id="700528" class="block-content">The PHP code for retrieving the users remains the same, but SqlMap returns Active Records instead, and we can take advantage of the Active Record methods. - + <com:TTextHighlighter Language="php" CssClass="source block-content" id="code_700175"> //assume that $sqlmap is an TSqlMapGateway instance $user = $sqlmap->queryForObject("SelectUsers"); @@ -259,7 +259,7 @@ $user->save(); //save it using Active Record <ul id="u1" class="block-content"> <li>Fowler et. al. <i>Patterns of Enterprise Application Architecture</i>, Addison Wesley, 2002.</li> - <li>iBatis Team. <i>iBatis Data Mapper</i>, + <li>iBatis Team. <i>iBatis Data Mapper</i>, <a href="http://ibatis.apache.org">http://ibatis.apache.org</a>.</li> </ul> |