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注入攻击,因此你
不应该允许用户输入这些字段,或者通常自行转义并检查。
相关推荐
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 ...
7. **ParameterHandler**:处理SQL参数,将Java对象转化为JDBC能识别的参数,通常使用ParameterMap和ParameterObject实现。 8. **ResultSetHandler**:处理SQL查询返回的结果集,将JDBC的ResultSet转化为Java对象。...
"MyBatis Parameter Index Out of Range Error Handling" MyBatis是一个基于Java的持久层框架,提供了简单、灵活、快速的数据库访问方式。但是,在使用MyBatis时,可能会遇到各种错误提示,例如Parameter index out...
在使用MyBatis框架进行数据操作时,我们可能会遇到CLOB类型数据的读写问题,尤其是在转换和插入数据库时。本篇将详细探讨MyBatis中处理CLOB类型数据的转换以及解决可能出现的异常情况。 首先,MyBatis是Java中的一...
MyBatis 目录(?)[-] mybatis实战教程mybatis in action之一开发环境搭建 mybatis实战教程mybatis in action之二以接口的方式编程 mybatis实战教程mybatis in action之三实现数据的增删改查 mybatis实战教程mybatis ...
2. **参数映射**:MyBatis通过`<parameterMap>`和`<parameter>`标签,或者注解的方式,可以将方法参数自动映射到SQL语句的占位符上,免去了手动设置参数的繁琐步骤。 3. **结果映射**:通过`<resultMap>`标签,...
- **参数映射(Parameter Map)**:用于定义传入SQL语句的参数以及其数据类型、方向等信息。 - **结果映射(Result Map)**:定义了如何将查询结果映射到.NET实体对象上,包括一对一、一对多等复杂的映射关系。 #### ...
5. **参数映射(Parameter Mapping)**:MyBatis可以自动将传入的方法参数映射到SQL语句的参数,支持基本类型、对象、Map等。 6. **缓存**:MyBatis提供了本地缓存和二级缓存机制,可以提高数据访问的效率。 7. **...
在Java开发中,MyBatis是一个非常流行的持久层框架,它简化了数据库操作与对象之间的映射过程。本文将深入探讨在MyBatis中如何使用枚举类型,并通过实际的项目"mybatis入门实战之枚举类型"进行讲解。这个项目提供了...
5. **Parameter Mapping**(参数映射):Mybatis提供了多种方式来传递参数,如简单类型、Map、POJO对象等。可以通过`#{}`占位符进行参数绑定。 6. **Result Mapping**(结果映射):用于将查询结果自动映射到Java...
通过 MyBatis 的自动绑定机制,Mapper 方法的参数可以与 XML 中的 `<parameter>` 对应,返回值与 `<resultMap>` 对应。 3. **SqlSessionFactory 和 SqlSession**:SqlSessionFactory 是 MyBatis 的核心对象,用于...
- **`<parameterMap>`(已废弃)和 `<parameter>` 标签**:用于参数映射,现在推荐使用 Java 8 的方法引用或注解进行参数绑定。 4. **MyBatis 与 Spring 集成** - **mybatis-spring.jar**:提供 MyBatis 与 ...
首先,我们需要了解MyBatis中的ParameterMapping和ResultMapping。ParameterMapping用于处理输入参数,而ResultMapping则处理查询结果。在分页查询中,我们可以将页码和每页大小作为输入参数,通过ParameterMapping...
5. **ParameterMap** 和 **ParameterMapping**:分别表示参数映射的集合和单个参数映射。 6. **StatementHandler**:处理SQL语句的执行,它是Executor接口的实现类。 7. **PooledConnection** 和 **...
4. ParameterMapping和ResultMapping:在Mapper XML文件中,我们需要定义参数如何映射到SQL(`<parameterMap>`标签)以及查询结果如何映射到Java对象(`<resultMap>`标签)。IntegerService可能包含这些映射的示例。...
在IT行业中,数据库操作是应用程序的核心部分,而MyBatis作为一款强大的持久层框架,广泛应用于Java开发。本文将深入探讨如何在SpringBoot(整合MyBatis)和传统的SSM(Spring、SpringMVC、MyBatis)项目中,原样...
`org.apache.ibatis.executor.parameter.DefaultParameterHandler`是默认的实现。 6. **ResultSetHandler**:处理SQL执行后的结果集,将数据库结果映射为Java对象。`org.apache.ibatis.executor.resultset....
MyBatis拦截器分页是实现数据库查询优化和提高应用性能的一种有效手段。在MyBatis框架中,拦截器扮演着动态代理的角色,允许我们在执行SQL之前或之后进行额外的操作,比如统计、日志记录或者在本例中的分页处理。...
6. **参数映射(Parameter Maps)**:`<parameterMap>`元素用来定义参数的映射,尽管在MyBatis 3.0之后,更推荐使用方法参数直接映射,即通过`@Param`注解和`<parameter>`元素直接指定参数。 7. **缓存(Cache)**...
使用 `<parameterMap>` 和 `<parameter>` 标签进行参数的配置。 6. **结果映射**:Mybatis 提供了自动映射机制,可以将查询结果自动映射到 Java 对象。通过 `<resultMap>` 标签可以自定义映射规则,处理一对一、一...