而#代表要进行类型转换,是在prepare *** 作之后,实际上是setString方法
你这样直接把$换成#当然不行了
你这个查询正确的写法,${Idstr}的位置应该使用foreach标签,将idStr作为一个集合传入进来,foreach具体用法你查下相关资料就可以了
mybatis自增主键配置:mybatis进行插入 *** 作时,如果表的主键是自增的,针对不同的数据库相应的 *** 作也不同。基本上经常会遇到的就是OracleSequece和Mysql自增主键。主要说明下在mybatis中对于自增主键的配置。1、不返回自增主键值:如果考虑到插入数据的主键不作为其他表插入数据的外键使用,可以考虑这种方式。OracleSequence配置TEST_USERSEQ_TEST_USER_ID.nextval insert into (ID,NAME,AGE) values ( ,#{name}, #{age} ) 当插入语句如上配置时,那么针对如下语句 User user = new User()user.setName("test")user.setAge(24)userMapper.insert(user)System.out.println(user.id)// user.id 为空user.id为空,也就是说如上的配置并不能在完成插入 *** 作后将插入时的主键值存放到保存的对象中。2、Mysql自增主键配置由于mysql数据库中,可以设置表的主键为自增,所以对于Mysql数据库在mybatis配置插入语句时,不指定插入ID字段即可。主键的自增交由Mysql来管理。TEST_USERinsert into (NAME,AGE)values (#{name}, #{age} )同样,针对Mysql如此配置mybaits,插入完成后user.id为空。插入后获取自增主键值:上述的情况能满足大部分情况,但有时候我们会遇到类似一对多的那种表结构,在插入多端数据时,需要获取刚刚保存了的一段的主键。那么这个时候,上述的配置就无法满足需要了。为此我们需要使用mybatis提供的来单独配置针对自增逐渐的处理。1、OracleSequence配置:TEST_USER SEQ_TEST_USER_ID.nextvalselect from dual insert into (ID,NAME,AGE) values ( #{id}, #{name}, #{age} ) 当使用了后,在实际的插入 *** 作时,mybatis会执行以下两句SQL:select SEQ_TEST_USER_ID.nextval from dual// 语句1 insert into (ID,NAME,AGE) values ( ?, ?, ? )// 语句2在执行插入 语句2 之前,会先执行 语句1 以获取当前的ID值,然后mybatis使用反射调用User对象的setId方法,将 语句1 查询出的值保存在User对象中,然后才执行 语句2 这样就保证了执行完插入后User user = new User()user.setName("test")user.setAge(24)userMapper.insert(user)System.out.println(user.id)// user.id 不为空user.id是有值的。2、Mysql自增主键配置针对于Mysql这种自己维护主键的数据库,可以直接使用以下配置在插入后获取插入主键,TEST_USER insert into ( NAME, AGE ) values ( #{name}, #{age} ) 当然,由于Mysql的自增主键可以通过SQL语句select LAST_INSERT_ID()来获取的。因此针对Mysql,Mybatis也可配置如下:TEST_USERSELECT LAST_INSERT_ID() insert into (ID,NAME,AGE) values ( #{id}, #{name}, #{age} ) 只不过该中配置需要额外的一条查询SQL小结当数据插入 *** 作不关心插入后数据的主键(唯一标识),那么建议使用 不返回自增主键值 的方式来配置插入语句,这样可以避免额外的SQL开销.当执行插入 *** 作后需要立即获取插入的自增主键值,比如一次 *** 作中保存一对多这种关系的数据,那么就要使用 插入后获取自增主键值 的方式配置.把Idstr foreach:WHERE id IN
<foreach collection="Idstr " item="item" open="(" close=")" separator=",">
#{item}
</foreach>
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)