#{}
1、传参大部分使用#{}传参,它的底层使用的是PreparedStatement对象,是安全的数据库访问,可以防止sql注入。
2、#{}中如何写,看parameterType的参数类型
(1)如果parameterType的类型是简单类型(8种基本(封装)+ String),则#{}中随便写
(2)如果parameterType的类型是实体类的类型,则#{}中只能是类中成员变量的名称,而且区分大小写
${}
1、字符串拼接
(1)一般用于模糊查询,建议少用,因为有sql注入的风险
(1)如果parameterType的类型是简单类型(8种基本(封装)+ String),则${}中随便写,但是分版本,如果是3.5.1及以下的版本,只能写value
(2)如果parameterType的类型是实体类的类型,则${}中只能是类中成员变量的名称,而且区分大小写(不常用)
(2)优化后的模糊查询(concat函数拼接)
<select id="getLikeGood" parameterType="string" resultType="users"> select id,username,birthday,sex,address from users where username like concat('%', #{name}, '%') </select>
2、字符串替换
例子如下:
<!-- 当参数多于一个时,不写parameterType // 模糊查询列和值 List<Users> getByNameOrAddress( @Param("columnName") String columnName, @Param("columnValue") String columnValue); --> <select id="getByNameOrAddress" resultType="users"> select id,username,birthday,sex,address from users where ${columnName} like concat('%', #{columnValue}, '%') </select>测试:
SqlSession sqlSession; UsersMapper usersMapper; SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd"); @Before public void openSqlSession() throws IOException { // 读取核心配置文件 InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml"); // 创建工厂对象 SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in); // 取出SqlSession sqlSession = factory.openSession(); // 取出动态代理的对象,完成接口中方法的调用 // 实际是调用xml文件中相应标签的功能 usersMapper = sqlSession.getMapper(UsersMapper.class); } @After public void closeSqlSession(){ sqlSession.close(); }@Test public void testGetByNameOrAddress(){ List<Users> list = usersMapper.getByNameOrAddress("username", "小"); list.forEach(users -> System.out.println(users)); }