如果不使用Hibernate , 仅使用JDBC
以前觉得有点不方便,但是现在觉得,Hibernate也不是哪都适用
对于小项目来说,Hibernate反而是个累赘,还不如使用JDBC方便
使用JDBC查询的时候,有点不是很理想的是,返回的是ResultSet,而不是Bean
需要你再做一次转换,才能变成方便使用的Bean
而且,相较于Hibernate来说,抓取并自动填充Set,JDBC显得比较苍白无力
情景如下:
一个User实体,有uId,username,和group
/**.
* 用户
* @author eMavaj
* 2010-5-31
*/
public class User {
/**用户Id.*/
private int uid;
/**用户名.*/
private String username;
/**所属组.*/
private Group group;
/**.
* 构造函数
* @param uid 用户Id
* @param username 用户名
* @param group 所属组实体
*/
public User(int uid, String username, Group group) {
this.uid = uid;
this.username = username;
this.group = group;
}
(所有代码都省略getter、setter)
Group如下:
/**.
* 用户组
* @author eMavaj
* 2010-5-31
*/
public class Group {
/**组Id.*/
private int gid;
/**组名.*/
private String groupname;
/**用户集合.*/
private List<User> users;
/**.
* 构造函数
* @param gid 组Id
* @param groupname 组名
*/
public Group(int gid, String groupname) {
super();
this.gid = gid;
this.groupname = groupname;
}
现在需要加载Group,并且同时加载Group关联的User
(这里的明显是一对多关系,现在维护关系的是User端,也就是外键在User端)
如果用Hibernate这个根本不算是问题,但是JDBC不是那么好办
所以,写下一下方法,模仿Hibernate的抓取 ,来填充Set<User>这个集合
/**.
* 组实体交互对象
* @author eMavaj
* 2010-5-31
*/
public class GroupDao {
/**.
* 通过Id加载组,包括组内的用户
* @param id 组Id
* @return 组实体
*/
public Group loadGroupById(int id) {
/**执行SQL查询.*/
ResultSet rs = DataBaseUtil.getInstance().executeQuery(
"select g.*, u.* from t_group as g left join t_user as u on g.Id = u.group where g.gId = ?",
new Object[]{id});
/**存储实体.*/
Group group = null;
int gId = -1;
try {
while (rs.next()) {
/**看是否是同个实体.*/
int tempId = rs.getInt("gId");
if (tempId != gId) {
group = new Group(tempId, rs.getString("groupname"));
gId = tempId;
}
/**组下的实体.*/
User user = new User(rs.getInt("uId"), rs.getString("username"), group);
/**加入组.*/
group.getUsers().add(user);
}
} catch (SQLException e) {
e.printStackTrace();
}
return group;
}
}
先看sql语句:
select g.*, u.* from t_group as g left join t_user as u on g.Id = u.group where g.gId = ?
可以说和Hibernate输出的差不多,使用了Join的方式
目的是让返回的ResultSet的后面几行都是关联的User实体的信息!
(当然,前面几行虽然重复了Group信息,但是恰好用作标识,是否是同个Group实体的信息)
使用上面的方法遍历出Group和Set<User>信息,就可以组成对象,返回了
相对于直接返回ResultSet的方式相比,这样返回Bean的做法,确实多了一个循环的时间
但是,却方便了后续的一系列操作——操作Bean总比操作ResultSet方便吧
而且,有些场合,比如RMI、Flex等,不能传递ResultSet过去
使用这样的方法非常合适