Mybatis的参数传递:从java代码中将数据传入到mapper文件的SQL语句
- parameterType:表示接口中方法参数的数据类型(parameterType=java.lang.Integer)
- parameterType的值是java数据类型的全限定名或者是Mybatis定义的别名
- parameterType不是强制的,Mybatis通过反射机制能够发现接口参数的数据类型,可不写
- 在mapper文件中获取简单类型(基本数据类型和String)的一个参数值,使用#{任意字符}
- 多个参数,使用@Param命名参数,value属性值对应xml文件中“#{}”的值,如下
public List<User> selectUser(@Param(myName) String name, @Param(myAge) Integer age);
<select id="selectUser" resultType="user">
select name, age from user where name = #{myName} or agre = #{myAge};
</select>
- 多个参数,使用java对象作为接口方法参数
List<User> selectUsers(User user);
- 使用语法:#{属性名, javaType=类型名称, jdbcType=数据类型}
- javaType:java中的数据类型
- jdbcType:在数据库中的数据类型
- 例如:#{paramName, javaType=java.lang.String, jdbcType=VARCHAR}可简写为#{属性名}
<select id="selectUsers" resultType="user">
select name, age from user where name = #{name} or agre = #{age};
</select>
- 多个参数,使用Map传值(不推荐)
dao接口
List<User> selectUsersByMap(Map<String, Object> map);
mapper
<select id="selectUsersByMap" result="user">
<!--#{}中的值为map的key-->
select * from example where name = #{name} or age = #{age}
</select>
测试
@Test
public void testMap() {
SqlSession sqlsession = MybatisUtil.getSqlsession();
UserDao userDao = sqlsession.getMapper(USerDao.class);
Map<String, Object> map = new HashMap<>();
map.put("name", "张三");
map.put("age", 23);
List<User> userList = userDao.selectUsersByMap(map);
userList.forEach(user-> System.out.println(user));
}
注:#(占位符)和$(字符串替换)的差别
- #使用PreparedStatement(避免SQL注入,效率高)执行SQL,$使用Statement执行SQL(不安全,效率低)
- $起拼接作用可替换表名或列名