MyBatis之【#{}、${}占位符】

#{}

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));
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值