7、特殊SQL的执行


【尚硅谷】SSM框架全套教程-讲师:杨博超

失败,是正因你在距成功一步之遥的时候停住了脚步。

7、特殊SQL的执行

7.1、模糊查询

  • 模糊查询格式:‘%值%’,不能直接使用#{},这里将介绍三种方式
  • ‘%${username}%’
  • concat(‘%’,#{username},‘%’)
  • “%”#{username}“%”

1 SpecialSQLMapper.java

// 模糊查询
List<User> getUserByLike(@Param("username") String username);

2 SpecialSQLMapper.xml

<!--List<User> getUserByLike(@Param("username") String username);-->
<select id="getUserByLike" resultType="User">
    <!--select * from t_user where username like '%${username}%'-->
    <!--select * from t_user where username like concat('%',#{username},'%')-->
    select id, username, `password`, age, gender, email
    from t_user
    where username like "%"#{username}"%"
</select>

3 测试

@Test
public void testGetUserByLike() {
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    SpecialSQLMapper mapper = sqlSession.getMapper(SpecialSQLMapper.class);
    List<User> list = mapper.getUserByLike("z");
    sqlSession.close();
    list.forEach(System.out::println);
}

7.2、批量删除

  • 这里只能使用in(${ids})方式实现。
  • 后面学习动态SQL可以使用forEach标签,可以使用id=5 OR id=6的方式。

1 SpecialSQLMapper.java

// 批量删除
int deleteMoreUser(@Param("ids") String ids);

2 SpecialSQLMapper.xml

<!--int deleteMoreUser(@Param("ids") String ids);-->
<delete id="deleteMoreUser">
    delete
    from t_user
    where id in (${ids});
</delete>

3 测试

@Test
public void testDeleteMoreUser() {
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    SpecialSQLMapper mapper = sqlSession.getMapper(SpecialSQLMapper.class);
    int result = mapper.deleteMoreUser("8,9,10,11,12");
    sqlSession.commit();
    sqlSession.close();
    System.out.println("影响行数:" + result);
}

7.3、动态设置表名

  • 动态设置表名不能用#{},只能用${}
  • 原因是#{}是占位符,sql语句中 ----> ‘表名’ ,这样写sql语句一定报错。

1 SpecialSQLMapper.java

// 动态设置表名,查询所有的用户信息
List<User> getUserByTableName(@Param("tableName") String tableName);

2 SpecialSQLMapper.xml

<!--List<User> getUserByTableName(@Param("tableName") String tableName);-->
<select id="getUserByTableName" resultType="User">
    select id, username, `password`, age, gender, email
    from ${tableName};
</select>

3 测试

@Test
public void testGetAllUser() {
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    SpecialSQLMapper mapper = sqlSession.getMapper(SpecialSQLMapper.class);
    List<User> list = mapper.getUserByTableName("t_user");
    sqlSession.close();
    list.forEach(System.out::println);
}

7.4、添加功能获取自增的主键

1 使用场景

  • t_clazz(clazz_id,clazz_name)
  • t_student(student_id,student_name,clazz_id)
  • 业务:将一些学生添加到新创建的班级中。
  • 步骤:

1、添加班级信息
2、获取新添加的班级的id
3、为班级分配学生,将某学生的班级id修改为新添加的班级的id

2 mybatis实现

  • useGeneratedKeys:表示当前添加功能使用自增的主键(将自增的主键返回,这个功能需要手动开启)。
  • keyProperty:将添加数据的自增主键赋值给传输的参数user对象的某个属性中(因为增删改返回值是受影响的行数,是固定的)。
  • 这个功能是JDBC的带的。

3 SpecialSQLMapper.java

// 添加用户
int insertUser(User user);

4 SpecialSQLMapper.xml

<!--int insertUser(User user);-->
<insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
    insert into t_user (username, password, age, gender, email)
    values (#{username}, #{password}, #{age}, #{gender}, #{email});
</insert>

5 测试

@Test
public void testInsertUser() {
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    SpecialSQLMapper mapper = sqlSession.getMapper(SpecialSQLMapper.class);
    User user = new User(null, "tianyu", "123", 28, "男", "123@qq.com");
    int result = mapper.insertUser(user);
    sqlSession.commit();
    System.out.println("影响行数:" + result + "主键:" + user.getId());
}

6 JDBC实现

这里只是简写一下

@Test
public void testJDBC(){
    try {
        Class.forName("");
        Connection connection = DriverManager.getConnection("", "", "");
        String sql = "insert into t_user (username, password, age, gender, email) values (?,?,?,?,?)";
        // 默认不允许获取自增主键,设置参数允许获取自增主键
        PreparedStatement ps = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
        // 为占位符传参
        ps.setObject(1,"");
        // 执行sql
        ps.executeUpdate();
        // 接受返回的结果集
        ResultSet resultSet = ps.getGeneratedKeys();
        // 拨动指针
        resultSet.next();
        // 获取id
        int id = resultSet.getInt(1);
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值