模拟Hibernate的抓取

如果不使用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过去

使用这样的方法非常合适

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值