:-D
Great, exactly.
This is the point - it removes a lot of code - it is magic - and thus
smells of ... air - unless you are used to it.
You avoid carrying around a JDBC connection object or a reference to
something like jdbcTemplate.
Suppose you write a web application and in your servlet code or page
code you have a single try finally block that opens and closes the
database connection.
Within that block you call into your business code and your business
code uses various database queries - all against the connection that
you manage with the try catch block.
The reason it is a stack of connections and just one connection - is
that a stack allows you to use multiple databases / connections - so
this would work:
public long accountBalance(int accountId) {
openConnection("accounting");
try {
return queryScalar(Integer.class, "select balance from account
where id=?", accountId);
} finally {
closeConnection();
}
}
int accountId = 27;
try {
openConnection("logging");
update("insert into log(account_id, balance) values(?, ?)",
accountId, accountBalance(accountId));
} finally {
closeConnection();
}
On Feb 22, 7:59 pm, Robert Fischer <[email protected]>
wrote:
> Now you've shifted the problem from a plumbing issue to a magical state
> issue. This is a major code
> smell and complicates the API in nonobvious (to the user) ways.
>
> (Of course, I'm the guy who also finalizes his method arguments. So I've got
> some wacky opinions
> relative to Java norms.)
>
> ~~ Robert.
>
>
>
> Christian Hvid wrote:
> > But you can leave it up to the caller to open the connection - meaning
> > you just don't open or close any connections.
>
> > public int getUserCount() {
> > return queryScalar(Integer.class, "select count(*) from people");
> > }
>
> > And then have the calling code open and close the connection:
>
> > openConnection();
> > try {
> > ...
> > getUserCount();
> > ...
> > } finally {
> > closeConnection();
> > }
>
> > (The idea is that there is a stack of connections and when you do
> > something you always use the connection at the top of the stack.)
>
> > On Feb 22, 7:24 pm, Robert Fischer <[email protected]>
> > wrote:
> >> The problem is this code:
>
> >> public int getUserCount() {
> >> openConnection();
> >> try {
> >> return queryScalar(Integer.class, "select count(*) from
> >> people");
> >> } finally {
> >> closeConnection();
> >> }
>
> >> }
>
> >> That's 1 semantically meaningful line surrounded by 5 lines of boilerplate
> >> plumbing. Which means
> >> that it's really 1/6th actual code, and 5/6th noise. That's a pretty poor
> >> signal to noise ratio.
>
> >> It's even worse when you're dealing with raw JDBC calls, since you have to
> >> think about preparing
> >> statements and managing connections and data sets and the like.
>
> >> ~~ Robert.
>
> >> Christian Hvid wrote:
> >>> I don't understand - why would that be a problem? (That you have
> >>> explictly open and close your database connection).
> >>> On Feb 22, 7:09 pm, Robert Fischer <[email protected]>
> >>> wrote:
> >>>> +1 for Spring JDBC: it manages all that openConnection/closeConnection
> >>>> noise for you, which means
> >>>> that your JDBC code can *also* start to be expressive.
> >>>> ~~ Robert.
> >>>> Rakesh wrote:
> >>>>> have you looked at Spring JDBC? It has a similar interface and manages
> >>>>> the connections for you.
> >>>>> I think if you go down a non-orm route and want to have lots of sql,
> >>>>> Ibatis is quite common - not used it so can't say for sure.
> >>>>> Spring JDBC though is very nice and have used it extensively.
> >>>>> Rakesh
> >>>>> On Sun, Feb 22, 2009 at 2:21 PM, Christian Hvid
> >>>>> <[email protected]> wrote:
> >>>>>> Hi Java people.
> >>>>>> I have been toying with simplier ways of doing embedded SQL in Java.
> >>>>>> And would like your comments on this one?
> >>>>>>http://code.google.com/p/chalkmine/
> >>>>>> It allows you to write code like this:
> >>>>>> openConnection();
> >>>>>> try {
> >>>>>> int count = queryScalar(Integer.class, "select count(*) from
> >>>>>> people");
> >>>>>> System.out.println("There are "+count+" people in the bin.");
> >>>>>> } finally {
> >>>>>> closeConnection();
> >>>>>> }
> >>>>>> or
> >>>>>> openConnection();
> >>>>>> try {
> >>>>>> List<Person> people = queryList(Person.class, "select name,
> >>>>>> time_in_the_bin from people");
> >>>>>> for (Person p : people)
> >>>>>> System.out.println(p.getName()+" has been "+p.getTimeInTheBin()
> >>>>>> +" hours in the bin.");
> >>>>>> } finally {
> >>>>>> closeConnection();
> >>>>>> }
> >>>>>> (Provided that Person has a constructor matching the types of name,
> >>>>>> time_in_the_bin. Probably Person(String, int).)
> >>>>>> Where the methods openConnection, queryScalar, queryList,
> >>>>>> closeConnection are statically imported.
> >>>>>> openConnection() figures out the name of the calling class, looks up a
> >>>>>> configuration, opens a connection and puts in a ThreadLocal container.
> >>>>>> queryScalar(Class, String, ...) performs a query with a single row
> >>>>>> result that is "cast" to the given class.
> >>>>>> queryList(Class, String, ...) performs a query and returns the result
> >>>>>> as a list of the given class.
> >>>>>> I would like to turn it into a full-fledged open source project.
> >>>>>> But since it is incredibly hard for a new open source project to gain
> >>>>>> traction I would like to figure out whether it is interesting enough
> >>>>>> first.
> >>>>>> -- Christian
> >>>> --
> >>>> ~~ Robert Fischer.
> >>>> Grails Training http://GroovyMag.com/training
> >>>> Smokejumper Consultinghttp://SmokejumperIT.com
> >>>> Enfranchised Mind Bloghttp://EnfranchisedMind.com/blog
> >>>> Check out my book, "Grails Persistence with GORM and
> >>>> GSQL"!http://www.smokejumperit.com/redirect.html
> >> --
> >> ~~ Robert Fischer.
> >> Grails Training http://GroovyMag.com/training
> >> Smokejumper Consultinghttp://SmokejumperIT.com
> >> Enfranchised Mind Bloghttp://EnfranchisedMind.com/blog
>
> >> Check out my book, "Grails Persistence with GORM and
> >> GSQL"!http://www.smokejumperit.com/redirect.html
>
> --
> ~~ Robert Fischer.
> Grails Training http://GroovyMag.com/training
> Smokejumper Consultinghttp://SmokejumperIT.com
> Enfranchised Mind Bloghttp://EnfranchisedMind.com/blog
>
> Check out my book, "Grails Persistence with GORM and
> GSQL"!http://www.smokejumperit.com/redirect.html
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "The
Java Posse" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/javaposse?hl=en
-~----------~----~----~----~------~----~------~--~---