Personally, it looks to me you have too many exceptions. Think from the client side, how many exceptions do the client code need to catch?
I'm doing URLyBird, and I use a service layer between database and client. I have 2 exceptions (DatabaseException and RemoteException from RMI or some server exception if you like) to worry about at the end. My DB interface has 2 exceptions: RecordNotFoundException and DuplicateKeyException. In my service layer I catch these then throw my DatabaseException.
Talking about RuntimeException why need to have a SystemException? Are you planning to throw runtime exception?
Also I don't recommend making the exceptions from DB interface a subclass of your own DatabaseException or
Java's exception subclass such as IOException. Just make it subclass Exception will be fine. This is because the behavior may be different.