2. 5/17/2012 2
About Will
• Will Iverson
• CTO, Dynacron Group
• Personal Background
• Professional software
dev/architect/consulting since
1995
• Roles:
Apple, Symantec, SolutionsIQ
• Clients: Sun, BEA, Canal+, T-
Mobile, at&t, Microsoft, State of
WA
• ORM Patent Case
• 4 books, many articles
3. 5/17/2012 3
About Dynacron Group
• Established mid-2010
• Technology Consulting (Java, .NET, BI)
• ~25 consultants (& growing, see site for info)
• Key differentiation: Continuous Delivery
• People
• Deep roots in Seattle region
• TPM/ScrumMaster, Sr Dev, Sr SDET, DevOps
• Process
• Blend of Agile (Scrum/Kanban/XP), heavy use of TDD, automation
• Tools
• Leverage cloud in client friendly-way (e.g. start with testing)
• Manage source & binaries (CI, automated release)
4. Problem
• Need to save data
• Preferably ACID!
• No need to reinvent wheel
• Hand-crafted JDBC is annoying & error-prone
• Code generation is… sort of ok…
• But runtimes are better
• Relational databases are pretty darn popular
• Tools, extensive knowledge
• Not going away any time soon
5. Possible Solutions
• JPA
• Really, Hibernate
• myBatis
• Spring JDBC
• Hybrid of myBatis approach + native JDBC…
• All others = essentially no adoption
• Measured by # of downloads, search volume, job postings, etc…
• What about NoSQL…?
• Cassandra, MongoDB, CouchDB…
• http://kkovacs.eu/cassandra-vs-mongodb-vs-couchdb-vs-redis
• MySQL makes an ok NoSQL (see SauceLabs post)
6. Really Different Approaches
• ORM (JPA/Hibernate)
• Generates SQL from object graph
• Proxy objects
• DOA if you can’t talk to the DB directly
• Most popular choice (Hibernate)
• Mapping (MyBatis)
• Make it easy to write and map result sets to Java
• All other (relational) frameworks are essentially noise in terms
of market adoptions
• As measured by # of downloads, search volume, job postings, etc…
7. Hibernate
Heart of the
Proxy DataApplication
difference
w/myBatis
HibernateData
Proxy Session Hibernate Session
(1st Level Cache) (1st Level Cache)
Data
Hibernate • LazyInitializationException
2nd Level Cache • SessionException
• StaleSessionException
• TransientObjectException
• PersistentObjectException
Data RDBMS
8. Comparisons
• Hibernate
• Manual is 391 pages (and you will need a book)
• Many dependencies
• Based on JPA
• Study the code for years and still be learning
• MyBatis
• Manual is 73 pages (in a bigger font)
• One tiny library
• No standard
• Code review in a day
9. ORM Cool/Scary Example
List result = session.createQuery( "from Event" ).list();
for (Event event : (List<Event>) result ) {
println(event.getDate() + “:" + event.getLocation() );
}
Question: How much data, in how many queries, will this snippet
of code result in?
A: Impossible to tell from this snippet. Depends on many factors. Mapping
configuration for Event, Location objects and associations, as well as the cache
configuration. Fixing one code execution path, for example, eager fetching
Location, will cause potential problems elsewhere. So, this could result in
N*N, (N+1), 1, or even 0 requests.
10. JPA
• Graphs of objects in memory
• Linked to corresponding data structures in RDBMS
• Non-trivial examples require careful understanding of
entire structure
• Promise: Learn JPA, never worry about SQL
• Reality: Must have a VERY solid understanding of
SQL, Java, and JPA
• In particular, the query and criteria APIs
• Need to understand sessions and object scope as relates to
sessions
11. Hibernate Session Complexity
• What happens if object
Open Session
accessed outside of
session? Create Transaction
• Outside transaction?
Flush
• Cache status? SQL Statement
Transaction
Session
• Objects have LOTS of SQL Statement
hidden state associated SQL Statement
• Proxy-based access Flush
• Really, really complex if SQL Statement
SQL Statement
those objects are intended
for presentation Commit Transaction
• Web services
• User interfaces
Close Session
• Very complex serialization
scenarios
13. Personal Interest
• Finished project that ran from 2008-2010
• Numerous challenges (blend of team + Hibernate)
• Starting new project in 2010
• Just needed to wrap a few sprocs
• Hibernate seemed like overkill
• Really liked the annotation-only approach
• iBatis based on XML… XML is fine for config, but
dev? Bleah.
14. Brief History
• Started as part of a JPetStore demo in 2002
• iBatis 2.0 named & released in 2004
• Donated to ASF
• Moved from ASF, renamed myBatis 3.0 in 2010
• Released via Google Code
• Complete redesign (based on TDD, simplicity, etc.)
15. MyBatis Approach
• Write queries in SQL
• Map result sets to data objects via annotations
• Get objects back
• (Optional) use generator
• (Optional) cache result sets
•…
• That’s basically it.
18. Configuration (Conceptual)
• Session Factory
• Static, thread-safe factory
• Attach mappers at bootstrap
• With annotations, mappers are just interfaces with
annotations
• With Spring, easy drop mapper interface into context
19. Mappers
• XML or Annotations
• Annotations = simple interfaces w/annotations
(no implementation!)
public interface UserMapper {
@Insert({ "insert into user (nickname, email) values (#{nickname},
#{email})" })
@Options(useGeneratedKeys = true, keyProperty = "id")
int insert(User user);
@Select("select count(*) from user")
long count();
@Delete({ "delete from user where id = #{id}" })
void deleteById(User user);
}
20. Usage
• Simply ask the session for mapper instance
• Call method & get data
• Begin transaction, commit, and rollback
handled once via standard utility wrapper
• (e.g. Spring or custom)
user = session.getMapper(UserMapper.class);
return user.count();
21. Available Annotations
• Cache (support for wide variety)
• Mappings (result set -> Java object[s])
• Identifier mapping
• Static statements
• Dynamic statements
• Parameters
22. Other Features
• Generator (demo)
• Migrations (discuss if time)
• Maven plugin
• Integrations
• Spring, Guice, Scala
• OSCache, EhCache, Hazelcast
23. Things You Don’t Do With MyBatis
• Don’t Do
• Object proxies
• Complex object lifecycles
• Could Do (But Don’t)
• Build highly complex mapping graphs
24. Comparison
Topic JPA/Hibernate myBatis
Developer Java, SQL, HQL, Criteria Java, SQL
productivity
Caching strategies Two level cache One level cache
Debugging Complex Simple (except for more
complex mappings, which are
localized)
Transaction One transaction per session Ironically, easier to use with
management w/open-session-in-view only Spring TX.
sane route: Spring TX =
insanity
Schema management Built-in validation. Upgrade Real migrations (but requires
but not real migrations hand-rolling)
Session Management Open-session-in-view only Open-session-in-view, or not
sane route (simplified object lifecycle)
25. Thoughts: Hibernate/JPA vs. MyBatis
• MyBatis is much, much simplier • People don’t use most of Hibernate
• Hibernate/JPA require learning HQL • Don’t understand complex
• Criteria queries are better for simple mappings
things • Miss a lot of the benefit
• In practice, this means you have • Sessions & Object attachment in
three data APIs, SQL, Criteria & HQL Hibernate/JPA is very complex
• HQL only for hard stuff • Two different cache levels, objects
• Find it much faster to just knock out may or may not be attached to
query in SQL, pop in annotation and session – at runtime often feels non-
call it good
deterministic
• Most missed from Hibernate
• Bootstrap validation of expected
schema
26. MyBatis Negatives?
• Over apx 1 year project, asked several people on team
for thoughts
• Only cited issue was compatibility with legacy stored
procedure
• Team was unable to diagnose why sproc wouldn’t load into
mapping
• Worked around by updating sproc
• Everyone agreed MyBatis was much simpler & easier to use
• Really liked the Spring integration
• 1 person cited Spring JDBC as pretty darn easy too