`
xinklabi
  • 浏览: 1591250 次
  • 性别: Icon_minigender_1
  • 来自: 吉林
文章分类
社区版块
存档分类
最新评论

ibatis queryForObject() 、queryForList()、queryForMap()

 
阅读更多

先说点基础的内容,iBatis并不是真正意义上的ORM,官方文档中称其为dataMapper,是数据映射器,也就是一种映射查询工具。iBatis不是万能的,在某些它不能处理的问题时,不能放弃使用JDBC API,那才是根本中的根本。
    在iBatis中,建议使用JavaBean,因为我们是面向对象的设计,那么在系统设计时肯定创建了很多刻画具体对象的类,使用JavaBean就可以直接操作getter方法来获取内容。就像是Hibernate中的PO一样。下面来说一种如何获取Bean中属性名称和属性类型的方法,这在开发时可能会用到。
    先定义一个JavaBean,刻画用户模型吗,如下:

Java代码  收藏代码
  1. package ibatis.model;  
  2. public class User implements java.io.Serializable {  
  3.     private Integer userId;  
  4.     private String userName;  
  5.     private String password;  
  6.     private String mobile;  
  7.     private String email;  
  8.     public User() {  
  9.         super();  
  10.     }  
  11.     public User(Integer userId, String userName, String password,  
  12.             String mobile, String email) {  
  13.         super();  
  14.         this.userId = userId;  
  15.         this.userName = userName;  
  16.         this.password = password;  
  17.         this.mobile = mobile;  
  18.         this.email = email;  
  19.     }  
  20. // 省略getter和setter方法  
  21.     @Override  
  22.     public String toString() {  
  23.         return "User [email=" + email + ", mobile=" + mobile + ", password="  
  24.                 + password + ", userId=" + userId + ", userName=" + userName  
  25.                 + "]";  
  26.     }  
  27. }  


    写一个方法来测试,如下:

Java代码  收藏代码
  1. public static void main(String[] args) {  
  2.     try {  
  3.         PropertyDescriptor[] pd = Introspector.getBeanInfo(User.class).getPropertyDescriptors();  
  4.         for (int i = 0; i < pd.length; i++) {  
  5.             System.out.println(pd[i].getName() + " ("  
  6.                     + pd[i].getPropertyType().getName() + ")");  
  7.         }  
  8.     } catch (IntrospectionException e) {  
  9.         e.printStackTrace();  
  10.     }  
  11. }  


    在控制台,我们获得如下输出:

Java代码  收藏代码
  1. class (java.lang.Class)  
  2. email (java.lang.String)  
  3. mobile (java.lang.String)  
  4. password (java.lang.String)  
  5. userId (java.lang.Integer)  
  6. userName (java.lang.String)  


    在定位BUG时,这是很好的一种手段。
    接下来,我们来说一下三个常用的查询方法,它们的命名和Spring的JdbcTemplate/SqlMapClientTemplate很像,但是要区分开。
首先是queryForObject()方法,它返回数据库查询的一条结果,并放入到Java对象中,这里的一条记录可以是一个JavaBean,也可以是Java的集合类型。它可以根据<select>标签中配置的resultClass属性来确定的,如果不指定resultClass属性,那么查询结果就是null了,因为iBatis不知道怎么处理这个结果,而且我们也没有配置结果映射(resultMap)。
    首先我们根据上面的User类型,将resultClass设置为User,代码如下:

Xml代码  收藏代码
  1. <sqlMap namespace="User">  
  2.     <typeAlias alias="User" type="ibatis.model.User" />  
  3.     <select id="getUserByName" parameterClass="java.lang.String"  
  4.         resultClass="User">  
  5.         select *  
  6.         from users  
  7.         where USERNAME=#VARCHAR#  
  8.     </select>  
  9. </sqlMap>  


    这时要求User类中必须要有一个默认的构造方法,否则将不能实例化这个对象,抛出异常,这一点不能忘记(如果重载了构造方法的话)。我们写一个程序:

Java代码  收藏代码
  1. System.out  
  2.         .println(sqlMap.queryForObject("User.getUserByName""sarin").getClass().getName());  


    此时,输出内容为:ibatis.model.User,这就很清楚的看到了,查询的结果类型是由<select>中的resultClass来确定的。
    queryForObject()的另外一个重载方法是Object queryForObject(String id, Object parameter, Object resultObject) throws Exception,这种方法是为对象不能轻易创建的情况使用的(如没有默认的构造方法的对象),那么使用前面那种格式就会抛出异常,就需要使用这种方法,看下面代码:(这里去掉User类中的默认构造方法)

Java代码  收藏代码
  1. User user=new User(nullnullnullnullnull);  
  2. user = (User) sqlMap.queryForObject("User.getUserByName""sarin",  
  3.                 user);  
  4. System.out.println(user);  


    这样才能获得user对象。
    第二个方法是queryForMap()方法,返回结果可以是一条,也可以是多条。它的方法签名有两种形式:第一种是Map queryForMap(String id, Object parameter, String key) throws SQLException,第二种是再多一个参数String value。前面两个参数好理解,就是select标签的id和传入的参数,而后面的key和value是什么意思呢?key指定了Map中存储的键,而value确定了存储的值,不设置value时则存储查询的一个对象,如下面代码(此时已经将select的resultClass设置为hashmap了):

Java代码  收藏代码
  1. Map map = sqlMap.queryForMap("User.getAllUsers"null,"userId");  
  2. System.out.println(map);  


    正如你所想,这段代码的输出为:

Java代码  收藏代码
  1. {1={email=gmail@gmail.com, userId=1, userName=sarin, password=123, mobile=15940912345}, 2={email=gmail@gmail.com, userId=2, userName=sarin, password=123, mobile=15940912345}}  


    这里的1和2就是key,是键,那么它们是什么类型的呢?我们使用如下代码来看看:

Java代码  收藏代码
  1. System.out.println(map.keySet().iterator().next().getClass());  


    得到结果:class java.lang.Integer,说明这是字段相对应的,因为这里我们没有将查询结果和JavaBean相关联。那么HashMap中存储的value是什么类型呢?我们来看,代码如下:

Java代码  收藏代码
  1. System.out.println(map.get(1).getClass());  


    打印得到:class java.util.HashMap,说明存储的还是HashMap。而queryForMap()的第二个重载方法则是指定了value的内容,我们来看:

Java代码  收藏代码
  1. Map map = sqlMap.queryForMap("User.getAllUsers"null"userId",  
  2.         "mobile");  
  3. System.out.println(map);  


    这将打印:{1=15940912345, 2=15940912345},这回就清楚了吧,而且得到的mobile的类型是String,也就容易理解了。记住一点,queryForMap()方法返回的可以是一条也可以是多条记录。但是在实践中往往用它来获取一条完整的记录,那么使用Map的get()方法就能获取到其中的值了,非常方便。
    下面来看queryForList()方法,同样,该方法的方法签名也有两类形式:第一类是queryForList(String id, Object parameter) throws SQLException,或者不需要参数,这很好理解了。看个例子:(SqlMap中的resultClass设置为hashmap)

Java代码  收藏代码
  1. List users = sqlMap.queryForList("User.getAllUsers");  
  2. System.out.println(users);  


    打印的结果是:

Java代码  收藏代码
  1. [{email=gmail@gmail.com, userId=1, userName=sarin, password=123, mobile=15940912345}, {email=gmail@gmail.com, userId=2, userName=sarin, password=123, mobile=15940912345}]  


    就是List中装入的是HashMap对象,在SqlMap中将hashmap换为User,那么得到:

Java代码  收藏代码
  1. [User [email=gmail@gmail.com, mobile=15940912345, password=123, userId=1, userName=nanlei], User [email=gmail@gmail.com, mobile=15940912345, password=123, userId=2, userName=sarin]]  


    queryForList()的第二类方法是queryForList(String id, Object parameter, int skip, int max) throws SQLException,可以看出后面多了两个int类型的参数,那么SQL中使用两个int类型的参数能干什么?分页,没错,这是主要应用。iBatis在queryForList()中提供了为分页提供支持的方法。记着skip是从0开始计算的,而max就是取出的条数,那么取前10条就是(0,10),取11~20条就是(10,10),以此类推。
    一家之言,仅供参考。欢迎交流。

分享到:
评论

相关推荐

    ibatis总结 ibatis ibatis ibatis ibatis

    Ibatis 是一款轻量级的Java持久层框架,它允许开发者将SQL语句与Java代码分离,从而使得数据库访问更加灵活、易于维护。本篇文章将深入探讨Ibatis的核心概念、最佳实践以及与其他框架如Struts和Spring的整合。 1. ...

    ibatis教程,ibatis帮助文档

    提供多种方法如queryForObject、queryForMap等,用于执行不同的查询或更新操作。 2. sqlmapconfig.xml:这是iBATIS的全局配置文件,包含了数据源、事务管理器和其他配置信息。 3. sqlmap.xml:每个数据库表对应的...

    ibatis基础教学文档

    提供了如queryForObject、queryForMap等方法来执行查询或更新操作。 2. sqlmapconfig.xml:这是全局配置文件,定义了数据源、事务管理器等系统级别的设置。 3. sqlmap.xml:每个数据库操作都有对应的XML映射文件,...

    ibatis ppt

    提供如queryForObject和queryForMap等方法来执行不同的查询操作。 2. sqlmapconfig.xml是全局配置文件,定义了数据库连接信息和其他配置。 3. sqlmap.xml包含具体的SQL映射,每个映射ID对应一个数据库操作。 4. 事务...

    ibatis教程.ppt

    提供多种方法如queryForObject、queryForMap等,用于执行不同的查询和更新操作。 2. sqlmapconfig.xml:这是iBATIS的全局配置文件,包含了数据源、事务管理器等配置信息。 3. sqlmap.xml:每个数据库相关的操作都会...

    ibatis教程 ppt

    提供了多种方法,如queryForObject和queryForMap,用于执行查询并返回单个对象或Map对象。 2. sqlmapconfig.xml:这是iBATIS的全局配置文件,包含了数据源、事务管理器、SqlMapClient的配置信息。 3. sqlmap.xml:...

    iBATIS 三个版对比

    - **iBATIS v2** 和 **iBATIS v3**:分别提供了`queryForObject`、`queryForList`、`selectOne`、`selectList`等方法。 执行方法的变化反映了iBATIS在不同版本中对于API设计的改进,使得用户可以更加方便地调用...

    ibatis与spring整合

    - `queryForList()`、`queryForMap()`、`queryForObject()`、`queryForPaginatedList()`等:用于执行各种类型的查询操作。 #### 四、ibatis与Spring的整合 为了更好地利用ibatis的功能,并充分利用Spring框架所...

    ibatis demo,ibatis例子,ibatis示例

    Ibatis,全称为MyBatis,是一个优秀的Java持久层框架,它主要负责SQL映射,使得开发者能够将SQL语句与Java代码分离,从而更好地管理数据库操作。Ibatis的出现,解决了传统JDBC中手动编写SQL和结果集映射的繁琐工作,...

    iBATIS-DAO-2.3.4.726.rar_com.ibatis.dao_iBATIS dao 2_iBatis DAO_

    iBATIS DAO是Java开发中的一个持久层框架,它提供了数据访问对象(DAO)的实现,使得数据库操作更加简单和灵活。在这个2.3.4.726版本的源码中,我们可以深入理解iBATIS DAO的工作原理,并通过添加注释来帮助我们更好...

    iBATIS 2.3 API JavaDoc chm格式

    它提供了执行SQL映射文件中定义的SQL语句的方法,如`queryForObject`,`queryForList`,`update`和`delete`等。 2. **SqlMapConfig.xml**:这是iBATIS的配置文件,包含了数据库连接信息、事务管理设置、数据源配置...

    ibatis Guide

    - 执行SQL:使用SqlMapClient的queryForObject()、queryForList()、insert()、update()和delete()等方法执行SQL语句。 - 参数传递:使用命名参数或索引参数将值传递给SQL语句。 #### OR映射 ibatis支持多种对象...

    ibatis源码,ibatis源码 ibatis源码 ibatis源码

    《深入解析iBatis源码》 iBatis,一个优秀的Java持久层框架,以其轻量级、灵活的特性在众多ORM(Object-Relational Mapping)框架中独树一帜。iBatis的核心在于它的SQL映射机制,它将数据库操作与业务逻辑解耦,...

    ibatis的使用教程

    例如,使用 `sqlMapClient.queryForObject(id, parameter)` 执行查询,`sqlMapClient.insert(id, parameter)` 插入数据等。 **Ibatis API** Ibatis 提供了一些基本的API,如查询、添加、删除和修改方法。通常,会...

    Spring对IBatis的整合

    return getSqlMapClientTemplate().queryForList("getProductListByCategory", categoryId); } public Product getProduct(String productId) throws DataAccessException { return (Product) ...

    ibatis2.0开发指南 ibatis开发必备

    - SqlMapClient是iBATIS的核心接口,提供执行SQL语句的方法,如`queryForObject()`, `queryForList()`, `insert()`, `update()` 和 `delete()`。 - 示例代码展示了如何使用SqlMapClient进行CRUD操作。 7. **OR...

    ibatis api,ibatis文档,ibatis说明文档

    Ibatis,全称为MyBatis,是一个优秀的Java持久层框架,它主要负责SQL映射,将数据库操作与业务逻辑解耦,使得开发者可以更专注于业务逻辑的实现,而无需关心繁琐的SQL语句编写。本篇文章将深入探讨Ibatis API、文档...

    iBATIS 2.0 开发指南

    - 执行 SQL 语句:调用 `queryForList` 或 `queryForObject` 方法执行查询操作。 - 更新操作:调用 `update` 方法执行更新操作。 #### OR 映射 - **一对多关联**:通过 `&lt;association&gt;` 元素定义一对多的关系,...

    Ibatis入门例子,Ibatis教程

    Ibatis,全称为MyBatis,是一个优秀的Java持久层框架,它主要负责SQL映射,使得开发者能够将注意力集中在编写SQL语句上,而无需关注JDBC代码的编写。Ibatis消除了几乎所有的JDBC代码和手动设置参数以及获取结果集的...

    ibatis应对批量update

    ### ibatis应对批量update 在处理大量数据更新时,传统的for循环方式往往会导致效率低下。这是因为每一次循环都需要执行一次数据库连接操作,对于批量更新来说,这样的处理方式显然不够高效。为了解决这个问题,...

Global site tag (gtag.js) - Google Analytics