特殊SQL的执行
模糊查询
select * from t_user where username like ’%a%‘
查询我们的username中带有a的所有数据,在应用中我们的a是传递过去的,不是写死的
之前我们进行数据库操作的时候,都是使用#{}来表示占位符,但是这里就不太行。
演示#{}占位符:
/**
* 模糊查询
*/
List<User> getUserByLike(@Param("username") String username);
<!--List<User> getUserByLike(@Param("username") String username);-->
<select id="getUserByLike" resultType="User">
select * from t_user where username like '%#{username}%'
</select>
@Test
public void getUserByLikeTest(){
SqlSession sqlSession = getSqlSessionUtil.getSqlSession();
SQLMapper mapper = sqlSession.getMapper(SQLMapper.class);
List<User> users = mapper.getUserByLike("i");
users.forEach(user -> System.out.println(user));
}
以上问题我们有三种解决方法
方法一
将#{}换成${}来表示占位符。
<select id="getUserByLike" resultType="User">
select * from t_user where username like '%${username}%'
</select>
方法二
使用字符串拼接来传递参数
<select id="getUserByLike" resultType="User">
select * from t_user where username like concat('%', '#{username}', '%')
</select>
方法三(推荐使用)
<select id="getUserByLike" resultType="User">
select * from t_user where username like "%"#{username}"%";
</select>
批量删除
#{}会自动给传递的参数添加"",而KaTeX parse error: Expected 'EOF', got '#' at position 92: …3的数据,没有的则不删除 使用#̲{}的删除sql: delet…{}删除sql:
delete from t_user where id in (1, 2, 3)
总结:批量删除的占位符我们只能使用${}来实现
动态设置表名
我们在写sql语句中除了后面的条件的参数可以传递外,表名也是可以传递的(理论上所有的数据都可以传递).
由sql语句的语法,我们知道sql语句的表名是不能加’ '的,故和批量删除一样,我们也只能够使用${}来传递参数.
/**
* 查询表名来查询数据
*/
List<User> getUserByTableName(@Param("tableName") String table);
<select id="getUserByTableName" resultType="com.atguigu.mybatis.pojo.User">
select * from ${tableName}
</select>
添加功能获取自增的主键
应用场景:
假入我们有个学生表t_student
我们还有个班级表t_class
我们的学生和班级之间的一个关系:t_student中有一个外键(是t_class的主键)
如果我们要给某某班级分配学生,就是要获取t_class的自增主键,然后将需要分到该班级的学生的某属性(外键)值修改为该班级的主键值.
/**
添加用户信息
useGeneratedKeys:设置使用自增的主键
keyProperty:因为增删改有统一的返回值是受影响的行数,
因此只能将获取的自增的主键放在传输的参数user对象的某个属性中
*/
int insertUser(Useruser);
<!--int insertUser(Useruser);-->
<insert id="insertUser"useGeneratedKeys="true"keyProperty="id"> insert into t_user values(null,#{username},#{password} )
<!--这个的意思就是将t_student的外键(id)修改为t_class的某个自增外键-->
</insert>