- 浏览: 932930 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (251)
- WebService (17)
- IBatis (22)
- Hibernate (1)
- SpringMVC - 基础篇 (32)
- Spring (15)
- Java (11)
- JVM及调优 - 基础篇 (4)
- 集群 (14)
- 数据库 (17)
- WebSphere (5)
- 多线程 (4)
- 集合、容器 (2)
- DB Pool (1)
- Power Designer (5)
- Maven基础 (5)
- JS (14)
- WEB 前端 (5)
- 实用小工具 (17)
- 社会、人 (2)
- 乱七八糟 (18)
- ASM&CGLIB - 基础篇 (12)
- 缓存 (1)
- 性能 (1)
- 设计之殇 (1)
- 分布式事务 (1)
- 单点登录 (11)
- 分布式 Session (4)
- Memcached - 基础篇 (6)
最新评论
-
一笑_奈何:
楼主写的还真行不错。
扫盲贴 - J2EE集群之JNDI集群实现 -
xuezhongyu01:
博主写的很详细,但最后还是没明白,最后调用BasicDataS ...
Spring中的destroy-method方法 -
Mr梁:
commons-fileupload.jar commons- ...
SpringMVC 中文件上传 MultipartResolver -
Eywa:
总结的很不错
ORACLE CASE WHEN 及 SELECT CASE WHEN的用法 -
TryRelax:
fastjson 比 jackson 好用吧?
Spring MVC Jackson DateFormat
转载:http://sarin.iteye.com/blog/731655
<select>是iBatis已经映射的语句类型,就是查询了,为了配合说明,
这里再介绍两个标记:<sql> 和<include>,
前者用来创建一个文本片段,这些片段可以组合起来创建完整的SQL语句;
后者很显然就是包含的意思了。
假设我们有如下 代码段:
- <sql id="select-user">
- select * from users
- </sql>
- <sql id="select-count">
- select count(*) as value from users
- </sql>
- <sql id="where-age-over-value">
- <![CDATA[
- where age > #value:INT#
- ]]>
- </sql>
- <select id="getUserAgeOver" resultClass="hashmap">
- <include refid="select-user" />
- <include refid="where-age-over-value" />
- </select>
- <select id="getUserCountAgeOver" resultClass="int">
- <include refid="select-count" />
- <include refid="where-age-over-value" />
- </select>
该部分代码展示了sql和include的使用,其中使用了CDATA段,这是因为XML标签本体中出现了于XML标签冲突的字符,这很好理解。后面两个查询就是我们执行的语句部分,程序代码可以这么来写:
- List users = sqlMap.queryForList("User.getUserAgeOver","23");
- System.out.println(users);
- int userCount = (Integer) sqlMap.queryForObject(
- "User.getUserCountAgeOver", "22");
- System.out.println(userCount);
如果可以查询到记录,那么就会打印出来了。上面的例子中我们是用了#来标识传递的参数,#被成为占位符,这是内联参数的传递方式的一种。
- <select id="getUserById" resultClass="User">
- select
- userId,
- userName,
- password,
- age,
- mobile,
- from
- users
- where
- userId = #value#
- </select>
在程序中,用下面这些代码就能达到查询效果了。
- User user = (User) sqlMap.queryForObject("User.getUserById", new Integer(1));
- System.out.println(user);
#value#是告诉iBatis传递一个简单的参数,iBatis处理该语句时,将会把#value#转换为预处理参数形式,然后将这个参数的值设置为
1(就是queryForObject()方法的第二个参数),之后执行该预处理语句。最后iBatis接受返回的结果,然后把它映射到一个Java对象
并返回该对象,这就是sqlMap的执行过程。
下面来看另外一种内联参数形式,就是使用$作为占位符。它可以直接把参数插入到SQL语句中,这在该SQL语句被转变为参数化语句之前就执行了。如此就会留下安全隐患,它可能给SQL注入有机可乘,而且过度使用还会有性能问题,看下面这个语句:
- <select id="getUserByLikeEmail" resultClass="User">
- select
- userId,
- userName,
- password,
- age,
- mobile,
- from
- users
- where
- email like '%$value$%'
- </select>
在程序中,我们可以使用如下代码来执行模糊查询:
List<User> users = sqlMap.queryForList("User.getUserByLikeEmail", "gmail");
System.out.println(users);
若要使用#方式来当占位符,那么模糊查询时可能不是那么方便,需要如下进行:email like concat('%',#value#,'%'),这是MySQL的情况。所以模糊查询使用$比较方便。
以上的查询中我们使用了resultClass这种自动结果映射,这是iBatis的一种执行机制,
而我们也可以进行自定义结果映射,就是使用resultMap。
如果我们在查询中两者都没有使用的话,那么iBatis执行查询但是不能返回任何东西。
当我们使用bean作为结果映射时要注意如果结果列存在于数据库而不存在于bean中,那么我们不会得到任何数据,而且执行不会报错。
自动映射使用起来很方便,但是更稳健的要数外部结果映射了。
如果语句中的字段可变,那么可以使用动态结果映射,如:
- <select id="getUserByLikeEmail" resultClass="User" parameterClass="parameterMap">
- select
- userId,
- userName,
- <dynamic>
- <isEqual property="includePassword" compareValue="true">
- password,
- </isEqual>
- </dynamic>
- age,
- mobile,
- from
- users
- where
- email like concat('%',#email#,'%')
- </select>
程序中我们先定义一个ParameterMap类型,然后执行查询,如下:
- ParameterMap params = new ParameterMap("email", "gmail",
- "includePassword", true);
- List users = sqlMap.queryForList("User.getUserByLikeEmail", params);
- System.out.println(users);
这样我们就能人为控制password字段是输出了。下面我们来看外部参数映射,使用外部参数映射主要是在XML中定义parameterMap,标识它
的id和class后再在其中定义parameter,它包括如下属
性:property,javaType,jdbcType,nullValue,mode和typeHandler。要区分这和我们上面定义的
ParameterMap类型是两回事。我们定义的ParameterMap是如下定义的:
- package ibatis.util;
- import java.util.HashMap;
- public class ParameterMap extends HashMap<Object, Object> {
- private static final long serialVersionUID = 1L;
- public ParameterMap(Object... parameters) {
- for (int i = 0; i < parameters.length - 1; i += 2) {
- super.put(parameters[i], parameters[i + 1]);
- }
- }
- }
它是作为辅助类来用的,给SQL语句提供参数,在配置文件中,我没使用的是typeAlias来为它重命名的,而且在select标签中我们使用的是parameterClass属性,而不是parameterMap属性,这里要区分开,它们可以说是完全不同的。
说完了外部参数映射,再说说外部结果映射。上面的例子中我们使用的映射有JavaBean形式的,也有hashmap形式的,但要注意我们是用的都是
resultClass属性来标识它们的,它们都属于内联结果映射。外部结果映射是使用resultMap来定义的,我们来看一个实例,来更直观的说明,
首先定义一个resultMap的类型:
- package ibatis.util;
- public class PrimitiveResult {
- private int userCount;
- public int getUserCount() {
- return userCount;
- }
- public void setUserCount(int userCount) {
- this.userCount = userCount;
- }
- @Override
- public String toString() {
- return "PrimitiveResult [userCount=" + userCount + "]";
- }
- }
很简单的一个类型,就是描述用户数量的。再在XML中定义这个类型:
- <resultMap class="ibatis.util.PrimitiveResult" id="primitiveResultMap">
- <result property="userCount" column="userCount" javaType="java.lang.Integer" jdbcType="int" />
- </resultMap>
这里说明一下property就是定义PrimitiveResult中的一个属性名,这里是userCount,后面的column应该是数据库中的字
段名,这里数据库中没有统计用户数量这个字段,我们可以在SQL语句中使用as重命名来进行,javaType和jdbcType就好理解了,分别是
Java对象的类型和数据库字段的类型。
下面来看看查询部分的定义:
- <select id="selectPrimitiveByUserId" resultMap="primitiveResultMap">
- select
- count(*) as userCount
- from
- users
- </select>
注意这里是resultMap就行了,不再是resultClass了,下面就是程序代码了:
- PrimitiveResult userCount = (PrimitiveResult) sqlMap.queryForObject(
- "User.selectPrimitiveByUserId");
- System.out.println(userCount);
因为我们之前在PrimitiveResult中覆盖了toString()方法,那么我们执行程序,就得到了:PrimitiveResult [userCount=2],这就是外部结果映射的使用了。
最后我们来比较一下javabean的结果映射和map结果映射。Javabean形式的映射都是我们手写的bean类,而map就直接使用,是内联情况
的。它们各有好处也有缺点。比如使用javabean那么性能很好,而且是强类型检测,缺点是很多的get/set方法。而用map不需要很多代码,但它
的效率就慢了,没有强类型的检测。
一家之言,仅供参考,欢迎交流,希望对使用者有用。
发表评论
-
iBATIS缓存
2011-12-12 21:33 1166为了提高应用程序性 ... -
iBatis批处理(batch)
2011-09-05 23:47 6959spring集成了ibatis的批量提交的功能,我们只要调用A ... -
一个Spring+iBatis框架进行batch处理的问题
2011-09-05 23:23 1623在使用org.springframework.jdbc.dat ... -
ibatis 注意点
2011-08-08 19:28 1385insert,update,delete 返回值 inser ... -
ibatis 之 动态SQL查询(dynamic )
2011-06-12 12:13 2289映射文件: <select id=" ... -
ibatis 之 复杂类型集合的属性
2011-06-12 12:10 2149Result Map还可以装入代表复杂类型对象集合(List) ... -
ibatis 之 复杂类型属性(即自定义类型的属性)
2011-06-12 11:54 3453复杂类型用以表示在数 ... -
ibatis 之 java.util.Map作为parameterClass和resultClass
2011-06-12 11:21 51641.Map作为parameterClass 映射 ... -
ibatis Tips 之 resultMap
2011-05-29 21:04 1212转载:http://xulongfa.iteye.com/bl ... -
ibatis Tips之parameterMap
2011-05-29 21:03 1343转载:http://xulongfa.iteye.com/bl ... -
iBatis查询API
2011-05-29 12:34 1857转载:http://sarin.iteye.com/blog/ ... -
ibatis 表与表的关联查询
2011-05-22 15:04 1268ibatis高级特性,处理表与表之间的关联。ibatis中,提 ... -
ibatis 动态映射机制
2011-05-22 14:15 1460对于这个组合查询页 ... -
sqlMapConfig.xml配置文件详解
2011-05-22 13:04 3556sqlMapConfig.xml配置文件详解: X ... -
ibatis缓存
2011-05-22 12:52 1368iBatis的缓存配置比较简单易懂,以我使用的iBati ... -
ibatis resultclass "java.util.hashmap" 缓存问题
2011-05-22 12:13 1526在做ibatis项目过程中遇到如下样式动态查询 <se ... -
ibatis # $区别
2011-05-22 11:55 14411、#可以进行预编译,进行类型匹配,#变量名# 会转化为 j ... -
iBATIS入门示例及注释
2011-05-08 18:20 1801工程的结构: 一、SqlMapConf ... -
iBATIS 三个版本小细节对比
2011-05-08 16:12 1205iBATIS 三个版本小细节对比 sqlMapConfig ... -
深入分析 iBATIS 框架之系统架构与映射原理
2011-05-07 12:48 1223原文:http://www.ibm.com/developer ...
相关推荐
### ibatis配置文件详解 #### 一、ibatis概述 ibatis,又称MyBatis,是一种优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。ibatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。ibatis可以...
根据提供的文档信息,我们可以深入探讨Ibatis框架中的一个具体应用场景:如何通过动态SQL查询特定条件下的ID列表。本文将从以下几个方面进行详细解析: ### 一、Ibatis简介 Ibatis是一个基于Java的持久层框架,它...
### 操作数据库iBATIS查询详解 #### 一、iBATIS中的LIKE查询技巧 iBATIS是一款优秀的Java持久层框架,它简化了基于SQL的程序编写,避免了程序员手动处理结果集和手工编写SQL语句。在进行数据库查询时,LIKE查询是...
标题:ibatis教程 输入参数详解 描述:ibatis教程 输入参数详解 ibatis快速入门 标签:ibatis list 部分内容:这段部分提供了ibatis用户指南的警告,关于从文档复制代码的问题,以及ibatis的概述、如何开始使用...
iBatis 动态查询条件详解 iBatis 是一个基于 Java 的持久层框架,它提供了动态查询条件的功能,可以根据不同的条件生成不同的 SQL 语句。在 iBatis 中,动态查询条件是通过 `<dynamic>` 元素来实现的,该元素可以...
### iBatis 多表查询知识点详解 #### 一、iBatis简介 iBatis 是一款优秀的持久层框架,它将 SQL 映射到 Java 对象,简化了 JDBC 编程过程中的繁琐操作,提高了开发效率。iBatis 的核心功能包括 SQL 映射、动态 SQL...
例如,你可以定义一个select元素来映射一个查询语句,通过id属性标识,paramMap和parameterMap用于传入参数,resultMap则定义了查询结果如何映射到Java对象。此外,insert、update和delete元素分别对应增、删、改...
### MySQL、JDBC详解及与iBatis对比 #### 一、MySQL基本操作 MySQL作为一款广泛使用的开源关系型数据库管理系统,在IT行业中占有极其重要的地位。对于开发人员来说,掌握MySQL的基本操作至关重要。 ##### 1. 增删...
《iBATIS-SqlMaps详解》是一本深入探讨iBATIS SQL Maps的指南,主要针对的是Java开发人员,特别是那些希望提升数据库操作效率并优化应用性能的开发者。iBATIS作为一个开源的持久层框架,它将SQL语句与Java代码分离,...
### Ibatis多表查询知识点详解 #### 一、数据库表结构设计 为了演示Ibatis的多表查询功能,本文档采用了一个简单的例子:一个图书 (`book`) 表和一个用户 (`user`) 表,其中图书表与用户表之间存在一对多的关系。...
### ibatis的动态查询知识点详解 #### 一、模糊查询 **知识点1:** 在进行模糊查询时,ibatis支持两种不同的语法标记:`#` 和 `$`。 1. **使用 `$value$` 进行模糊查询:** - 在进行模糊查询时,使用 `$value$` ...
ibatis是一个支持普通SQL查询、存储过程以及高级映射的优秀数据库持久层框架。它可以将接口和Java的POJOs(Plain Old Java Objects)映射成数据库中的记录。 #### 二、项目环境配置 项目基于以下技术栈搭建: - **...
例如,<select id="selectUser" resultType="User">用于查询User对象,其中id是SQL映射的唯一标识,resultType指定返回的结果类型。 XmlSqlMapClientBuilder是构建SqlMapClient实例的关键,它会解析XML配置文件,并...
### ibatis查询语句配对知识点详解 #### 一、ibatis简介 ibatis(现称为MyBatis)是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。ibatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。...
Ibatis是一个支持普通SQL查询、存储过程以及高级映射的优秀持久层框架。Ibatis可以让你直接编写原生态SQL,可以严格控制SQL执行性能,灵活度极高,尤其适合对SQL有特殊需求的项目。 ### SQL语句详解 #### 1. 删除...
**IBatis .NET框架实例详解** IBatis 是一个流行的数据访问层框架,它在Java世界中广为人知,但同样提供了对.NET平台的支持。本文将深入探讨如何在C# .NET环境中使用IBatis进行数据库操作,这对于初学者来说是一份...
**Ibatis配置详解** Ibatis,一款轻量级的Java持久层框架,它与Hibernate、MyBatis等ORM(对象关系映射)框架并列,是处理数据库操作的重要工具。Ibatis的核心理念是将SQL语句与Java代码分离,使得开发者能够更灵活...
- `select`标签用于执行查询,`resultMap`属性指定结果集映射,`#value#`是Ibatis的参数占位符,代表传入的方法参数。 - `insert`标签用于插入记录,`parameterClass`属性指定参数类型。 - `delete`标签用于删除记录...
**Ibatis 入门实例详解** Ibatis 是一个优秀的轻量级 Java ORM(对象关系映射)框架,它允许开发者将 SQL 查询与 Java 代码分离,使得数据访问层更加灵活和易于维护。在这个"ibatis入门实例(全代码)"中,我们将...