EoD SQL has always been focused on flexability, and EoD SQL 2.0 is taking that concept even further.
To introduce this topic, I have some important points (some of which may already be known):
- EoD SQL understands Connection pooling
- Creating a Query instance with a DataSource is completely different to creating one with a Connection
- EoD SQL allows you to declare the type you want to return
- EoD SQL does not mangle your SQL, ever!
- You tell your database exactly what you want to
Here is a little example of some code that uses some of EoD SQL’s more advanced tricks:
public class User {
private static final UserQuery QUERY = QueryTool.getQuery(UserQuery.class);
@AutoGeneratedKeys
private Long id = null;
private String email;
private String password;
@ResultColumn( "display_name" )
private String displayName;
private User() {}
public User(String email, String password, String displayName) {
this.email = email;
this.password = password;
this.displayName = displayName;
}
public Long getId() {
return id;
}
public String getEmailAddress() {
return email;
}
public void setEmailAddress(String emailAddress) {
this.email = emailAddress;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getDisplayName() {
return displayName;
}
public void setDisplayName(String displayName) {
this.displayName = displayName;
}
public synchronized void save() throws SQLException {
if(id == null) {
id = QUERY.insert(this);
} else {
QUERY.update(this);
}
}
public static User getUser(long id) throws SQLException {
return QUERY.selectById(id);
}
public static User getUser(String email) throws SQLException {
return QUERY.selectByEmail(email);
}
}
The things to note in the above code:
And then the Query declaration:
public interface UserQuery extends BaseQuery {
@Select( "SELECT * FROM users WHERE id = ?1 LIMIT 1" )
public User selectById(long id) throws SQLException;
@Select( "SELECT * FROM users WHERE email = ?1 LIMIT 1" )
public User selectByEmail(String email) throws SQLException;
@Update( sql="INSERT INTO users (email, password, display_name) " +
"VALUES (?{1.email}, ?{1.password}, ?{1.displayName})",
keys=GeneratedKeys.RETURNED_KEYS_FIRST_COLUMN )
public long insert(User user) throws SQLException;
@Update( "UPDATE users SET email = ?{1.email}, password = ?{1.password}," +
"display_name = ?{1.displayName} WHERE id = ?{1.id}" )
public void update(User user) throws SQLException;
}
Things to note in the above code:
- The UserQuery instance QUERY in the User class is declared “static final”
- Because it is created with a DataSource, EoD SQL will automatically pull a Connection from the pool each time you run a query
- You need never close one of these Query objects, since the Connection is returned to the pool when you are no longer using it automatically
- Returning Database-Generated-Keys has become much easier in EoD SQL 2.0 as you can see from the “insert” method of the Query interface
- You are not forced to return a DataSet<User> in EoD SQL, you can return any type that EoD SQL understands (and it knows about quite a few)
- All the Java primitives and their wrapper classes
- Arrays
- UUID
- Any class you write that could be returned in a DataSet
- Many of the Collections types
- Collection
- List
- Set
- SortedSet