Mybatis中mapper文件中的sql语句映射是可以传递参数的,在<select>
等标签中的parameter属性可以声明参数的类型,可以是基本数据类型,也可以是集合类型,还可以是pojo对象。例如:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="a.b">
<select id="selById" resultType="com.test.pojo.People" parameterType="map">
select * from people where id=${id} and name='${name}'
</select>
<select id="test" resultType="com.test.pojo.People" parameterType="int">
<![CDATA[ select * from people where id<#{0} ]]>
</select>
<select id="page" resultType="People" parameterType="map">
select * from people limit #{pageStart},#{pageSize}
</select>
<insert id="ins" parameterType="People">
insert into people values(default,#{name},#{age})
</insert>
<update id="upd" parameterType="people">
update people set name = #{name} where id = #{id}
</update>
<delete id="del" parameterType="int">
delete from people where id = #{0}
</delete>
</mapper>
上面的mapper配置文件配置的sql语句映射都分别指定了需要传入的参数类型,在进行相应调用的时候需要传入参数。如下测试代码:
package com.test.main;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import com.test.pojo.People;
public class Test {
public static void main(String[] args) throws IOException {
InputStream is = Resources.getResourceAsStream("mybatis.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
SqlSession session = factory.openSession();
/*
People peo = new People();
Map<String,String> map = new HashMap<String,String>();
map.put("id", "3");
map.put("name", "aaaaaa");
peo = session.selectOne("a.b.selById", map);
System.out.println(peo);*/
/*
People peo =new People();
peo.setId(1);
//显示几个
int pageSize = 2;
//第几页
int pageNumber = 2;
//如果希望传递多个参数,可以使用对象或map
Map<String,Object> map = new HashMap<>();
map.put("pageSize", pageSize);
map.put("pageStart", pageSize*(pageNumber-1));
List<People> p = session.selectList("a.b.page",map);
System.out.println();
System.out.println(p.get(0));
System.out.println(p.get(1));
*/
/*
People p = new People();
p.setName("新增name1");
p.setAge(88);
try {
int index = session.insert("a.b.ins", p);
if (index > 0) {
System.out.println("成功");
} else {
System.out.println("失败");
}
} catch (Exception e1) {
// e1.printStackTrace();
session.rollback();
}
p.setName("aaaaaa");
try {
int index1 = session.insert("a.b.ins", p);
if (index1 > 0) {
System.out.println("成功");
} else {
System.out.println("失败");
}
} catch (Exception e) {
// e.printStackTrace();
session.rollback();
}
session.commit();
*/
//实现修改id=3的name=王五,并输出执行结果
People peo = new People();
peo.setId(4);
peo.setName("王五");
int index = session.update("a.b.upd", peo);
if(index>0){
System.out.println("成功");
}else{
System.out.println("失败");
}
session.commit();
/**
* 删除id=3的数据
*/
// int del = session.delete("a.b.del",3);
//
// if(del>0){
// System.out.println("成功");
// }else{
// System.out.println("失败");
// }
// session.commit();
session.close();
System.out.println("程序执行结束");
}
}
注意观察会发现上面的mapper文件中的第一条sql语句映射是用的${}
,而其他的sql语句映射使用的是#{}
,它们的区别如下:
${}
是Properties文件中的变量占位符,它可以用于标签属性值和 sql 内部,属于静态文本替换,比如上面的例子中${id}
将会替换为传入的map中key为“id”的元素相应的value;
#{}
是sql的参数占位符,Mybatis会将sql中的#{}
替换为?号,在sql执行前会使用 PreparedStatement的参数设置方法,按序给 sql 的?号占位符设置参数值。
XML文档中所有的字符均会被解析器解析,只有CDATA区段中的文本会被解析器忽略。假如您在 XML 文档中放置了一个类似 “<” 字符,那么这个文档会产生一个错误,这是因为解析器会把它解释为新元素的开始,所以不能在XML文档中使用“<”等符号,可以将它们放在CDATA区段中。
<select id="test" resultType="com.test.pojo.People" parameterType="int">
<![CDATA[ select * from people where id<#{0} ]]>
</select>
跟使用jdbc执行sql语句一样,执行select语句返回的是查询到的记录条数,执行insert、delete和update返回的是受影响的记录条数。