iBatis查询API

阅读更多
    先说点基础的内容,iBatis并不是真正意义上的ORM,官方文档中称其为dataMapper,是数据映射器,也就是一种映射查询工具。iBatis不是万能的,在某些它不能处理的问题时,不能放弃使用JDBC API,那才是根本中的根本。
    在iBatis中,建议使用JavaBean,因为我们是面向对象的设计,那么在系统设计时肯定创建了很多刻画具体对象的类,使用JavaBean就可以直接操作getter方法来获取内容。就像是Hibernate中的PO一样。下面来说一种如何获取Bean中属性名称和属性类型的方法,这在开发时可能会用到。
    先定义一个JavaBean,刻画用户模型吗,如下:
package ibatis.model;
public class User implements java.io.Serializable {
	private Integer userId;
	private String userName;
	private String password;
	private String mobile;
	private String email;
	public User() {
		super();
	}
	public User(Integer userId, String userName, String password,
			String mobile, String email) {
		super();
		this.userId = userId;
		this.userName = userName;
		this.password = password;
		this.mobile = mobile;
		this.email = email;
	}
// 省略getter和setter方法
	@Override
	public String toString() {
		return "User [email=" + email + ", mobile=" + mobile + ", password="
				+ password + ", userId=" + userId + ", userName=" + userName
				+ "]";
	}
}

    写一个方法来测试,如下:
	public static void main(String[] args) {
		try {
			PropertyDescriptor[] pd = Introspector.getBeanInfo(User.class).getPropertyDescriptors();
			for (int i = 0; i < pd.length; i++) {
				System.out.println(pd[i].getName() + " ("
						+ pd[i].getPropertyType().getName() + ")");
			}
		} catch (IntrospectionException e) {
			e.printStackTrace();
		}
	}

    在控制台,我们获得如下输出:
class (java.lang.Class)
email (java.lang.String)
mobile (java.lang.String)
password (java.lang.String)
userId (java.lang.Integer)
userName (java.lang.String)

    在定位BUG时,这是很好的一种手段。
    接下来,我们来说一下三个常用的查询方法,它们的命名和Spring的JdbcTemplate/SqlMapClientTemplate很像,但是要区分开。
首先是queryForObject()方法,它返回数据库查询的一条结果,并放入到Java对象中,这里的一条记录可以是一个JavaBean,也可以是Java的集合类型。它可以根据 select * from users where USERNAME=#VARCHAR#
    这时要求User类中必须要有一个默认的构造方法,否则将不能实例化这个对象,抛出异常,这一点不能忘记(如果重载了构造方法的话)。我们写一个程序:
		System.out
				.println(sqlMap.queryForObject("User.getUserByName", "sarin").getClass().getName());

    此时,输出内容为:ibatis.model.User,这就很清楚的看到了,查询的结果类型是由