谈一下思考,关于mybatis中<foreach collection="list">中list得来的原因 没看到官方说明

<foreach> 是在sql语句中进行多个id查询 时用到的,因为mybatis代替jdbc和hibernate, 使用 在xml文件中编写sql语句,这是一个标签文件.然后在 dao层?,用sqlSession.来调用这个写好的sql语句.

有时候我想会不会jdbc更简单一些??

然后,在xml中写sql语句,会碰到根据条件或者模糊查询,这个时候需要接收来自dao层的 查询条件参数.此时需要在xml文件中的sql语句中接收,并且应该没有接收,只是确定有几个占位符,等到预编译之后,再在dao层中为占位符传参数值??

不是的,dao层在调用xml中的sql语句的同时就已经传过去条件参数,只不过只能传递一个参数,所以就要用到封装,所以就会产生collection属性 是一个单参数,或者一个集合.

内部是不是预编译 ,不知道.但是反过来jdbc中为什么要预编译再传值呢,好处在哪里,然后再看这里是否内部也需要如此???

 

DBAccess dbAccess = new DBAccess();
    SqlSession sqlSession = null;
    try {
        sqlSession = dbAccess.getSqlSession();
        //通过        sqlSession执行sql语句
         sqlSession.delete("Message.deleteBatch",ids);
         //为什么DAO层这样就可以
         sqlSession.commit();//jdbc是自动提交,但是mybatis中不是自动提交的
         

 

  <delete id="deleteBatch" parameterType="java.util.List">
    DELETE FROM message WHERE id in (
            <foreach collection="list" item="item" separator=",">
            #{item}
            </foreach>
        
    )
  </delete>

 

 

所以此时要用到mybatis中的OGNL语言,也就是 <foreach>语句,接收条件参数放在sql语句中(在xml中)

用在in后的括号里,其实括号都可以不写,看到过相关的文档,因为foreach中有开始和结束的属性,当然有括号简便.

 

<delete id="deleteOne" parameterType="int">
    DELETE FROM message WHERE id = #{_parameter}
  </delete>
  
  <delete id="deleteBatch" parameterType="java.util.List">
    DELETE FROM message WHERE id in (
            <foreach collection="list" item="item" separator=",">
            #{item}
            </foreach>
        
    )
  </delete>

但是对比只有一个参数的查询sql语句,可以看到<foreach>的作用只是在xml中实现遍历.

但是可以看到,传参数的时候,xml中接收到的参数都是其类型,没有参数,由于只有一个参数,所以不需要写参数,就用默认的_parameter或者item 表示传入的虚参数.完全没有问题.

最大的原因就是只有一个参数,简化所有....原来是一种简化.

#{} 这个是OGNL表达式?,代表传入的参数,那么为什么要用这个表达式呢,表明它是一个参数变量吗,便于区分??

posted on 2016-07-13 01:52 雪的心 阅读(...) 评论(...) 编辑 收藏

导航