Clinton R. Begin
2 Dealing with Enterprise Database Challenges Featuring the Apache iBATIS Data Mapping Framework Clinton Begin
3 Demo… Just move data from here to there.
4 Scope The Challenges Ownership, access, complexity, normalization, skinny design. iBATIS Data Mapping Framework Introduction, SQL Mapping defined, examples. SQL Is it still relevant? iBATIS is a hybrid solution Features, qualities, competition, other solutions.
5 The Challenges “Welcome, to the real world.” – go for the red pill
6 Challenges of Politics Database ownership and control Change management Cost allocation – who pays for changes? No “developer” access to design Proprietary/3 rd Party – legal issues Agile methods vs. legacy methods
7 iBATIS isolates the data model, the SQL, the work and the responsibility. In doing so, it isolates much of the politics surrounding the enterprise database as well.
8 Challenges of Imperfection Denormalized models Super-normalized models Modeled Value Entities Thin data models (rows vs. columns) Implicit relationships Overcomplicated relationships Null Values (?)
9 Thin data model GroupNameTypeValue 1StreetString12 Some St 1CityStringModesto 1StateStringCalifornia 1ZipString StreetString543 Other St 2CityStringFresno 2StateStringCalifornia 2ZipString34332
10 iBATIS works even when the data model does not map to the object model.
11 Challenges of Legacy and complexity Too many tables to map Encoded Fields No primary keys Hierarchical ERP systems Temporal databases “600 tables” – moderate size (?)
12 iBATIS allows you to build modern applications on top of legacy databases by allowing you more freedom to define and tune your mappings that deal with “unique” databases.
13 Challenges of Technology Distributed transactions Distributed caching Vendor specific database features Multiple databases w/ single object model
14 iBATIS supports advanced enterprise features and allows you to take full advantage of the investment you’ve made in your relational database management system.
15 An Introduction to Apache iBATIS SQL Mapping defined…
16 SQL Mapping Concept
17 SELECT FIRST_NAME, LAST_NAME FROM EMPLOYEE WHERE EMPLOYEE_NUMBER = ‘1234’ INPUT OUTPUT SQL as a Black Box
18 SQL Mapping Maps objects to SQL statements NOT Classes to Tables Fully functional SQL via named statements NOT generated SQL (although that’s possible) For example…
19 id : int total : BigDecimal pst : BigDecimal gst : BigDeciml lineItems : Collection date : Date Order id : int product : Product order : Order cost : BigDecimal retail : BigDecimal LineItem id : int name : String description : String cost : BigDecimal retail : BigDeciml Product Order LineItem Product Mapping Layer TABLES CLASSES
20 id : int total : BigDecimal pst : BigDecimal gst : BigDeciml lineItems : Collection date : Date Order id : int product : Product order : Order cost : BigDecimal retail : BigDecimal LineItem id : int name : String description : String cost : BigDecimal retail : BigDeciml Product Order LineItem Product Mapping Layer SQL TABLES CLASSES
21 The Product Table PRODUCT PRODUCT_IDINTEGERPK, NN NAMEVARCHARNN DESCRIPTIONTEXTNN COSTMONEYNN RETAILMONEYNN
22 The Product Class public class Product { private int id; private String name; private String description; private BigDecimal cost; private BigDecimal retail; //…getters/setters implied }
23 The SQL SELECT PRODUCT_ID as id, NAME, DESCRIPTION, COST, RETAIL, FROM PRODUCT WHERE PRODUCT_ID = #id#
24 Simple Configuration String resource = “SqlMapConfig.xml”; Reader reader = Resources.getResourceAsReader (resource); SqlMapClient sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
25 Executing the Query Product product = (Product) sqlMap.queryForObject (“getProduct”, 5);
26 … Audience: OMG! Did you just hand code SQL? Clinton: Yes. …
27 SQL Is it still relevant?
28 SQL Structured Query Language Introduced in 1973 by IBM Based on relational model of 1970 Based on sound mathematical principles Significant industry investment Has withstood the test of time Nothing else has ever come close
29 “SQL is much more than a simple data update and retrieval mechanism. SQL's query processing can perform many tasks. By hiding SQL, application developers are excluding a powerful tool.”
30 Writing SQL is NOT a Sin!
31 Is SQL what we want to avoid? SELECT * FROM EMPLOYEE WHERE EMPLOYEE_NUMBER = 99
32 Or is it JDBC? public Employee getEmployee (int id) throws SQLException { Employee employee = null; String sql = "SELECT * FROM EMPLOYEE " + "WHERE EMPLOYEE_NUMBER = ?"; Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try { conn = dataSource.getConnection (); ps = conn.prepareStatement(sql); ps.setInt(1, id); rs = ps.executeQuery(); employee = null; while (rs.next()) { employee = new Employee(); employee.setId (rs.getInt("EMP_ID")); employee.setEmployeeNumber (rs.getInt("EMP_NUMBER")); employee.setFirstName (rs.getString("EMP_FIRST_NAME")); employee.setLastName (rs.getString("EMP_LAST_NAME")); employee.setTitle (rs.getString("EMP_TITLE")); } } finally { try { if (rs != null) rs.close(); } finally { try { if (ps != null) ps.close(); } finally { if (conn != null) conn.close(); } return employee; }
33 iBATIS is a hybrid solution Qualities, features and competition.
34 Options… Stored procedures Inline SQL Dynamic SQL Object Relational Mapping iBATIS IS A HYBRID!
35 A Hybrid? Full support for stored procedures SQL is written just like inline SQL “Inline SQL for XML” Advanced dynamic SQL definition features A big problem even for the best ORM tools Shares many features with ORM Caching, lazy loading, join mapping, bytecode enhancement etc.
36 Apache iBATIS… Is tolerant of complex/bad database designs Isolates the data model Separates concerns Divides labor Saves time Reduces code
37 Advanced iBATIS Features Supports all types Objects, Primitives, Arrays, Collections Caching (use case vs. holistic) Lazy Loading or Join Mapping (1:1, 1:M, M:N) Bytecode enhancement (ifaces AND classes) XML parameters and results Transaction Management (Local/Global)
38 But yes…SQL Coding is Required Many people consider this an advantage Many others eventually realize it’s required Few people consider it a problem SQL can be done fast and done well Use good tools (there are plenty) Generation is an option (but not a best practice) The SQL may already exist (consider app rewrites or ports)
39 Other “SQL Mapper-Like” Tools JDBC PreparedStatement Embedded SQL as a language feature Pro*C, Forte TOOL, SQLJ Spring framework Voruta SQLC (iBATIS inspired?) O/R Broker (iBATIS inspired) Mr. Persister (iBATIS inspired) Aximol SQL Library (iBATIS inspired)
40 iBATIS 3 Years ago JPetStore posted on TSS iBATIS noticed in the persistence layer Architectural reviewer said: “Use Torque” Why not just use ORM for everything? What kept it going…?
41 What drives open source? Frustration / Anger / Need Confidence / Ego Pride Duty Community
42 iBATIS Today ~10,000 users ~1.2 Million DTD hits per month from tools Apache Software Foundation 12 Developers Java,.NET, Ruby
43 Audience Response Questions?
44 More simple examples… To inspire questions or support answers.
45 select PRODUCT_ID as id, NAME as name, DESCN as description, CATEGORY as category from PRODUCT where PRODUCTID = #id#
46 select * from PRODUCT where PRODUCTID = #id#
47 select PRODUCT_ID as id, NAME as name, DESCN as description, CATEGORY as category from PRODUCT where PRODUCTID = ?
48 insert into PRODUCT values (#id#,#name#,#description#,#category#) update PRODUCT set NAME = #name#,DESC = #description#,CATEGORY=#category# where PRODUCT_ID = #id# delete PRODUCT where PRODUCT_ID = #id#
49 Simple Query Product product =(Product) sqlMap.queryForObject (“getProduct”, 23);
50 Insert, Update, Delete Product product = new Product(); product.setId(324); product.setName(“Shih Tzu”); Product.setDescription(“Some longer description.”); product.setCategory(“DOG”); sqlMap.insert(“insertProduct”, product); product.setCategory(“CAT”); sqlMap.update(“updateProduct”, product); product.delete(“deleteProduct”, product);
51 Transaction Handling try { sqlMap.startTransaction(); sqlMap.insert(“insertProduct”, product); sqlMap.update(“updateProduct”, product); product.delete(“deleteProduct”, product); sqlMap.commitTransaction(); } finally { sqlMap.endTransaction(); }
52 What does an application using SQL Maps look like? See JPetStore 4