I would recommend approach #1, but would use Spring for dependency injection rather than instantiating DAOs directly.
This way, for unit testing the client code, you can substitue mock DAOs, and verify that the correct DAOs are invoked with the appropriate arguments. (Mockito is useful here.)
If you use static methods, then unit testing is much more difficult, since static methods cannot be overridden.