`
liulanghan110
  • 浏览: 1072729 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

MYBATIS 的parameter

    博客分类:
  • JAVA
阅读更多

 

Parameter
 
1.   传入简单类型


    JAVA代码:

public User get(Long id) {	
	return (User) getSqlSession().selectOne("com.liulanghan.get" , id);
}

 
 MAPPER :

 

<select id="findUserListByIdList" parameterType="java.lang.Long" resultType="User">
		select * from user where  id = #{id};
</select>

  
2.   传入List

 

    JAVA代码:

 

public List<Area> findUserListByIdList(List<Long> idList) {
		return getSqlSession().selectList("com.liulanghan.findUserListByIdList", idList);
	}

 

MAPPER :

 

 

    <select id="findUserListByIdList" parameterType="java.util.ArrayList" resultType="User">
		select * from user user
		<where>
			user.ID in (
			<foreach item="guard" index="index" collection="list"
				separator=","> #{guard} </foreach>
			)
		</where>
	</select> 

   
 
 单独传入list时,foreach中的collection必须是list,不不管变量的具体名称是什么。比如这里变量名为idList,
 collection却是是list。
 
3.  传入数组


  JAVA代码:

 

public List<Area> findUserListByIdList(int[] ids) {
		return getSqlSession().selectList("com.liulanghan.findUserListByIdList", ids);
	}

 

 MAPPER :

 

 

 <select id="findUserListByIdList" parameterType="java.util.HashList" resultType="User">
		select * from user user
		<where>
			user.ID in (
			<foreach item="guard" index="index" collection="array"
				separator=","> #{guard} </foreach>
			)
		</where>
	</select>   

  
 
 单独传入数组时,foreach中的collection必须是array,不不管变量的具体名称是什么。比如这里变量名为ids,
 collection却是是array

 

4.  传入map
 
 JAVA代码:

public boolean exists(Map<String, Object> map){
		Object count = getSqlSession().selectOne("com.liulanghan.exists", map);
		int totalCount = Integer.parseInt(count.toString());
		return totalCount > 0 ? true : false;
	}

  
 MAPPER :

<select id="exists" parameterType="java.util.HashMap" resultType="java.lang.Integer">
		SELECT COUNT(*) FROM USER user
		<where>
			<if test="code != null"> 
				and user.CODE = #{code} 
			</if>
			<if test="id != null"> 
				and user.ID = #{id} 
			</if>
			<if test="idList !=null ">
				and user.ID in (
				<foreach item="guard" index="index" collection="idList"
					separator=","> #{guard} </foreach>
				)
			</if>
		</where>
	</select>

 

 MAP中有list或array时,foreach中的collection必须是具体list或array的变量名。比如这里MAP含有一个
    名为idList的list,所以MAP中用idList取值,这点和单独传list或array时不太一样。
 
 
5. 传入JAVA对象
 
 JAVA代码:

public boolean findUserListByDTO(UserDTO userDTO){
		Object count = getSqlSession().selectOne("com.liulanghan.exists", userDTO);
		int totalCount = Integer.parseInt(count.toString());
		return totalCount > 0 ? true : false;
	}

  
 MAPPER :

<select id="findUserListByDTO" parameterType="UserDTO" resultType="java.lang.Integer">
		SELECT COUNT(*) FROM USER user
		<where>
			<if test="code != null"> 
				and user.CODE = #{code} 
			</if>
			<if test="id != null"> 
				and user.ID = #{id} 
			</if>
			<if test="idList !=null ">
				and user.ID in (
				<foreach item="guard" index="index" collection="idList"
					separator=","> #{guard} </foreach>
				)
			</if>
		</where>
	</select>

 

    JAVA对象中有list或array时,foreach中的collection必须是具体list或array的变量名。比如这里UserDTO含有一个
    名为idList的list,所以UserDTO中用idList取值,这点和单独传list或array时不太一样。

 

6.取值


 由上面可以看出,取值的时候用的是#{}。它具体的意思是告诉MyBatis创建一个预处理语句参数。
 使用JDBC,这样的一个参数在SQL中会由一个“?”来标识,并被传递到一个新的预处理语句中,就像这样:

 

 // Similar JDBC code, NOT MyBatis…
 String selectPerson = “SELECT * FROM PERSON WHERE ID=?”;
 PreparedStatement ps = conn.prepareStatement(selectPerson);
 ps.setInt(1,id);

  
    可以看到这个写法比较简单,MyBatis为我们做了很多默认的事情,具体的写法应该如下:

 

#{property,javaType=int,jdbcType=NUMERIC,typeHandler=MyTypeHandler,mode=OUT,resultMap=User}

 

 property:属性名,即代码传入的变量名。
 javaType:该字段在JAVA中的类型,比如int。
 jdbcType:该字段在JDBC中的类型,比如NUMERIC。
 typeHandler:类型处理器
 mode:参数类型为IN,OUT或INOUT参数
 resultMap:结果。
 
 还好,MyBatis比较体谅我们,一般我们只需写一个属性名即可,如#{id},其他的如javaType和typeHandlerMybatis
 会自动帮我们填好。可是这样有时也会出问题,比如出现CLOB字段时。
 
 由于JAVA代码中的String类型对应的默认typeHandler为StringTypeHandler,当用String类型处理时,如果String长度超过一定长度,就会报如下错误:


 setString can only process strings of less than 32766 chararacters

 

 解决办法是指定该属性的typeHandler,如下:


 #{message,typeHandler=org.apache.ibatis.type.ClobTypeHandler}

 

 我们也可以自定义typeHandler来处理需要的数据,具体这里详述。
 
 JDBC类型是仅仅需要对插入,更新和删除操作可能为空的列进行处理。这是JDBC的需要,而不是MyBatis的。一般不需要配置
 
 mode、resultMap一般不需要,在写存储过程时会用到,这里不详述。
 
7.字符串替换

 

 一般情况下,我们采用#{}取值,产生预处理语句,但是有时我们可能不希望Mybatis来帮我们预处理,比如ORDER BY时,可以
 采用如下写法:
 
 ORDER BY ${columnName}
 
 这里MyBatis不会修改或转义字符串。而是直接拼接到SQL字符串后面。
 
 重要:接受从用户输出的内容并提供给语句中不变的字符串,这样做是不安全的。这会导致潜在的SQL注入攻击,因此你
 不应该允许用户输入这些字段,或者通常自行转义并检查。
 

分享到:
评论
6 楼 liulanghan110 2017-02-16  
quainter 写道
麻烦博主,参数为数组时,parameterType怎么写啊?

parameterType="java.util.HashList"

上面有写的。
5 楼 quainter 2016-11-03  
麻烦博主,参数为数组时,parameterType怎么写啊?
4 楼 liulanghan110 2014-06-25  
arthas207 写道
hashList?

打错了,谢谢指点
3 楼 arthas207 2014-06-24  
hashList?
2 楼 liu119361940 2014-03-16  
谢楼主
1 楼 liushaohan01 2013-03-21  
d

相关推荐

    MyBatis-3.61.zip

    Introduce custom 'Mybatis Parameter' language to support Mybatis parameter expression. Generate Mapper XML, SQL statement, statement declaration on the fly. Integrate with DataSource in IDEA. Many ...

    mybatis-3-mybatis-3.2.6

    7. **ParameterHandler**:处理SQL参数,将Java对象转化为JDBC能识别的参数,通常使用ParameterMap和ParameterObject实现。 8. **ResultSetHandler**:处理SQL查询返回的结果集,将JDBC的ResultSet转化为Java对象。...

    Mabatis错误提示Parameter index out of range的处理方法

    "MyBatis Parameter Index Out of Range Error Handling" MyBatis是一个基于Java的持久层框架,提供了简单、灵活、快速的数据库访问方式。但是,在使用MyBatis时,可能会遇到各种错误提示,例如Parameter index out...

    mybatis 日志 sql参数替换工具

    非常好用的,就是你们所要的 Mybatis日志参数快速替换占位符 sql参数替换工具html

    mybatis 对clob类型转换

    在使用MyBatis框架进行数据操作时,我们可能会遇到CLOB类型数据的读写问题,尤其是在转换和插入数据库时。本篇将详细探讨MyBatis中处理CLOB类型数据的转换以及解决可能出现的异常情况。 首先,MyBatis是Java中的一...

    springmybatis

    MyBatis 目录(?)[-] mybatis实战教程mybatis in action之一开发环境搭建 mybatis实战教程mybatis in action之二以接口的方式编程 mybatis实战教程mybatis in action之三实现数据的增删改查 mybatis实战教程mybatis ...

    MyBatis全套JAR包

    2. **参数映射**:MyBatis通过`&lt;parameterMap&gt;`和`&lt;parameter&gt;`标签,或者注解的方式,可以将方法参数自动映射到SQL语句的占位符上,免去了手动设置参数的繁琐步骤。 3. **结果映射**:通过`&lt;resultMap&gt;`标签,...

    mybatis-3.2.2完整类库

    5. **参数映射(Parameter Mapping)**:MyBatis可以自动将传入的方法参数映射到SQL语句的参数,支持基本类型、对象、Map等。 6. **缓存**:MyBatis提供了本地缓存和二级缓存机制,可以提高数据访问的效率。 7. **...

    mybatis入门实战之枚举类型

    在Java开发中,MyBatis是一个非常流行的持久层框架,它简化了数据库操作与对象之间的映射过程。本文将深入探讨在MyBatis中如何使用枚举类型,并通过实际的项目"mybatis入门实战之枚举类型"进行讲解。这个项目提供了...

    Mybatis相关

    5. **Parameter Mapping**(参数映射):Mybatis提供了多种方式来传递参数,如简单类型、Map、POJO对象等。可以通过`#{}`占位符进行参数绑定。 6. **Result Mapping**(结果映射):用于将查询结果自动映射到Java...

    mybatis 项目真实使用

    通过 MyBatis 的自动绑定机制,Mapper 方法的参数可以与 XML 中的 `&lt;parameter&gt;` 对应,返回值与 `&lt;resultMap&gt;` 对应。 3. **SqlSessionFactory 和 SqlSession**:SqlSessionFactory 是 MyBatis 的核心对象,用于...

    【MyBatis学习笔记四】——MyBatis分页.zip

    首先,我们需要了解MyBatis中的ParameterMapping和ResultMapping。ParameterMapping用于处理输入参数,而ResultMapping则处理查询结果。在分页查询中,我们可以将页码和每页大小作为输入参数,通过ParameterMapping...

    mybatis-3-mybatis-3.5.8.tar.gz源码

    5. **ParameterMap** 和 **ParameterMapping**:分别表示参数映射的集合和单个参数映射。 6. **StatementHandler**:处理SQL语句的执行,它是Executor接口的实现类。 7. **PooledConnection** 和 **...

    mybatis实验数据包

    4. ParameterMapping和ResultMapping:在Mapper XML文件中,我们需要定义参数如何映射到SQL(`&lt;parameterMap&gt;`标签)以及查询结果如何映射到Java对象(`&lt;resultMap&gt;`标签)。IntegerService可能包含这些映射的示例。...

    原样输出mybatis的sql执行语句(mysql和oracle都可用).zip

    在IT行业中,数据库操作是应用程序的核心部分,而MyBatis作为一款强大的持久层框架,广泛应用于Java开发。本文将深入探讨如何在SpringBoot(整合MyBatis)和传统的SSM(Spring、SpringMVC、MyBatis)项目中,原样...

    mybatis-3-master ,mybatis 3的源码 3.2

    `org.apache.ibatis.executor.parameter.DefaultParameterHandler`是默认的实现。 6. **ResultSetHandler**:处理SQL执行后的结果集,将数据库结果映射为Java对象。`org.apache.ibatis.executor.resultset....

    MyBatis拦截器分页

    MyBatis拦截器分页是实现数据库查询优化和提高应用性能的一种有效手段。在MyBatis框架中,拦截器扮演着动态代理的角色,允许我们在执行SQL之前或之后进行额外的操作,比如统计、日志记录或者在本例中的分页处理。...

    mybatis文件

    6. **参数映射(Parameter Maps)**:`&lt;parameterMap&gt;`元素用来定义参数的映射,尽管在MyBatis 3.0之后,更推荐使用方法参数直接映射,即通过`@Param`注解和`&lt;parameter&gt;`元素直接指定参数。 7. **缓存(Cache)**...

Global site tag (gtag.js) - Google Analytics