Telosys Data Access Layer

  • 1,254 views
Uploaded on

Telosys Data Access Layer presentation

Telosys Data Access Layer presentation

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
1,254
On Slideshare
0
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
28
Comments
0
Likes
1

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Data Access Layer ( “Telosys-DAL” ) Laurent Guérin / V 1.8 / 2008 – November ( for Telosys 1.0.0 and + )
  • 2. Telosys-DAL : The big principles Telosys-DAL goals : Provide an easy way to write and use standard “CRUD” DAOs ( for single Value Objects and Lists ) Let the programmer see the SQL code and control all the operations Keep the SQL code and the “O/R mapping” in the Java classes (when the code runs, it cannot be altered by external files) Increase the productivity by providing a set of classes to encapsulate all the JDBC complexity external tools to generate the specific Java code required to access a table you don’t have to write code to create DAO and Value Objects ! Telosys framework - D.A.L. ( Laurent Guérin / ver 1.8 ) 2
  • 3. Telosys-DAL : Overview Application Data Access Layer dbconfig.xml init() Connection getConnection() Manager Telosys « SqlConnection « DAO » Provider » SqlConnection AgencyVO SqlConnection AgencyDAO Pool AgencyVOList SqlConnection Pool SqlConnection EmployeeVO EmployeeDAO SqlConnection EmployeeVOList Factory SqlConnection Value Objects J2EE Server SQLDataSource DataSource Telosys framework - D.A.L. ( Laurent Guérin / ver 1.8 ) 3
  • 4. Configuration file “dbconfig.xml” dbconfig.xml example : maxId : 0 to 100 <databases maxId="4" defaultId="0" > defaultId : 0 if not set or invalid id : 0 to maxId <db id = "0" poolSize : name = "MySQL - Test DB" . 0|1 factory (no pool ) driver = "com.mysql.jdbc.Driver" .>1 pool url = "jdbc:mysql://localhost:3306/test" isolationLevel = "TRANSACTION_REPEATABLE_READ" poolSize = "3" > POOL [ 3 ] <property name="user" value="root" /> <property name="password" value="" /> <metadata catalog="" schema="" table-name-pattern="%" table-types="TABLE VIEW" /> </db> <db id = "1" name="DataSource MySQL" datasource="java:comp/env/jdbc/mydatasource" /> <db id = "2" Datasource (JNDI name) name = "Oracle 10g" driver = "oracle.jdbc.OracleDriver" url = "jdbc:oracle:thin:@localhost:1521:XE" isolationLevel = "TRANSACTION_READ_COMMITTED" Factory poolSize = “0" > ( no pool ) <property name="user" value="tp" /> <property name="password" value="tp" /> <metadata catalog="" schema="TP" table-name-pattern="%" table-types="TABLE VIEW" /> </db> </databases> Telosys framework - D.A.L. ( Laurent Guérin / ver 1.8 ) 4
  • 5. Telosys-DAL : Initialization Telosys-DAL stand-alone : //--- Telosys DAL initialization with dbconfig file path private static final String DB_CONFIG = CONF_DIR + "dbconfig.xml" ; TelosysDAL.init(DB_CONFIG); Telosys-DAL with Telosys framework : Define the dbconfig file in the telosys.properties DbConfFile = C:/Eclipse301/workspace/Telosys/conf/dbconfig.xml DbConfFile = ./dbconfig.xml Init Telosys framework, then Telosys-DAL //--- 1) Telosys global initialization Telosys.init(..., ...); //--- 2) Telosys DAL initialization TelosysDAL.init(); Telosys framework - D.A.L. ( Laurent Guérin / ver 1.8 ) 5
  • 6. Telosys-DAL : Connections management ConnectionManager ConnectionProvider << class >> << interface >> . init ( String dbconfigFile ) java.sql. . getConnection() . getDefaultDatabase() * . getName() Connection . getNumberOfDatabases() << interface >> . getConnection() . getConnection(int base) . getSession() . getSession(int base) SqlDataSource SqlConnectionProvider getConnection : get from DataSource javax.sql.DataSource SqlConnection SqlConnection 1 Pool Factory Pool ( Vector ) getConnection : getConnection : create a new get from pool * SqlConnection connection << class >> Telosys framework - D.A.L. ( Laurent Guérin / ver 1.8 ) 6
  • 7. Telosys-DAL : Connections management How to get a Connection : //--- Connection from Default Database Connection c1 = ConnectionManager.getConnection(); //--- Connection from Database 1 Connection c2 = ConnectionManager.getConnection(1); How to release a Connection : Connection c1 = ConnectionManager.getConnection(); c1.close(); if the connection comes from … a pool it is recycled ( in the Telosys pool ) a factory it is closed a datasource managed by the DataSource Telosys framework - D.A.L. ( Laurent Guérin / ver 1.8 ) 7
  • 8. DAL – V.O. ( Value Objects ) The data exchange between the Data Access Layer and the other layers is done with “VO” ( “Value Object” ), also known as “DTO” ( “Data Transfer Object” ) For each “VO”, 2 Java classes are required : The VO itself A specific list of this type of VO (with strong type checking methods ) Example : to managed “Employees” we need … “EmployeeVO.java” ( the VO ) “EmployeeVOList.java” ( the list of “EmployeeVO” ) Telosys framework - D.A.L. ( Laurent Guérin / ver 1.8 ) 8
  • 9. DAL – V.O. ( Value Objects ) « Employee » example : GenericVOList Standard « DataList » provided Telosys . getList() by Telosys . size() . isEmpty() . clear() LinkedList extends « GenericVOList » no inheritance EmployeeVOList EmployeeVO Specific méthods to encapsulate the . EmployeeVO add() . getXxxx() Value Object generic methods of . add( EmployeeVO ) . setXxxx() DataList . insert ( index, EmployeeVO ) . isXxxx() for entity . replace ( index, EmployeeVO ) . toString() « Employee » . remove ( index ) Standard template, . remove (EmployeeVO ) but no interface . EmployeeVO get( index ) Standard accessors, implementation . EmployeeVO getFirst() for each attribute because of the strong . EmployeeVO getNext() type methods List of « EmployeeVO » Telosys framework - D.A.L. ( Laurent Guérin / ver 1.8 ) 9
  • 10. DAL – D.A.O. ( Data Access Objects ) The DAO provides methods to manipulate A single entity : the Value Object A list of entity corresponding to a specific Query The Value Objects List The DAO works with other classes : 1 Value Object ( VO ) 1 Value Objects List ( VOList ) 0 .. N Query (providing a VOList ) Telosys framework - D.A.L. ( Laurent Guérin / ver 1.8 ) 10
  • 11. DAL – D.A.O. ( Data Access Objects ) The DAO operations to manipulate a single V.O. load (try to load a VO using its primary key) save (save a VO by SQL insert or update ) delete (delete a VO using its primary key ) insert ( try to insert the VO ) insertKeyGen ( insert with key generation ) update ( try to update the VO ) exists ( check if the VO exists in the database ) Telosys framework - D.A.L. ( Laurent Guérin / ver 1.8 ) 11
  • 12. DAL – D.A.O. ( Data Access Objects ) The DAO operations to manipulate SQL Queries and V.O. lists createQuery ( create a SQL query to be used afterwards ) loadList ( load a list as the result of a Query ) saveList ( save a list by a “SQL delete” using the Query criteria & “n SQL insert” for all the items of the list) deleteList ( delete the list using the Query criteria ) count ( do a “select count(*) ..” using the Query criteria ) List elements management ( without Query ) : updateList ( update all the items of the list ) VOList insertList ( insert all the items of the list ) or List deleteList ( delete all the items of the list ) Telosys framework - D.A.L. ( Laurent Guérin / ver 1.8 ) 12
  • 13. DAL – D.A.O. ( Data Access Objects ) DAO with or without Connections ? Each operation of a DAO has 4 signatures Examples : dao.save( myVO ); DB id works with the default database ID ( cf dbconfig.xml ) dao.save( myVO, base_id ); works with the given database ID ( “int” ) dao.save( myVO, connection ); Connection works with the given standard JDBC “Connection” dao.save( myVO, database_session ); works with the given “DatabaseSession” object ( a “DatabaseSession” is a Telosys object which encapsulate a connection, useful for “Screen Managers” ) Telosys framework - D.A.L. ( Laurent Guérin / ver 1.8 ) 13
  • 14. DAL – D.A.O. ( Data Access Objects ) With logical DB id ( without “Connection” ) The DAO uses the “ConnectionManager” to get a connection ( ConnectionManager.getConnection(); ) Each insert, update or delete is commited automatically The connection is closed ( recycled if it belongs to a pool ) after each operation The programmer never see the Connection object With “Connection” or “DatabaseSession” The connection management is the programmer’s responsibility The DAO doesn’t commit anything And doesn’t close the connection Telosys framework - D.A.L. ( Laurent Guérin / ver 1.8 ) 14
  • 15. How to use D.A.O.
  • 16. How to get a DAO instance A DAO is thread-safe => its instance can be shared an reused 1/ Using the default DAO constructor EmployeeDAO dao = new EmployeeDAO(); 2/ Using a DAO provider if any (since v 1.0.0) Employee bean = new Employee(); DAOProvider provider = TelosysDAL.getDAOProvider(); EmployeeDAO dao ; dao = (EmployeeDAO) provider.getDAO(bean); // by bean instance dao = (EmployeeDAO) provider.getDAO(bean,3); // same but for DB 3 dao = (EmployeeDAO) provider.getDAO(Employee.class); // by bean class dao = (EmployeeDAO) provider.getDAO(Employee.class,3); // same for DB 3 ( the dynamic DAO registries can be defined in the files dbconfig.xml and telosys.properties ) Telosys framework - D.A.L. ( Laurent Guérin / ver 1.8 ) 16
  • 17. DAO management DAO description : String s = dao.describe() The returned string contains the DAO Java Class the DAO target TABLE the set of SQL requests for standard operations : SELECT, INSERT, UPDATE, DELETE Other methods … String dao.getTableName() Class dao.getEntityBeanClass() SqlRequests dao.getSqlRequests() Telosys framework - D.A.L. ( Laurent Guérin / ver 1.8 ) 17
  • 18. DAO & Entities (VO)
  • 19. DAO : load an entity by PK Set the Primary Key vo.setId(“IdValue”); Try to load the entity dao.load(vo); SQL request : Select … from … where … Return code ( int ) : 1 – Found and loaded ( VO attributes are populated ) 0 – Not found ( no change on the VO ) Telosys framework - D.A.L. ( Laurent Guérin / ver 1.8 ) 19
  • 20. DAO : load with lock Lock the record with a “SELECT FOR UPDATE” : dao.load(vo, “FOR UPDATE” ); NB: Database specific => any string can be used ! Use string constants ! Telosys framework - D.A.L. ( Laurent Guérin / ver 1.8 ) 20
  • 21. DAO : check the existence of an entity Set the Primary Key vo.setId(“IdValue”); Check existence if ( dao.exists(vo) ) boolean b = dao.exists(vo) SQL request : Select count where … Return code ( boolean ) True : the entity exists False : the entity doesn’t exist Telosys framework - D.A.L. ( Laurent Guérin / ver 1.8 ) 21
  • 22. DAO : update an entity Set the VO attributes vo.setId(“IdValue”); vo.setOther(…); Update dao.update(vo); SQL request : Update table set … where … Return code ( int ) The standard JDBC return value (the number of rows affected). For an entity ( with a unique Key ) : 1 – Entity updated ( entity found and updated ) 0 – Entity not updated ( entity not found ) Telosys framework - D.A.L. ( Laurent Guérin / ver 1.8 ) 22
  • 23. DAO : insert an entity Set the VO attributes vo.setId(“IdValue”); vo.setOther(…); Insert dao.insert(vo); SQL request : Insert into … (…) values (…) Return code ( int ) The standard JDBC return value (the number of rows affected). For an entity ( with a unique Key ) : 1 – Successful insert ( entity inserted ) else : never happen Exception Telosys framework - D.A.L. ( Laurent Guérin / ver 1.8 ) 23
  • 24. DAO : insert with key generation Set the VO attributes Key vo.setAttrib1(..); attribute is useless vo.setAttrib2(..); Insert Long key = dao.insertKeyGen(vo); Set the Key attribute in the VO instance vo.setId( key.intValue() ); SQL request : Insert into … (…) values (…) Return code : The generated key wrapped in a Long object ( or null if none ) Telosys framework - D.A.L. ( Laurent Guérin / ver 1.8 ) 24
  • 25. DAO : delete an entity Set the Primary Key vo.setId(“IdValue”); Delete dao.delete(vo); SQL request : Delete from … where … Return code ( int ) The standard JDBC return value (the number of rows affected). For an entity ( with a unique Key ) : 1 – Entity deleted ( entity found and deleted ) 0 – Entity not deleted ( entity not found ) Telosys framework - D.A.L. ( Laurent Guérin / ver 1.8 ) 25
  • 26. DAO : save an entity Set the VO attributes vo.setId(“IdValue”); vo.setOther(…); Save dao.save(vo); SQL requests : Select count from … where … if the enity exists Update else Insert Telosys framework - D.A.L. ( Laurent Guérin / ver 1.8 ) 26
  • 27. DAO : save an entity Return code ( int ) The standard JDBC return value (the number of rows affected). For an entity ( with a unique Key ) : Always 1 : entity inserted 1 row affected or entity updated 1 row affected Telosys framework - D.A.L. ( Laurent Guérin / ver 1.8 ) 27
  • 28. DAL – Exceptions TelosysException try Use a standard { // DAO operations “try catch” block } catch ( TelosysException ex ) { ... } What can happen ? Duplicate key on “insert” Other standard JDBC exceptions : the table has changed => the DAO is not up to date an integrity rule is violated etc… Telosys framework - D.A.L. ( Laurent Guérin / ver 1.8 ) 28
  • 29. D.A.O. & Lists (VOList)
  • 30. DAO and ListQueries A VOList is loaded by using a DAO and a ListQuery A ListQuery holds 3 SQL requests with the same “WHERE” clause : Select … from … WHERE … Select count form … WHERE … Delete form … WHERE … The parameters to set in the “WHERE” clause Lifecycle : 1/ created by the DAO 2/ customized with the specific parameters 3/ passed to the DAO methods to managed VOLists Telosys framework - D.A.L. ( Laurent Guérin / ver 1.8 ) 30
  • 31. DAO and ListQuery model DAO ListQuery << interface >> . createQuery() . setParameter(int,int) . createQuery() creates . setParameter(int,long) . createQuery() . setParameter(int,short) . createQuery() . setParameter(int,Object) . createQueryAll() uses . createQueryAll() . getSqlCount() . getSqlSelect() . getSqlDelete() uses Criteria Criterion . . * Telosys framework - D.A.L. ( Laurent Guérin / ver 1.8 ) 31
  • 32. DAO : Query for all the entities of a table How to load ALL the entities of a table //--- Create the DAO EmployeDAO dao = new EmployeDAO(); //--- Create the VOList EmployeVOList list = new EmployeVOList(); //--- Define a query ListQuery query = dao.createQueryAll(); // ALL (no WHERE clause) //--- Load the list using the query dao.loadList(query, list); //--- Print the list size System.out.println("List size = " + list.size()); //--- Print all the VO of the list Iterator iter = list.iterator() ; int i = 0 ; while ( iter.hasNext() ) { System.out.println(" . " + (i++) + " : " + iter.next() ); } ListQuery query = dao.createQueryAll( “order by name” ); Telosys framework - D.A.L. ( Laurent Guérin / ver 1.8 ) 32
  • 33. DAO : Query with static criteria Query with “ static criteria ” without parameters : ListQuery query = dao.createQuery( "Matricule > 7000" ); ListQuery query = dao.createQuery( "Matricule > 7000" , "order by matricule" ); //--- Load the list using the query dao.loadList(query, list); Query with “ static criteria ” with parameters : ListQuery query = dao.createQuery( "Matricule > ? and Matricule < ? " ); ListQuery query = dao.createQuery( "Matricule > ? and Matricule < ? ", "order by matricule" ); query.setParameter( 1, 100 ); // First parameter value query.setParameter( 2, 200 ); // Second parameter value Param. index : from 1 to N //--- Load the list using the query dao.loadList(query, list); Telosys framework - D.A.L. ( Laurent Guérin / ver 1.8 ) 33
  • 34. DAO : Query with dynamic criteria Define the list of criteria : Criterion [] SQL_CRITERIA = { new Criterion( "nom like ?" , ParamType.STRING ), /* 1 */ new Criterion( "prenom like ?" , ParamType.STRING ), /* 2 */ new Criterion( "Matricule > ?" , ParamType.INTEGER ), /* 3 */ new Criterion( "Matricule < ?" , ParamType.INTEGER ) /* 4 */ }; Criteria crit = new Criteria (SQL_CRITERIA, "and" ); At request time, choose the criteria to use : crit.doNotUse(1); crit.doNotUse(2); crit.useWithValue(3, "10"); crit.useWithValue(4, "900"); Then, create the query : ListQuery query = dao.createQuery(crit, "order by Matricule"); Telosys framework - D.A.L. ( Laurent Guérin / ver 1.8 ) 34
  • 35. DAO & ListQuery : limitations A DAO works with only one table DAO + ListQuery can only retrieve data from a single table ( a list of VO/records load form the table ) To retrieve data with complexes requests… see “DataSet” Telosys framework - D.A.L. ( Laurent Guérin / ver 1.8 ) 35
  • 36. DAO : List persistence The DAO supports global list persistence, based on a query criteria : dao.deleteList( query ) Delete all the occurrences corresponding to the query criteria dao.saveList( query, list) Save the new list content by removing all the existing items then inserting the new list items : Delete all the occurrences corresponding to the query criteria Insert all the occurrences of the list parameter NB : be sure that there’s no risk of integrity violation when using a global “delete” for a list Telosys framework - D.A.L. ( Laurent Guérin / ver 1.8 ) 36
  • 37. DAO : List persistence Bulk insert/update/delete : dao.insertList(list) dao.updateList(list) dao.deleteList(list) Insert, update or delete all the elements of the given list ( VOList or standard java.util.List ) Telosys framework - D.A.L. ( Laurent Guérin / ver 1.8 ) 37
  • 38. D.A.O. & Sequences
  • 39. Sequence DAO A “Sequence DAO” is a specific type of DAO dedicated to the SEQUENCES It provides the standard “NEXT VAL” and “CURR VAL” operations Sequence DAO are available for … Oracle PostgreSQL MySQL ( sequence simulation with tables ) Telosys framework - D.A.L. ( Laurent Guérin / ver 1.8 ) 39
  • 40. Sequence DAO How to create and use a “Sequence DAO” … SequenceDAO seq = new SequenceDAO( "request_id_seq", SequenceDAO.POSTGRESQL); //--- With the default DataBase SequenceDAO.POSTGRESQL long val = seq.nextVal(); SequenceDAO.ORACLE SequenceDAO.MYSQL //--- With a specific DataBase ID long val = seq.nextVal(DbId); //--- With a connection long val = seq.nextVal(c); long val = seq.currVal(c); NB : //--- With a DB Session currVal only with long val = seq.nextVal(s); a connection long val = seq.currVal(s); Telosys framework - D.A.L. ( Laurent Guérin / ver 1.8 ) 40
  • 41. Sequence DAO Best practice : create a class for each sequence public class EmpIdSeqDAO extends SequenceDAO { public EmpIdSeqDAO() { super( "EmpId" , ORACLE); } } //--- Use an existing Sequence DAO EmpIdSeqDAO empIdSeq = new EmpIdSeqDAO(); System.out.println("nextVal : " + empIdSeq.nextVal() ); Telosys framework - D.A.L. ( Laurent Guérin / ver 1.8 ) 41
  • 42. DataSet
  • 43. DataSet A “DataSet” is a set of “DataRow” ( 0..N rows ) A “DataRow” is a set of “Object” ( 0..N cells ) => a DataSet is like a TABLE with ROWS and COLUMNS A “DataSet” is “abstract” and its content can be loaded from different sources. The “source” of the DataSet is defined in a “DataSet definition” Telosys framework - D.A.L. ( Laurent Guérin / ver 1.8 ) 43
  • 44. DataSet Principle Step 1 : “define it” ( constructor + definition ) DataSet ds = new XXXXXX(…); Step 2 : “load or reload it” ds.load() Origin types for SQLDataSet : - Connection ds.load ( origin ) - DatabaseSession - Integer ( Database Id ) Step 3 : “use it” ds.load(); for ( int i = 1 ; i <= ds.getRowCount() ; i++ ) { DataRow dr = ds.getDataRow(i); System.out.println(" ROW = [" + dr.toString() + "] "); String s = dr.getString(1)); Date d = dr.getDate(3)); int i = dr.getInt(4)); } Telosys framework - D.A.L. ( Laurent Guérin / ver 1.8 ) 44
  • 45. DataSet : how to fetch data for ( int i = 1 ; i <= ds.getRowCount() ; i++ ) From 1 to MAX { DataRow dr = ds.getDataRow(i); System.out.println(" dr.toString() = [" + dr.toString() + "] "); String s = dr.getString(1)); Date d = dr.getDate(3)); int i = dr.getInt(4)); } Iterator iter = ds.iterator(); while ( iter.hasNext() ) { DataRow dr = (DataRow)iter.next(); System.out.println(" dr = [" + dr + "] "); } Object o = ds.getObject(2,3); // ( Row, Col ) Row : 1 to MAX String s = ds.getString(2,3); // ( Row, Col ) Col : 1 to MAX float f = ds.getFloat(2,3); // ( Row, Col ) if ( ds.isEmpty() ) Telosys framework - D.A.L. ( Laurent Guérin / ver 1.8 ) 45
  • 46. DataSet : how to sort rows Once the DataSet is loaded, it can be sorted by column ds.sort ( 2 ) ; Sort column 2 ds.sort ( 2, "ASC" ) ; Sort column 2 in ascending order ds.sort ( 2, "DESC" ) ; Sort column 2 in descending order ds.sortIgnoreCase ( 2 ) ; ds.sortIgnoreCase ( 2, "ASC" ) ; ds.sortIgnoreCase ( 2, "DESC" ) ; if ( ds.isSorted ( 2 ) ) if ( ds.isSortedInAscendingOrder() ) if ( ds.isSortedInDescendingOrder() ) Telosys framework - D.A.L. ( Laurent Guérin / ver 1.8 ) 46
  • 47. SQLDataSet
  • 48. SQLDataSet A “SQLDataSet” is an extension (subclass) of "DataSet" It can be loaded from a relational database, using a definition based on a SQL request The definition for a SQLDataSet is held by an instance of SQLDataSetDefinition Telosys framework - D.A.L. ( Laurent Guérin / ver 1.8 ) 48
  • 49. SQLDataSet and relational DB Use case 1 : Basic SQLDataSet (no parameter) //--- DataSet without SQL parameters SQLDataSetDefinition def = new SQLDataSetDefinition( "select name, manager, agency", "from employee" , No parameter in criteria : null , no "where clause" "order by name" ); or static "where clause" SQLDataSetDefinition def2 = new SQLDataSetDefinition( "select name, manager, agency from employee where agency > 10" ); //--- Set a specific Database ID def.setDatabaseId(2); //--- Create the DataSet with the definition SQLDataSet ds = new SQLDataSet( def ); //--- Load the DataSet using the Database specified in the definition ds.load() ; //--- Examples with the load(Object) method : ds.load(new Integer(1)); // load using the given Database ID ds.load(connection); // load using the given JDBC Connection ds.load(dbSession); // load using the given DatabaseSession Telosys framework - D.A.L. ( Laurent Guérin / ver 1.8 ) 49
  • 50. SQLDataSet and relational DB Use case 2 : SQLDataSet with parameters ( static criteria ) //--- DataSet with one INTEGER parameter int [] paramTypes = { ParamType.INTEGER } ; // One param ( INTEGER ) SQLDataSetDefinition def = new SQLDataSetDefinition( "select name, manager, agency", "from employee", 1 .. N fixed parameters "where agency = ? ", in the "where clause" "order by name", paramTypes ); // Array of param types SQLDataSetDefinition def2 = new SQLDataSetDefinition( "select name, manager, agency from employee where agency > ?", paramTypes ); //--- Set the parameter values String paramValues[] = { "1" }; // Array of param value(s) //--- Create the DataSet with the Definition SQLDataSet ds = new SQLDataSet( def, paramValues ); Telosys framework - D.A.L. ( Laurent Guérin / ver 1.8 ) 50
  • 51. SQLDataSet and relational DB Use case 3 : SQLDataSet with “dynamic criteria” SQLDataSetDefinition def = new SQLDataSetDefinition( "select name, manager, agency", "from employee", null, No "where clause" ( dynamic ) "order by name"); If "where clause", dynamic criteria will be added //--- Define the dynamic criteria Criterion[] SQL_CRITERIA = { new Criterion("name like ?", ParamType.STRING), /* 1 */ new Criterion("manager like ?", ParamType.STRING), /* 2 */ new Criterion("agency > ?", ParamType.INTEGER), /* 3 */ new Criterion("agency < ?", ParamType.INTEGER) /* 4 */ }; Criteria crit = new Criteria(SQL_CRITERIA, "and"); //--- Set dynamically the useful criteria crit.useWithValue(1, "ZO%"); crit.doNotUse(2); crit.doNotUse(3); crit.useWithValue(4, "7000"); //--- Create the DataSet with the Definition SQLDataSet ds = new SQLDataSet( def, crit ); Telosys framework - D.A.L. ( Laurent Guérin / ver 1.8 ) 51
  • 52. SQLDataSet use cases DataSet are useful for … Complex SQL request : the SQLDataSetDefinition support Joins between different tables Additional SQL clauses : Order by Group by … Search services : complex criteria combination with “Dynamic Criteria” Telosys framework - D.A.L. ( Laurent Guérin / ver 1.8 ) 52
  • 53. Other SQLDataSet capabilities Use the SQLDataSet definition for "count" int n = ds.count() ; Execute a "select count(*)" with the dataset definition criteria Load a "page" (a subset of the request result) Define the number of lines per page : def.setLinesPerPage(100); // default = 20 Load a page : ds.loadPage(2); The SQL request is executed, only the expected rows are retrieved from the JDBC ResultSet boolean b = ds.endOfResultSet(); To know if the last row of the ResultSet has been loaded Retrieve the SQL request : String sql = ds.getSqlRequest(); Telosys framework - D.A.L. ( Laurent Guérin / ver 1.8 ) 53
  • 54. THE END