mybatis(二)
穷且益坚,不坠青云之志
1.动态 sql 生成
- foreach 循环
 
delete from 表 where id in(1008,1011,1012);
<!-- list (1008,1011,1012, 1013) -->
<delete id="" parameterType="list">
delete  from 表 where id in  
</delete>
  - if where 生成动态sql
 
<where> 能够生成 where 关键字,并去除多余的 and
<if test="条件"> sql 片段 </if>
  -  
对于大于小于条件的处理
方法1: 对每个特殊字符转转义,例如 < <
方法2: <![CDATA[ 内容 ]]> -  
#{ } 与 ${ } 的区别
 
- #{ } 底层是替换为 ?, 只能占位值
 - ${ } 底层是直接拼接字符串, 有注入攻击问题
 - 尽量使用 #{ } , 只有在某些功能不能用 #{ } 实现时(例如排序)采用 ${ }
 
2. Mapper 接口
@Insert @Option
@Update
@Delete
@Select
  原理
// 这个类是使用了 jdk的动态代理技术 在代码运行期间生成的类 
public class $Proxy10 implements StudentMapper{
    private SqlSession sqlSession;
    public $Proxy10(SqlSession sqlSession) {
        this.sqlSession = sqlSession;
    }
    // 其中 sql语句从@Insert注解获得, 参数对象就是student
    public void insert(Student student) {
        sqlSession.insert(sql, 参数对象)
    }
    // 其中 sql语句从@Select注解获得
    public List<Student> findAll() {
        return sqlSession.selectList(sql);
    }
}
  3. Mapper接口不足
1. 接口方法不能直接应用多个方法参数
解决方法:
- 用map传递多个参数, 每个参数对应map中的一个键值对
 - 用@Param注解
 
2. Mapper 接口中不能有方法的重载
定义方法是不要方法名冲突
 异常信息:
### Cause: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: java.lang.IllegalArgumentException: Mapped Statements collection already contains value for 接口名.方法名(重复的)
  3. 使用Mapper接口方式实现动态sql比较复杂
方法1: 结合Mapper接口和xml文件


